我创建了一个小的PHP脚本,它运行在PHP 5.2.17的服务器上并且启用了magic_quotes_gpc
指令。
我没有对php.ini文件的写访问权限,我想从用户输入中删除所有斜杠。
即使关闭magic_quotes_gpc
指令(例如将脚本移动到另一台服务器时),这也应该有效。
当用户提交数组时,它也应该递归工作 我更喜欢使用内置功能。</ p>
<html>
<head>
<title>HP</title>
</head>
<body>
<form method="POST" action="magic.php">
<input type="text" value="te\\"st" name="test1">
<input type="text" value="te\\"st" name="test2[tw"o]">
<input type="submit" value="submit">
</form>
<?php
echo "<pre>";
echo "magic_quotes: ".get_magic_quotes_gpc()."\n";
echo "<hr>test1";
echo "filter_input: ".filter_input(INPUT_POST, "test1")."\n";
echo "POST: ".$_POST['test1']."\n";
echo "<hr>test2 (filter)";
print_r(filter_input_array(INPUT_POST))."\n";
echo "<hr>test2 (post)";
print_r($_POST)."\n";
echo "</pre>";
?>
</body>
</html>
在我的服务器上提供以下结果:
magic_quotes: 1
filter_input: te\\"st
POST: te\\\\\"st
test2 (filter)Array
(
[test1] => te\\"st
[test2] => Array
(
[tw\"o] => te\\"st
)
)
test2 (post)Array
(
[test1] => te\\\\\"st
[test2] => Array
(
[tw\"o] => te\\\\\"st
)
)
除了数组键之外,似乎删除了斜杠。
或是从未添加斜杠? (filter_input()
和filter_input_array()
可能会忽略magic_quotes_gpc
指令,因为它已被弃用;但我找不到相应的引用)
删除/不设置filter_input()
和filter_input_array()
斜杠的行为是否依赖于系统参数?
我不明白警告here。
答案 0 :(得分:3)
我在官方文档中找不到它,但filter_input()
函数对原始数据进行操作,并且不受magic_quotes
设置的影响。如果需要,清理过滤器FILTER_SANITIZE_MAGIC_QUOTES
会将它们放入。
对我个人而言,这是一个福音,因为我在magic_quotes
打开的遗留系统中工作。通过使用filter_input()
函数,我可以使用这些值,而不必在PDO
中绑定它们之前去除斜杠。
这些文章谈到它:
http://www.sitepoint.com/forums/showthread.php?590848-Filter_input-magic-quotes
https://weston.ruter.net/2013/10/22/revelations-about-filter_input/
http://php.net/manual/en/function.filter-input.php#99124
答案 1 :(得分:0)
我通常使用以下几行中的内容来针对magic_quotes设置规范化输入数据。
function deslash (array $data)
{
foreach ($data as $key => $val)
{
$data [$key] = is_array ($val)? deslash ($val): stripslashes ($val);
}
return $data;
}
if ((!empty ($_POST)) && (get_magic_quotes_gpc ()))
{
$posted = deslash ($_POST);
}