mysql_real_escape_string()은 넓은 바이트 및 삽입 문제를 해결할 수 있는 addlashes() 및 mysql_escape_string()에 대한 좋은 대안으로 간주되지만 공식적인 설명은 불분명합니다.
mysql_real_escape_string — 연결의 현재 문자 집합을 고려하여 SQL 문에 사용된 문자열의 특수 문자를 이스케이프합니다.
이 문장이 잘 이해가 안 되네요. 현재 연결 문자 집합이 무엇을 의미하는지 생각해보면 전문가가 자세히 설명해 주실 수 있을까요?
참조:
http://php.net/manual/zh/function.mysql-real-escape-string.php
http://www.cnblogs.com/suihui/archive/2012/ 09/20/2694751.html
http://www.neatstudio.com/show-963-1.shtml
추가 질문: @佢작품작작
1. 추가된 내용은 mysql로 옮겨지지 않아서 ' or 1=1;-- s
를 주입하면 여기에 주입된 내용이 결국 mysql로 옮겨져 실행되는 것 아닌가요? 🎜>참고: https://segmentfault.com/q/1010000005994443
현재 연결의 문자셋을 변경한다는게 무슨 뜻인가요?并考虑到连接的当前字符集
mysql_real_escape_string — 연결의 현재 문자 세트를 고려하여 SQL 문에 사용된 문자열의 특수 문자를 이스케이프합니다.이 문장이 잘 이해가 안 되네요. 현재 연결 문자 집합이 무엇을 의미하는지 생각해보면 전문가가 자세히 설명해 주실 수 있을까요?
참조:
http://php.net/manual/zh/function.mysql-real-escape-string.php
http://www.cnblogs.com/suihui/archive/2012/ 09/20/2694751.html
http://www.neatstudio.com/show-963-1.shtml
1. 추가된 내용은 mysql로 옮겨지지 않아서
를 인젝션하면 여기에 인젝션된 내용이 결국 mysql로 옮겨져 실행되는거 아닌가요? 🎜>참고: https://segmentfault.com/q/1010000005994443' or 1=1;-- s
2.
并考虑到连接的当前字符集
예를 들어, 사용자가 로그인하는 경우 SQL 문이 다음과 같다고 가정합니다.
$sql = "select * from user where user_name='$username' and password='$password'";
1. 주입 지점이 있고 탈출구가 없는 경우. 매개변수 사용자 이름=' 또는 1=1;-- s를 전달하면 이때의 SQL 문은
$sql = "select * from user where user_name='' or 1=1;-- s ' and password='$password'";
--는 주석 문자이므로 나중에 우회 성공 여부를 판단할 필요가 없습니다
2 주입 지점이 존재하고 특수 문자 이스케이프가 사용되는 경우. 그렇다면 이때의 SQL 문은
$sql = "select * from user where user_name='' or 1=1;-- s ' and password='$password'";
우회 불가
3 이때 문제가 발생합니다. 한 멋진 해커가 gbk 인코딩에 wide byte injection이 있다는 것을 발견했습니다. 이때 username=�' 또는 1=1;--
을 전달합니다.이번에 실행된 sql문은 다음과 같습니다.
우회 성공
$sql = "select * from user where user_name='運' or 1=1;-- s ' and password='$password'";
이 문제를 해결하는 방법
mysql_real_escape_string — 연결의 현재 문자 집합을 고려하여 SQL 문에 사용된 문자열의 특수 문자를 이스케이프합니다.
메서드에 의한
문의 이스케이프 메커니즘은 현재 데이터베이스 연결의 문자 집합이 변경됨에 따라 변경됩니다. 동일한 mysql_real_escape_string
문의 경우 이스케이프된 결과는 다른 문자 집합에서 동일하지 않을 수 있습니다. SQL
SQL
중요:
버전 mysql_real_escape_string
이후 사용되지 않는 것으로 표시되어 mysql
버전 PHP
이후 제거된 5.5.0
확장에 속합니다. 데이터베이스 작업에는 PHP
또는 7
확장자를 사용하세요. 데이터베이스 문자 집합에는 mysqli
또는 PDO
(더 좋음)을 사용해 보세요. utf8