6.1.7 클라이언트 프로그램의 보안 지침
MySQL에 액세스하는 응용 프로그램은 사용자가 입력 한 모든 데이터를 신뢰하지 않도록하십시오. 사용자는 Web 폼, URL 또는 구축 된 모든 애플리케이션에 특수 문자 나 이스케이프 문자 시퀀스를 입력하여 코드를 속이는 것을 시도 할 수 있습니다. 사용자가 " ; DROP DATABASE mysql;
"와 같은 입력을 행해도 응용 프로그램이 안전한 상태로 유지되도록하십시오. 이것은 극단적 인 예이지만, 유사한 기술을 사용하는 해커에 대비하지 않으면 결과적으로 대규모 보안 누수 및 데이터 손실이 발생할 수 있습니다.
자주 실수는 문자열 데이터 값만을 보호하는 것입니다. 수치 데이터도 잊지 말고 점검하십시오. 사용자가 234
이라는 값을 입력하면 응용 프로그램이 SELECT * FROM table WHERE ID=234
과 같은 쿼리를 생성하는 경우, 사용자는 234 OR 1=1
이라는 값을 입력하여 SELECT * FROM table WHERE ID=234 OR 1=1
이라는 쿼리를 응용 프로그램에 생성 할 수 있습니다. 그 결과, 서버는 테이블의 모든 행을 가져옵니다. 이것은 모든 행을 공개하고 서버에 과부하가 걸립니다. 이 유형의 공격으로부터 보호하기위한 가장 간단한 방법은 숫자 상수를 작은 따옴표를 사용하여 SELECT * FROM table WHERE ID='234'
로하는 방법입니다. 사용자가 추가 정보를 입력하면 해당 정보는 모든 문자열의 일부입니다. 수치 맥락에서, MySQL은 자동으로이 문자열을 숫자로 변환하고 이후의 숫자가 아닌 모든 문자를 제거합니다.
데이터베이스에 저장되어있는 데이터가 공개되는 것뿐이면 보호는 불필요하다고 생각 될 수도 있습니다. 이것은 올바르지 않습니다. 데이터베이스에서 임의의 행 표시가 허용되는 경우에도 서비스 거부 공격 (이전 절 기술을 기반으로 서버에 자원을 낭비하는 것 등)으로부터 보호해야합니다. 그렇지 않으면 서버는 합법적 인 사용자에게 응답 할 수 없게됩니다.
검사 목록 :
엄격한 SQL 모드를 사용하여 서버가 받아들이 데이터 값의 제한을 엄격히하도록 서버에 지시합니다. 섹션 5.1.7 "서버 SQL 모드" 를 참조하십시오.
모든 Web 폼에 작은 따옴표 또는 큰 따옴표 ( "
'
"와""
")를 입력 해 봅니다. 어떤 종류의 MySQL 에러가 나오는 경우 즉시 문제를 조사하십시오.동적 URL 두
%22
( ""
"),%23
( "#
") 및%27
( "'
")를 추가하여이를 변경하려고합니다.이전 예제와 문자를 사용하여 동적 URL 데이터 형식을 숫자에서 문자로 변경하려고합니다. 이러한 공격과 유사한 공격에 응용 프로그램이 안전하도록합니다.
숫자 필드에 숫자가 아닌 문자, 공백 및 특수 문자를 입력 해보십시오. 응용 프로그램은 이들을 MySQL에 전달하기 전에 이들을 제거하거나 오류를 생성합니다. 검사되지 않은 값을 MySQL에 전달하는 것은 매우 위험합니다.
데이터를 MySQL에 전달하기 전에 데이터의 크기를 점검하십시오.
응용 프로그램이 데이터베이스에 연결할 때 관리 목적으로 사용하는 것과 다른 사용자 이름을 사용하도록하십시오. 응용 프로그램에 불필요한 권한을 부여하지 마십시오.
많은 응용 프로그램 프로그래밍 인터페이스는 데이터 값의 특수 문자를 이스케이프하는 수단을 제공합니다. 적절하게 사용하면 이로 인해 의도와는 다른 효과를 가진 문을 응용 프로그램에 생성시키는 값을 응용 프로그램 사용자가 입력 할 수 없도록 할 수 있습니다.
MySQL C API :
mysql_real_escape_string()
API 호출을 사용하십시오.MySQL ++ : 쿼리 스트림에
escape
및quote
한정자를 사용하십시오.PHP :
mysqli
또는pdo_mysql
확장자를 사용하여 기존ext/mysql
확장자를 사용하지 마십시오. 권장되는 API는 플레이스 홀더를 가질 준비 진술 외에, 개선 된 MySQL 인증 프로토콜 및 암호를 지원합니다. Choosing an API 참조하십시오.이전
ext/mysql
확장자를 사용할 필요가있는 경우 탈출을 위해,mysql_real_escape_string()
함수를 사용하여mysql_escape_string()
또는addslashes()
를 사용하지 마십시오. 이것은mysql_real_escape_string()
만 문자 집합을 인식하고 다른 함수는 (잘못된) 멀티 바이트 문자 집합을 사용했을 때 "우회"가능성이 있기 때문입니다.Perl DBI : 플레이스 홀더 또는
quote()
메소드를 사용하십시오.Ruby DBI : 플레이스 홀더 또는
quote()
메소드를 사용하십시오.Java JDBC :
PreparedStatement
오브젝트 및 플레이스 홀더를 사용하십시오.
다른 프로그래밍 인터페이스에도 비슷한 기능을 가지고있는 경우가 있습니다.