我正在優化一個使用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 "''";
}
}
什麼是使用str_replace函數點?爲什麼不使用mysql_escape_string? –
mysql_escape_string已經過時,不再支持。另外,您可以使用%27來利用該功能。解決方案是mysql_real_escape_string,但是需要第二個參數(可選,但是如果它爲null,它會嘗試生成一個mysql連接 - 所以根據我的觀點,它使用了一些額外的資源) – andufo
duh。你不能利用你自己的str來代替這種方式? –