2

我创建了一个小的 PHP 脚本,它在 PHP 5.2.17 的服务器上运行并magic_quotes_gpc启用了该指令。

我没有对 php.ini 文件的写访问权限,我想从用户输入中删除所有斜杠。

即使该magic_quotes_gpc指令被关闭(例如将脚本移动到另一台服务器时),这也应该有效。

当用户提交数组时,它也应该递归地工作。
我更喜欢使用内置函数。

<html>
<head>
    <title>HP</title>
</head>
<body>

<form method="POST" action="magic.php">
<input type="text" value="te\\&quot;st" name="test1">
<input type="text" value="te\\&quot;st" name="test2[tw&quot;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()于系统参数?
我不明白这里的警告。

4

2 回答 2

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
_

于 2014-07-23T18:22:00.923 回答
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);
}
于 2012-03-02T12:27:40.760 回答