몇일 전, 웹사이트가 인젝션되었습니다. 이제 SQL 인젝션을 방지하기 위해 PHP에 내장된 여러 처리 기능을 소개하겠습니다. 예를 들어 PHP의 MySQL 작업 기능에는 addlashes(), mysql_real_escape_string(), mysql_escape_string()이 있습니다. ) 대기 함수
구체적인 사용법: SQL 주입 방지를 위한 추가 래시
국내 PHP 프로그래머 중 상당수가 여전히 SQL 주입 방지를 위해 추가 래시에 의존하고 있지만, SQL 주입 방지를 위해 모두가 검사를 강화하는 것이 좋습니다. 중국인. addlashes의 문제는 해커가 0xbf27을 사용하여 작은따옴표를 대체할 수 있는 반면, addlashes는 0xbf27을 0xbf5c27로만 변경하므로 유효한 멀티바이트 문자가 됩니다. 0xbf5c는 여전히 작은따옴표로 간주되므로 addlashes가 성공적으로 차단할 수 없습니다.
물론 addlashes는 쓸모가 없습니다. 다중 바이트 문자의 경우 mysql_real_escape_string을 사용하세요.
또한 PHP 매뉴얼의 get_magic_quotes_gpc 예에서는 코드는 다음과 같습니다:
function post_check($post)
{ _quotes_gpc is Open 🎜> $ post = str_replace("_ ", "_" , $post); // '_' 필터링
$post = str_replace("%", "%", $post) // '_' 필터링 ' % ' 필터링 > $ 반환 post;
function inject_check($sql_str) { { return eregi('select|insert|update|delete|'| function verify_id($id= null) { if (!$id) {exit('매개변수가 제출되지 않았습니다! '); } // 비어 있는지 여부 판단 elseif (inject_check($id)) { exit('제출된 매개변수가 불법입니다!') } // 주입 판단 elseif (! is_numeric($id)) { exit('제출된 매개변수가 불법입니다!') } // 수치 판단 $id; 특수 문자는 연결의 현재 문자 집합을 고려하여 이스케이프 처리되므로 안전합니다. mysql_query()와 함께 사용합니다.참고: mysql_real_escape_string()은 % 및 _을 이스케이프하지 않습니다.mysql_real_escape_string, 예#1 mysql_real_escape_string() 예, 코드는 다음과 같습니다.& lt;? PHP
$ item = "zak과 derick의 노트북"; escapd_item = MySQL_Real_escape_String ($ item ) printf ( "이스케이프된 문자열: %sn" , $escaped_item ); //위의 예는 다음 출력을 생성합니다. //이스케이프된 문자열 : Zak's and Derick's Laptop mysql_escape_string이 함수는 unescaped_string을 이스케이프하여 mysql_query()에서 안전하게 사용할 수 있도록 합니다.
참고: mysql_escape_string()은 % 및 _을 이스케이프하지 않습니다. 이 함수는 mysql_real_escape_string()이 연결 핸들을 받아들이고 현재 문자 집합에 따라 문자열을 전송한다는 점을 제외하면 mysql_real_escape_string()과 완전히 동일합니다. mysql_escape_string()은 연결 매개변수를 허용하지 않으며 현재 문자 세트 설정에 신경 쓰지 않습니다.
예제 1. mysql_escape_string() 예, 코드는 다음과 같습니다.
$item = "Zak의 노트북";
$escaped_item = mysql_escape_string($item);
printf("이스케이프된 문자열: %sn", $escaped_item); >
? > //출력: //이스케이프된 문자열: Zak's Laptop mysql_real_escape_string과 mysql_escape_string의 차이점: mysql_real_escape_string은 (PHP 4 >= 4.3.0, PHP 5)에 있어야 하며, 그렇지 않으면 mysql_escape_string만 사용할 수 있습니다. 둘 사이의 차이점은 mysql_real_escape_string은 연결의 현재 문자 집합을 고려하지만 mysql_escape_string은 고려하지 않습니다. . 판단을 통해 종합적으로 처리할 수 있으며 코드는 다음과 같습니다. function cleanuserinput($dirty){ if (get_magic_quotes_gpc()) {$clean = mysql_real_escape_string(stripslashes ($dirty)); }else{ $clean = mysql_real_escape_string($dirty)
return $clean;
}
요약하자면: * addlashes()는 강제 추가입니다. * mysql_real_escape_string()이 문자 집합을 결정하지만 PHP 버전에 대한 요구 사항이 있습니다. * mysql_escape_string은 연결의 현재 문자 집합을 고려하지 않습니다.