2014-11-20 4 views
0

내 코드에 대한 당신의 의견을 듣고 싶습니다. 어떤 주사에도 충분히 안전합니다. 답장을 보내 주셔서 감사합니다.내 PDO INSERT가 안전합니까?

class Product extends DB { 

    public function __construct() { 
    $db = $this->DB(); 

    if(isset($_POST['productName'])) { 
     foreach ($_POST as $key => $value) { 
      if (ini_get('magic_quotes_gpc')) 
       $_POST[$key] = stripslashes($_POST[$key]); 
       $_POST[$key] = htmlspecialchars(strip_tags($_POST[$key])); 
     } 
     $this->AddProduct(); 
    } 
    } 

    public function AddProduct() { 
    $sSQL = "INSERT INTO ".PREFIX."product (productName, productPrice) 
       VALUES (:productName,:productPrice)"; 
    $query = $this->db->prepare($sSQL); 
    $query->execute(array(
     ":productName" => $_POST['productName'], 
     ":productPrice" => $_POST['productPrice'] 
    )); 
    } 
} 
+0

매개 변수화 된 쿼리를 올바르게 사용하고있는 것으로 보입니다. 따라서 SQL 주입 (PDO 자체의 버그 제외)으로부터 보호됩니다. – ceejayoz

+0

답장을 보내 주셔서 감사합니다. – Falco

답변

3

쿼리 매개 변수를 사용하면 SQL 주입 취약점을 방지 할 수 있습니다.

htmlspecialchars 및 strip_tags를 호출하는 코드는 SQL 삽입과 관련이 없습니다. Cross-Site Scripting 취약점을 방지하기 위해 필요할 수 있지만 별도의 문제입니다. 데이터베이스에 데이터를 삽입 할 때 이러한 단계를 수행하지 않는 것이 좋습니다. HTML로 출력 할 때 XSS 취약점을 필터링하십시오. 그렇지 않으면 문자 그대로 & 개의 시퀀스가 ​​데이터베이스에 저장되며 너무 이른 것입니다. 매번 HTML로 표시하기 위해 반드시 데이터를 사용할 필요는 없습니다. 입력 할 때가 아니라 출력 할 때 인코딩하면됩니다.

나는 가능한 magic_quotes_gpc를 보충하는 것을 결코 고생하지 않는다. 앱을 배포 할 때 테스트하고 배포를 중단합니다. PHP 인스턴스가 2014 년에 magic_quotes_gpc를 설정하는 것은 유효하지 않습니다.

+0

당신의 똑똑한 대답에 감사드립니다. magic_quotes_gpc는 내가 로컬 시스템에 있기 때문에 설정되지만 귀하의 발언을 이해합니다. 그러나 예를 들어 JS 삽입에 대해서는 데이터를 데이터베이스에 삽입하기 전에 strip_tags를 사용하지 않는 것이 좋습니다. 내 데이터베이스에 다음 JS 코드가있을 것입니다? – Falco

+1

"그렇다면 데이터베이스에 JS 코드가 생깁니 까?" 네, 괜찮습니다. 삽입면이 아닌 표시면에서 이러한 사항을 처리해야합니다. 이렇게하면 이스케이프 처리에서 예기치 않은 결과가 발생할 수있는 상황을 방지 할 수 있습니다. 삽입시 이탈하면 사용자의 원래 제출을 잃어 버리게됩니다. 출력물에서 탈출하면 즉시 이스케이프를 조정하여 항상 작동하게 할 수 있습니다. – ceejayoz

+0

오 오케이 지금 당장 이해합니다. 나는 데이터베이스의 "아름다움"에 대해 앞으로 초점을 맞추지 않을 것입니다. 답장을 보내 주셔서 다시 한번 감사드립니다. – Falco

관련 문제