2012-05-11 89 views
-2

可能重複:
Are mysql_real_escape_string() and mysql_escape_string() sufficient for app security?此PHP代碼是否可被利用?

所以基本上我有一個qryName在URL

如:mysite.com/qryName=WHAT

if (isset($_GET['qryName'])) 
{ 
    $qryName = mysql_real_escape_string(filter($_GET['qryName'])); 
} 

$urldata = mysql_fetch_assoc(mysql_query("SELECT * FROM gangs WHERE ShortName = '" . $qryName . "' LIMIT 1")); 

$ urldata是代碼,所以它幾乎從數據庫中選擇酶。請注意,在數據庫中,qryName沒有空格,特殊字符等。

想知道這是否可被利用?

+0

http://codereview.stackexchange.com/ – CodeCaster

+2

學習PDO。由於安全問題,mysql_ *函數被正式棄用。 – itachi

+0

@itachi請在這種情況下顯示mysql_real_escape_string()是不安全的 –

回答

1

它是安全的,因爲你正確轉義值 - 除非....

...你不初始化變量啓用register_globals。在這種情況下,有人可以使用cookie或POST值向您發送包含邪惡SQL語句的任意值$qryName

但是既然您可能只是發佈了一個剪貼板並且做了這個變量之前初始化了那個if聲明(你這樣做吧?),你的代碼是安全的。考慮使用準備語句(使用PDO),而不是轉義 - 它們使您的代碼更具可讀性。

1

你有沒有考慮過使用類似PDO的東西?我的理解是,當使用PDO和綁定變量時,SQL注入是不可能的。還有其他的優點值得考慮。

類似的PDO查詢是:

$data=array($_GET['qryName']); 
    try { 
     $STH = $this->DBH->prepare('SELECT * FROM gangs WHERE ShortName = ? LIMIT 1'); 
     $STH->execute($data); 
     while($row = $STH->fetch()) { 
       $var1=$row->FieldName; 
     } 
    } 
    catch(PDOException $e) {echo $e->getMessage();} 

您的變量,才能在SQL語句添加到陣列($數據),他們都綁定到每個問號。

+0

+1以鼓勵PDO。 – itachi

1

你爲什麼不添加一個額外的一塊驗證或取出isset並檢查它是否只包含例如字母

if(ctype_alpha($_GET['qryName'])) { 

    $qryName = mysql_real_escape_string(filter($_GET['qryName'])); 

} 

http://php.net/manual/en/function.ctype-alpha.php