我php 5.2
之前用过。现在我想升级php 5.4.
魔术引号现在被删除了。我想让我的应用程序正常工作。我应该使用哪个函数来转义数据mysql_real_escape_string()
或addslashes()
?
上面哪个函数会给出与设置相同的结果magic_quotes_gpc
?
我php 5.2
之前用过。现在我想升级php 5.4.
魔术引号现在被删除了。我想让我的应用程序正常工作。我应该使用哪个函数来转义数据mysql_real_escape_string()
或addslashes()
?
上面哪个函数会给出与设置相同的结果magic_quotes_gpc
?
最好迁移到上面@alex 概述的 PDO 和准备好的语句。
如果这不可行,请使用 绝对转义传入的字符串数据mysql_real_escape_string()
,并验证整数数据,例如使用此答案filter_input()
中所示的方法。
addslashes()
不是适用于 mySQL 查询的转义方法。
出于安全原因,最好使用此处建议的准备好的语句。Mysql_real_escape_string 可能不足以防止 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 中准备好的语句的更多信息。所以总而言之,如果您有可能将您的应用程序更改为准备好的语句,那将是最好的处理方式。
更新(完全不推荐)
如果您真的想保留状态,请对每个 $GET 和 $POST 变量使用 addlashes()。它手动执行的操作与打开的 magic_quotes 对所有 $GET 和 $POST 变量所做的相同。但我真的猜想将 mysqli 与 mysqli_real_escape_string 或更好的准备好的语句一起使用会减少工作量:)
因为我不能在我的应用程序中引入 db 层并且我想要一个快速的解决方案,所以我使用了 addlashes() 函数,因为 addlashes() 转义了单引号 (')、双引号 (")、反斜杠 () 和 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 Quotesmagic_quotes_gpc
中设置引用相同的结果。
启用时,所有 '(单引号)、"(双引号)、\(反斜杠)和 NULL 字符都会自动使用反斜杠进行转义。这与addlashes()的作用相同。
如果您仍然想magic_quotes_gpc
在 PHP 5.4 或更高版本上运行您的遗留代码,您可以使用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);
}