2011-11-23 3 views
2

저는 아직 PDO를 완전히 배우는 과정에 있지만, SQL Inject URL 매개 변수로 작업 한 경우 오늘 저녁에 확인하면 놀랐습니다. 놀랍게도 작동했습니다. 그래서 나는 생각하기 시작했다. 게시 된 값은 PDO 준비 문을 사용하여 자동으로 위생 처리됩니다. 즉, SQL 쿼리에 문제가 있음을 의미합니다. 맞습니까?PHP PDO가 내 쿼리를 주입으로부터 보호하지 않는 이유는 무엇입니까?

해당 ID를 사용하여 데이터베이스에서 해당 데이터를 수집하려면 GET 변수가 필요한 페이지가 있습니다. 쿼리를 준비하는 기능과 코딩 프로세스를 간소화하기 위해 실행하는 기능을 만들었습니다. 지금 작성한 코드는 다음과 같습니다

$request = $_GET['movie']; 
$sql = "SELECT * FROM `movies` WHERE `url` = '$request'"; 
$db = new database; 
$db->setDBC(); 

$process = $db->executeQuery($sql); 
$cmd = $process->fetch(PDO::FETCH_NUM); 

$title = $cmd[1]; 

내가 얻을 PDO 예외는 다음 URL에 ' or 1-1를 추가 할 때

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''21-31282 ''' at line 1' in C:\xampp\htdocs\filmvote\include\databaseClass.php:33 Stack trace: #0 C:\xampp\htdocs\filmvote\include\databaseClass.php(33): PDOStatement->execute() #1 C:\xampp\htdocs\filmvote\recension.php(9): databaseManagement->executeQuery('SELECT * FROM `...') #2 {main} thrown in C:\xampp\htdocs\filmvote\include\databaseClass.php on line 33

당신은 이런 종류의 오류를 얻을. 이것에 대해 내가 뭘 할 수 있니? 도움에 정말 감사드립니다.

+4

준비된 문 –

답변

13

the posted values are supposed to be sanitized automatically using PDO

아니요. 당신과 같이 실제 준비된 문을 사용하는 경우에만 :

$stmt = $dbh->prepare("SELECT * FROM `movies` WHERE `url` = ?"); 
if ($stmt->execute(array($_GET['movie']))) // <-- This sanitizes the value 
    { 
    // do stuff 
    } 

은 값은 당신이 삽입 자동 살균되며, 쿼리는 SQL 주입으로부터 보호.

그렇지 않으면 SQL 쿼리가 이전 mysql_query()처럼 실행되며 취약합니다. PDO는 쿼리를 수행 한 다음 취약한 부분을 자동으로 소독 할 수 없습니다. 그건 불가능하다.

3

은 준비된 문을 시도해보십시오

$query = $db->prepare("SELECT * FROM `movies` WHERE url = ?"); 
$query->execute(array($request)); 
$result = $query->fetch(PDO::FETCH_ASSOC); 
+0

오 없습니다 즉, 덕분에 많은 당신의 모두! 나는 지금이 일을하고있다. =) – user1062704

관련 문제