我之前使用的是php 5.2
。现在我要升级php 5.4.
现在已删除魔术引号。我想让我的应用程序正常工作。我应该使用哪种功能来转发数据mysql_real_escape_string()
或addslashes()
?
上面的哪个函数会给出与magic_quotes_gpc
设置??
答案 0 :(得分:2)
最好是按照@alex上面的概述迁移到PDO和预备语句。
如果这不可行,则绝对使用mysql_real_escape_string()
转义传入的字符串数据,并验证整数数据,例如使用filter_input()
addslashes()
{{1}}不适合mySQL查询的转义方法。
答案 1 :(得分:1)
出于安全原因,最好使用建议的here语句。 Mysql_real_escape_string可能不足以阻止sql注入,例如因为尽管有转义函数()。mysql_real_escape_string() versus Prepared Statements。
,但多字节字符集可能会被滥用PHP中的预处理语句可以像这样使用:
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);
More information on prepared statements in PHP。总而言之,如果您有可能将应用程序更改为准备好的语句,那么这将是最好的处理方式。
更新(完全不推荐)
如果你真的想要保持状态,请为每个$ GET和$ POST变量使用addslashes()。它可以手动完成所有$ GET和$ POST变量所启用的magic_quotes。但我真的猜测使用mysqli与mysqli_real_escape_string或更好的准备语句的工作较少:)
答案 2 :(得分:1)
因为我不能在我的应用程序上引入db层而且我想要一个快速的解决方案,所以我使用了addslashes()函数,因为addslashes()转义单引号('),双引号(“),反斜杠()和NUL( NULL byte)究竟是什么魔术引号逃脱。
代码:
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;
}
}
答案 3 :(得分:0)
addslashes()
提供的结果与从Magic Quotes引用的magic_quotes_gpc
设置相同。
启用时,所有'(单引号),'(双引号),\(反斜杠)和NULL字符都会自动转义为反斜杠。这与addslashes()的作用相同。
如果您仍希望在旧版代码的PHP 5.4或更高版本上运行magic_quotes_gpc
,则可以使用yidas/magic-quotes:
答案 4 :(得分:0)
我们需要在Request,Post,Get&曲奇饼。你可以在代码下面实现它。包含在公共文件中的代码下方。
$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);
}