php过滤器扩展默认设置

php过滤器扩展默认设置,php,filter,Php,Filter,xss.php <?php header('Content-Type:text/html; charset=UTF-8'); var_dump(ini_get('filter.default')); if (isset($_GET['name'])) { echo $_GET['name']; exit(); } 筛选器扩展不保护XSS输入字符串。大多数过滤器函数都基于字符集执行一些有限的清理。有些像_VALIDATE_EMAIL和_VALIDATE_URL只是根据正

xss.php

<?php
header('Content-Type:text/html; charset=UTF-8');

var_dump(ini_get('filter.default'));

if (isset($_GET['name'])) {
    echo $_GET['name'];
    exit();
}

筛选器扩展不保护XSS输入字符串。大多数过滤器函数都基于字符集执行一些有限的清理。有些像_VALIDATE_EMAIL和_VALIDATE_URL只是根据正则表达式(大多数情况下)验证格式

连傻瓜都说:

过滤器\u不安全\u原始过滤器不执行任何操作,或对指定字符进行编码和剥离

您需要将其与_FLAG_STRIP_*或_FLAG_ENCODE_*选项结合使用,以使其有用

关于FILTER\u SANITIZE\u SPECIAL\u CHARS,您最好只使用htmlspecialchars()

为什么默认过滤器不安全

为了不破坏现有脚本的行为,默认过滤器设置不起任何作用

如何保护PHP免受此漏洞的攻击。我可以修改我的php.ini,但我想在运行时使用它,但ini_set

为htmlspecialchars()编写一个短包装函数,并将其应用于所做的所有输出,而不管输入来自何处


通过ini_set()设置默认的过滤器函数是不可能的,因为过滤器的操作基本上就像魔术一样。当PHP启动时,它只对所有输入数据调用一次。调用ini_集对现有的输入数组没有影响。

您应该阅读Rasmus=>的这篇博客文章。他说他并没有在代码中使用它,而是使用了pecl扩展,filter_raw_string是安全的!你不再需要htmlspecialchars()。@Alfred:我曾经读过他更好的解释,现在找不到。但他肯定不仅仅使用
\u raw\u string
。他有一个相当于
$\u REQUEST=array\u map\u rec(“htmlspecialc”,…)
@Alfred的配置,我想可能是在评论中(在其他地方)。但无论如何,您可以使用
清理字符串
\u FLAG\u STRIP\u LOW\u FLAG\u ENCODE\u HIGH\u FLAG\u ENCODE\u AMP
。如果只需要编码而不需要标签剥离,请使用
\u特殊字符
。但请注意,这两种语言都是为拉丁语-1而不是UTF-8设计的。如果您想要更别致的东西,请尝试@Alfred:看起来很不错,但别忘了添加一些标志。顺便说一句,您可以直接覆盖
$\u GET
,而不是使用辅助数组。这将更等同于php.ini重写但等其他人加入进来,之前有过一些很好的讨论。或者——尽管两者都没有回答你的具体问题。
<?php
header('Content-Type:text/html; charset=UTF-8');

$_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING);
if (isset($_GET['name'])) {
    echo $_GET['name'];
    exit();
}