2013-08-07 64 views
0

我問這個問題,因爲我還不太清楚,如果過濾器$ _ GET變量足以防止MySQL的注入,所以一開始我有一個過濾功能過濾器url後需要mysqli-> real_escape_string嗎?

function filter_url($url) 
{ 
    if (is_array($url)) 
    { 
    foreach ($url as $key => $value) 
    { 
     // recurssion 
     $url[$key] = filter_url($value); 
    } 
    return $url; 
    } 
    else 
    { 
    // remove everything except for a-ZA-Z0-9_.-&= 
    $url = preg_replace('/[^a-zA-Z0-9_\.\-&=]/', '', $url); 
    return $url; 
    } 
} 

我有$_GET=filter_url($_GET);每次我打電話之前

$filter_case =isset($_GET['product_ID'])?"and product_ID={$_GET['product_ID']}":""; 

我需要做$mysqli->real_escape_string($_GET['product_ID'])?如果我仍然要暗示它,什麼樣的SQL注入將超過我的查詢方法?

另外,做$mysqli->real_escape_string($_SESSION['member_ID'])我認爲是否有人可以操縱他的$_SESSION變量?

回答

0

這實質上是錯誤的問題。

將字符串文字添加到SQL查詢中時需要$mysqli->real_escape_string在這種情況下,無論字符串來源或驗證如何,您都需要使用此函數在任何其他情況下(即字符串不在查詢或不作爲SQL字符串)此功能將絕對無用。

這就是爲什麼使用準備好的語句必不可少的原因或模擬。

+0

我同意:準備好的語句是針對SQL注入的解決方案,可以在所有情況下工作。 – RandomSeed

+0

現在我看到準備好的聲明有自動轉義,我錯過了,因爲沒有滾動到手冊的末尾。將我的代碼改爲準備好的語句! :) – Anonymous