를 바라고, 나는 발견했습니다
http://dev.mysql.com/doc/refman/5.1/en/news-5-1-11.html
보안 수정 :
다중 바이트 인코딩 처리에서 SQL 주입 보안 홀을 발견했습니다. 서버에 버그가있어 mysql_real_escape_string() C API 함수로 이스케이프 된 문자열을 잘못 파싱했습니다.
이 취약점은 Josh Berkus와 Tom Lane이 OSDB 컨소시엄의 프로젝트 간 보안 공동 작업의 일부로 발견하여보고했습니다. SQL 삽입에 대한 자세한 내용은 다음 텍스트를 참조하십시오.
토론. 멀티 바이트 인코딩 처리에서 SQL 주입 보안 구멍이 발견되었습니다. SQL 주입 보안 구멍은 사용자가 데이터베이스에 삽입 할 데이터를 제공 할 때 사용자가 서버가 실행할 데이터에 SQL 문을 삽입 할 수있는 상황을 포함 할 수 있습니다. 이 취약점과 관련하여 문자 집합 비 인식 이스케이프 (예 : PHP의 addslashes())를 사용하면 일부 멀티 바이트 문자 집합 (예 : SJIS, BIG5 및 GBK)에서 이스케이프를 무시할 수 있습니다. 결과적으로 addslashes()와 같은 함수는 SQL 주입 공격을 방지 할 수 없습니다. 이 문제를 서버 측에서 해결하는 것은 불가능합니다. 가장 좋은 해결책은 응용 프로그램이 mysql_real_escape_string()과 같은 함수가 제공하는 문자 집합 인식 이스케이프를 사용하는 것입니다.
그러나 MySQL 서버가 mysql_real_escape_string()의 출력을 구문 분석하는 방법에서 버그가 발견되었습니다.결과적으로 문자 집합 인식 함수 mysql_real_escape_string()이 사용 된 경우에도 SQL 삽입이 가능했습니다. 이 버그가 수정되었습니다.
해결 방법. mysql_real_escape_string() 구문 분석에서 버그 수정을 포함하지만 MySQL 5.0.1 이상을 실행하는 버전으로 MySQL을 업그레이드 할 수없는 경우 해결 방법으로 NO_BACKSLASH_ESCAPES SQL 모드를 사용할 수 있습니다. (이 모드는 MySQL 5.0.1에서 추가되었습니다.) NO_BACKSLASH_ESCAPES는 백 슬래시가 특수 문자로 간주되지 않는 SQL 표준 호환성 모드를 지원합니다. 결과는 쿼리가 실패하게됩니다.
SET GLOBAL sql_mode='NO_BACKSLASH_ESCAPES';
이 SQL 모드도 될 수 있습니다
SET sql_mode='NO_BACKSLASH_ESCAPES';
또한 모든 클라이언트에 대해 전 세계적으로 모드를 설정할 수 있습니다
입력, 현재 연결에 대해 다음 SQL 문을이 모드를 설정하려면 --sql-mode = NO_BACKSLASH_ESCAPES 명령 줄 옵션을 사용하거나 서버 옵션 파일 (예 : 시스템에 따라 my.cnf 또는 my.ini)에서 sql-mode = NO_BACKSLASH_ESCAPES를 설정하여 서버가 시작될 때 자동으로 활성화됩니다. . (Bug # 8378, CVE-2006-2753)
버그 # 8303도 참조하십시오.
+1 MySQL 클래스를 직접 작성하고 매개 변수 바인딩 목적으로 mysql_real_escape_string()을 사용합니다. 나는 mysqli를 사용하는 것을 피한다. 나 또한 다중 파일 및 다중 클래스 라이브러리를 피하십시오. 내가 필요로하는 것은 단정하고 깨끗한 단일 클래스입니다. 고맙습니다! – Viet
http://ca2.php.net/manual/en/function.addslashes.php – mpen
+1. 나의 유스 케이스는 SugarCRM APi로, API를 통해 SQL의 단편을 원격 SugarCRM 인스턴스로 푸시해야한다. 불쾌하지만, 그것이 내가 함께 일해야만하는 것입니다 (SugarCRM 개발자 헤드를 함께 노크하십시오). API를 사용하는 응용 프로그램에서 SQL의 문자열을 이스케이프해야하며 이는 SugarCRM 인스턴스 뒤의 데이터베이스와 완전히 별개입니다. – Jason