php过滤器扩展默认设置

时间:2011-01-26 21:20:54

标签: 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();
}

浏览http://localhost/xss.php?name=%3Cscript%3Ealert('XSS')%3C/script%3E

输出:

string(10)“unsafe_raw”

我的印象是,由于过滤器扩展,这对XSS漏洞是安全的,但事实并非如此!它输出一个javascript警告对话框。我的问题是:

  • 为什么默认过滤器为unsafe_raw。我读过unsafe_raw不能防止XSS?
  • 如何保护PHP免受此漏洞的侵害。我可以修改我的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();
}

1 个答案:

答案 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对现有的输入数组没有影响。