2011-11-01 101 views
1

我正在優化一個使用ADODBforPHP的平臺。我使用了一個消毒功能,避免了先前版本的PHP(mysql_escape_string)的SQL注入,這些顯然不再受支持或推薦。在Adodb for PHP中對SQL查詢進行消毒輸入

對於那些沒有使用的圖書館,它是這樣的:

$rs = $cnn->Execute('SELECT * FROM user WHERE id_user='.q($_GET['id'])); 

示例更新某些行時:

$record = array(); 
$record['name'] = q($_GET['name']); 
$record['last_update'] = time(); 
$rsProfile = $cnn->Execute('SELECT * FROM user WHERE id_user='.q($_GET['id'])); 
$sql = $cnn->GetUpdateSQL($rsProfile,$record); 
if($sql) $cnn->Execute($sql);        

在這種情況下,Q($字符串)是消毒功能,我試圖改善。我沒有權限在這臺服務器上安裝PDO,所以這不是一個選項。

當前的Q()使用mysql_real_escape_string沒有第二個參數:

function q($data) { 
    if(!empty($data) && is_string($data)) { 
     $data = str_replace(array('\\', "\0", "\n", "\r", "'", '"', "\x1a"), array('\\\\', '\\0', '\\n', '\\r', "\\'", '\\"', '\\Z'), $data); 
     $data = "'".$data."'"; 
    } 
    return $data; 
} 

有人建議filter_var($值,FILTER_SANITIZE_STRING)在另一個論壇,但老實說,我沒有使用過,對於這些問題。

關於如何提高此功能的安全性的任何建議?

更新1

function q($data) { 
    if(is_string($data)) { 
     return "'".mysql_real_escape_string($data)."'"; 
    } elseif(is_numeric($data) || is_bool($data)) { 
     return $data; 
    } else { 
     return "''"; 
    } 
} 
+1

什麼是使用str_replace函數點?爲什麼不使用mysql_escape_string? –

+1

mysql_escape_string已經過時,不再支持。另外,您可以使用%27來利用該功能。解決方案是mysql_real_escape_string,但是需要第二個參數(可選,但是如果它爲null,它會嘗試生成一個mysql連接 - 所以根據我的觀點,它使用了一些額外的資源) – andufo

+0

duh。你不能利用你自己的str來代替這種方式? –

回答

1

我很抱歉讓你失望,但是你的消毒功能,無論它做什麼,都不會「淨化」任何東西,並且你在這裏發佈的代碼中有可能注射。
只是打電話給你的腳本這樣

code.php?id=1 union select password from users where id=1 

,看看這個代碼「消毒」任何東西。

有關如何提高此功能的安全性的任何建議?

當然。
首先你要明白什麼轉義是以及如何使用它。

然後你開始使用佔位符,我相信

+1

感謝您的反饋。與新的更新,如果有人試圖注入類似的東西,它會返回:SELECT * FROM tabla WHERE user ='1 union select password from users where id = 1' – andufo

+0

我敢打賭,它會破壞你當前的查詢, '''已經引用 –

+0

目前的查詢都沒有''。他們都有... field ='。q($ val) – andufo

0

mysql_escape_stringdocumentation

此功能被廢棄,不使用此功能。相反,使用mysql_real_escape_string().

所以,如果你正在使用MySQL,你應該只是mysql_real_escape_string罰款。

+0

我使用的是MySQL,但使用了Adodb for PHP庫。因此,我沒有第二個參數的link_identifier。您在那裏看到的str_replace()與mysql_real_escape_string相同,但沒有第二個參數。我的問題是:這足以防止sql注入? – andufo

+0

你可以在這裏找到關於這個在stackoverflow的討論。示例是[這裏](http://stackoverflow.com/questions/5304424/mysql-real-escape-string-not-good-enough)和[這裏](http://stackoverflow.com/questions/3123202/mysql -real-轉義字符串是-IT-足夠換數據庫的安全單獨)。順便說一句:'mysql_real_escape_string'的第二個參數是可選的。 –

+0

當我在php文檔中閱讀時,它是可選的,但如果沒有找到這樣的鏈接,它會嘗試創建一個,就好像調用mysql_connect()時沒有參數一樣。如果未找到或建立連接,則會生成E_WARNING級別錯誤。那不會浪費資源嗎? – andufo