2011-09-03 3 views
1

그래서 MySQLi 확장을 지원하기 시작했습니다. 장래에 MySQLi 확장이 지원 될 것이라고 들었습니다. 사용하는 대신 그것에 대해 읽었습니다. mysql_real_escape_string()prepare()을 사용해야합니다. 예를 들어, 쿼리에서 $ _GET 또는 $ _POST를 사용할 때입니다.MySQLi 준비는 보안상의 이유로 이루어집니다?

사실입니까? 나는 prepare()가 매개 변수를 변경할 수있는 SQL 쿼리 템플릿을 만드는 데 좋다는 것을 알았다. 따라서 스크립트는 SQL 수준에서도 동적 일 수 있습니다. 정말 유용합니다. 그러나 나는 보안 조치에 대한 실질적인 정보를 찾을 수 없다. 그것은 정말로 악한 것들을 피하고 주사로부터 보호합니까? 아니면 프로그래밍 수준에서 처리해야합니까?

예를 들어,이 코드는 안전합니까? 알 수 있듯이 $_GET을 사용하여 템플릿을 작성하면 MySQLi 준비가 제대로 작동하지 않는다면 정말 위험 할 수 있습니다. 그들은 SQL 구문 분석 후 서버에 제공받을 때문에

$stmt = $mysqli->prepare('SELECT description,title FROM menu WHERE name = ?'); 

$stmt->bind_param('s', $n); 

$n = $_GET['b']; 

$stmt->bind_result($meta_description,$meta_title); 
$stmt->execute(); 

답변

3

준비 매개 변수는 그들이 SQL 주입 공격의 기지 SQL 조각으로 해석 될 수있는 방법 주사에 면역하여 예 없습니다.

$_GET['b'] 변수에 name 데이터베이스 필드와 비교하기 위해 서버가 사용됩니다 무엇이든 당신의 예에서

하지만 절대적으로 NO WAY 서버가 부울 식, 끝으로 그 텍스트를 해석 속아서 수 없었다 있다 ...

그래서 설계 상 SQL 인젝션 공격 표면을 제공하지 않으므로 준비된 문을 사용하면 모든 종류의 이스케이프 및 입력 스크러빙 스키마보다 훨씬 우수합니다.

+2

클라이언트와 서버에 대한 작업이 줄어들고 데이터를 이스케이프 및 이스케이프 처리하는 데 시간을 소비 할 필요가 없기 때문에 일반적으로 빠른 코드에서 자리 표시 자 결과가있는 준비된 문을 사용하여 추가하고 싶습니다. 또한 서버는 준비 될 때만 SQL 문을 구문 분석합니다. 여러 쿼리에 사용하면 그 이후에 더 빠릅니다. – snap

+0

빠른 답변 주셔서 감사합니다! :) –