2012-02-23 1 views
0

가능한 중복 :
How prepared statements can protect from SQL injection attacks?

나는 아직도 그것을 탈출해야합니까 PDO와 $ _GET을 사용하고 있다면? 내 이해는 SQL 주입에 면역성이있다. 그러나 나는 여전히 그것을 빠져 나가지 않는 것에 대해 불안하다. 그래서 누군가가이 작은 코드 블록을보고 그것이 안전한지 말해 줄 수 있습니까?

<?php 
$hostname = 'localhost'; 
$username = 'root'; 
$password = 'root'; 
$database = 'database'; 
try { 
    $dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $stmt = $dbh->prepare("SELECT * FROM comments WHERE pid = :pid"); 
    $pid = $_GET['pid']; 
    $stmt->bindParam(':pid', $pid, PDO::PARAM_STR); 
    $stmt->execute(); 
    $result = $stmt->fetchAll(); 
    } 
catch(PDOException $e) 
    { 
    echo $e->getMessage(); 
    } 
    $stmt->execute(); 
    echo $stmt->rowCount(); 
$dbh = null; 
?> 

다시 말하면, 내가 걱정하는 것은 $ _GET입니다. 도움이된다면 고맙습니다.

+3

준비된 쿼리를 위해 변수를 이스케이프해야하는 경우 준비가 거의 필요하지 않습니다. – zerkms

+0

즉, 준비된 문구 자리 표시 자로 원하는 것을 채우십시오. DB는 이스케이프를 처리합니다. 그 데이터는 어디서 왔는지. –

+0

탈출로 인해 "데이터"가 안전하지 않다는 것을 이해하는 사람에게는 아주 재미있는 불안감이 있습니다. –

답변

2

예, 준비된 명령문 기능은 말하는대로 작동합니다. 그러나 당신이 물었 기 때문에 그것이 이야기의 끝이 아니라는 것을 분명히하자. 나는 OWASP Top Ten Application Security Risks 2010을보고있다.

  • 가 데이터에 액세스 할 권한이 모든 원격 사용자는 모든 PID와 연관된

    예 :

    ? 그렇지 않은 경우 OWASP 2010-A4-Insecure Direct Object References의 명확한 예가 사용자에게 승인되었는지 확인하지 못합니다.

  • OWASP 2010-A7-Insecure Cryptographic Storage의 명확한 예이기 때문에 암호를 일반 텍스트로 하드 코딩하는 것은 중요하지 않습니다.
  • rowcount를 반향하는 것과 별개로 $ stmt를 사용하여 수행 할 작업을 말하지 않지만 데이터베이스의 내용을 표시하는 경우 HTML 엔터티를 먼저 이스케이프 처리해야합니다. 그렇지 않으면 OWASP 2010-A2-XSS (Cross-Site Scripting)의 명확한 예를 만들 수 있습니다.
  • 그런데 일반적으로 "SELECT *"보다는 명시 적으로 열 (또는 집계 함수)을 지정하는 것이 좋습니다.
+0

고마워, 나는 지금 그 목록을 샅샅이 뒤질거야. – Ian