2012-06-16 49 views
4

我只想驗證在MySQL中使用預準備語句是否可以防止SQL注入。在MySQL中使用預準備語句是否防止SQL注入攻擊?

以下代碼是否會阻止所有SQL注入攻擊?

$var = $_GET['q']; 
$trimmed = trim($var); 
if ($trimmed != NULL) { 
    $get_fighters = $DBH->prepare(
    'SELECT * 
    FROM fighters 
    WHERE name LIKE :searchTerm 
     OR nickname LIKE :searchTerm 
     OR born_in_city LIKE :searchTerm 
     OR born_in_state LIKE :searchTerm 
     OR born_in_country LIKE :searchTerm 
     ORDER BY name ASC'); 
    $get_fighters->bindValue(':searchTerm', '%' . $trimmed . '%', PDO::PARAM_STR); 
    $get_fighters->setFetchMode(PDO::FETCH_ASSOC); 
    $get_fighters->execute(); 
    $check_results_fighters = $get_fighters->rowCount(); 

    $get_events = $DBH->prepare(
    'SELECT * 
    FROM events 
    WHERE event_name LIKE :searchTerm 
     OR event_arena LIKE :searchTerm 
     OR event_city LIKE :searchTerm 
     OR event_state LIKE :searchTerm 
     OR event_country LIKE :searchTerm 
     OR organization LIKE :searchTerm 
    ORDER BY event_date DESC'); 

    $get_events->bindValue(':searchTerm', '%' . $trimmed . '%', PDO::PARAM_STR); 
    $get_events->setFetchMode(PDO::FETCH_ASSOC); 
    $get_events->execute(); 
    $check_results_events = $get_events->rowCount(); 
} 
+2

可能重複[在PHP中防止SQL注入的最佳方法](http://stackoverflow.com/questions/60174/best-way-to-prevent-sql-injection-in-php) – outis

+0

從['PDO :: prepare']( http://php.net/PDO.prepare)docs:「在準備好的語句中,不能使用兩次具有相同名稱的命名參數標記。」 (雖然在某些版本的PHP中使用PDO/MySQL驅動程序模擬準備好的語句確實支持重複的名稱,但依靠此名稱並不安全;另請參閱[「php pdo準備重複變量」](http://stackoverflow.com/q/7603896 /)。)始終RTM。 – outis

+0

eeek ..這是否意味着我必須爲每個單獨的參數執行searchTerm1,2,3,4等...儘管它們都具有相同的值? – zen

回答

6

準備好的查詢阻止攻擊通過分離查詢被運行,並且使用該查詢的數據。這意味着不會發生一階攻擊,因爲您並不直接將數據連接到查詢中。簡而言之,如果您始終使用準備好的查詢,並且您的所有數據都使用綁定參數(包括來自其他查詢的數據!)發送,那麼就SQL注入而言,您沒有問題。

(我也應該注意到,一些PDO驅動不支持準備查詢將假貨與傳統的逃生程序服務器。不要爲此擔心自己,它是安全的。)的

+0

好酷。謝謝! – zen

3

是的,使用預處理語句將根據php文檔防止SQL注入。

Link

+0

謝謝你! – zen

相關問題