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();
}
浏览http://localhost/xss.php?name=%3Cscript%3Ealert('XSS')%3C/script%3E
输出:
string(10)“unsafe_raw”
我的印象是,由于过滤器扩展,这对XSS漏洞是安全的,但事实并非如此!它输出一个javascript警告对话框。我的问题是:
php.ini
,但我想在运行时执行此操作,但ini_set
,.htaccess
默认情况下在我的Ubuntu框中不起作用。我希望它在运行时受到影响,以便所有php实例(在其他机器上部署时)都是安全的。这是可能的,还是我真的需要将我的代码与filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);
一起使用以使其安全。P.S:这段代码是安全的,看起来也不错,但如果我可以在运行时设置它就会更好。
<?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();
}
答案 0 :(得分:2)
过滤器扩展名不能防止XSS输入字符串。大多数过滤器功能基于字符集进行一些有限的清理。有些像_VALIDATE_EMAIL和_VALIDATE_URL只是根据正则表达式(大多数)验证格式。
即使是w3fools也说:
FILTER_UNSAFE_RAW过滤器不执行任何操作,或对指定的字符进行编码和剥离。
您需要将它与_FLAG_STRIP_ *或_FLAG_ENCODE_ *选项结合使用才能使其有用。
关于FILTER_SANITIZE_SPECIAL_CHARS,你最好只使用htmlspecialchars()。
为什么默认过滤器为unsafe_raw。
为了不搞砸行为现有脚本,默认过滤器设置无意义。
如何保护PHP免受此漏洞的侵害。我可以修改我的php.ini,但我想在运行时但是ini_set,...
为htmlspecialchars()编写一个简短的包装函数,并将其应用于您所做的所有输出 - 无论输入来自何处。
通过ini_set()设置默认过滤器功能是不可能的AFAIK,因为过滤器基本上像magic_quotes一样运行。当PHP启动时,它只在所有输入数据上调用一次。调用ini_set对现有的输入数组没有影响。