[英]php 5.4 magic_quotes_gpc alternative?
我之前使用的是php 5.2
。 現在我想升級php 5.4.
魔術引號現在已刪除。 我想讓我的應用程序正常工作。 我應該使用哪個函數來轉義數據mysql_real_escape_string()
或addslashes()
?
上面的哪個函數將提供與magic_quotes_gpc
設置相同的結果?
出於安全原因,最好使用此處建議的准備好的語句。 Mysql_real_escape_string可能不是suffiecient防止SQL注入例如,由於多字節字符集可以盡管逃生功能被濫用()。 mysql_real_escape_string()與Prepared Statements的比較 。
PHP中的預處理語句可以這樣使用:
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);
有關PHP中准備好的語句的更多信息 。 因此,總而言之,如果您有可能將應用程序更改為准備好的語句,那將是最好的處理方式。
UPDATE(完全不推薦)
如果您確實想保留狀態,則對每個$ GET和$ POST變量使用addlashes()。 它手動執行的操作與對$ GET和$ POST變量打開的magic_quotes所做的相同。 但是我真的猜測將mysqli與mysqli_real_escape_string或更好的,准備好的語句一起使用的工作較少:)
因為無法在應用程序上引入db層,並且需要快速解決方案,所以我使用了adslashes()函數,因為addslashes()會轉義單引號('),雙引號(“),反斜杠()和NUL(NULL字節)魔術引號完全可以逃脫。
碼:
foreach (array('_COOKIE','_GET', '_POST') as $_SG) {
foreach ($$_SG as $_SGK => $_SGV) {
$$_SGK = smartQuotes($_SGV);
}
}
function smartQuotes($value)
{
if( is_array($value) ) {
return array_map("smartQuotes", $value);
} else {
if( $value == '' ) {
$value = 'NULL';
} if( !is_numeric($value)) {
$value = addslashes($value);
}
return $value;
}
}
addslashes()
給出的結果與從Magic Quotes引用的magic_quotes_gpc
設置相同。
啟用此選項后,所有的'(單引號),“(雙引號),\\(反斜杠)和NULL字符都將自動以反斜杠轉義。這與addslashes()相同。
如果您仍然希望在PHP 5.4或更高版本上為舊版代碼運行magic_quotes_gpc
,則可以使用yidas / magic-quotes :
我們需要在Request,Post,Get和Cookie中添加斜線。 您可以在代碼下面實現。 通用文件中包含以下代碼。
$la_magicQuotes = array('_REQUEST','_POST', '_GET','_COOKIE');
foreach($la_magicQuotes as $la_superGlobal )
{
if($$la_superGlobal && is_array($$la_superGlobal))
array_walk($$la_superGlobal, 'pr_addslashed_array');
}
function pr_addslashed_array(&$la_val,$lc_key)
{
if (is_array($la_val))
array_walk($la_val,'pr_addslashed_array');
else
$la_val = pr_addslashed($la_val);
}
function pr_addslashed($lc_string)
{
return $lc_string = addslashes($lc_string);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.