照顾XSS

时间:2009-01-16 19:21:06

标签: php security xss

我运行了一个笔测试应用程序,它发现了大量的XSS错误,特别是,我对通过查询字符串回传到浏览器的未经证实的数据感到内疚。

具体来说,运行此操作会将javascript放入我的页面。 http://www.mywebsite.com/search.php?q=%00'“[ScRiPt]%20%0a%0d>提醒(426177032569)%3B [/ ScRiPt]。

值得庆幸的是,我无论在哪里都可以让用户将数据保存到数据库并显示给其他用户,所以我认为人们只能解决这个问题,但我仍然想修复它。

建议这样做:

echo htmlentities($_POST[‘input’], ENT_QUOTES, ‘UTF-8’);

但是目前我需要尽快修补,然后根据具体情况进行修复。 我在网站的每个页面上都有一个头文件,我知道它的格式不好,但是如果我这样做会有什么问题:

array_walk($_POST, 'htmlentities');  

我也需要为COOKIE和GET做这件事。我从不使用_REQUEST。

由于

4 个答案:

答案 0 :(得分:3)

HTML-escape在路上显然是错误的东西,但可能是一个临时修复,直到你用适当的东西替换代码。从长远来看,它将是不可维护的,并且在你开始进行子字符串操作(包括截断,数据库可能自动执行)和编码字符之间的任何地方都会出现大量奇怪的应用程序级错误。它不太可能导致安全漏洞,尽管如果不更详细地查看应用程序就无法分辨。

如果您每次都在$ _SESSION中开始编码,那么您将获得多次编码太长的字符串,例如& amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp;放大器;放大器;放大器;很快。

  

我认为人们只能自我攻击

或者,另一个网页上的攻击者可能会重定向或iframe,并注入足够的脚本以显示与您的网站类似的虚假登录框,收集用户名和密码或自动删除其帐户。类似的东西。不太好。

  

建议这样做:echo htmlentities($ _ POST ['input'],ENT _QUOTES,'UTF-8');

不需要htmlentities和所有这些参数 - 使用htmlspecialchars。

您可以使用以下内容保存自己的几个按键:

function h($s) { echo(htmlspecialchars($s)); }
...
<?php h($POST['input']) ?>

真的没那么多麻烦了。

答案 1 :(得分:2)

盲目地逃避前端的所有输入意味着你的程序中处理该输入的任何部分都必须处理hld-escaped版本的&lt;,&gt;,&amp;等等。如果你正在存储数据在数据库中,您将在数据库中拥有html转义数据。如果您在非HTML背景中使用数据(如发送电子邮件),人们会看到&amp; lt;而不是&lt;等等。

您可能只想在输出时逃避。

答案 2 :(得分:1)

上面的代码不起作用,但这样做:

$_POST = clean_input($_POST);
$_GET = clean_input($_GET);
$_COOKIE = clean_input($_COOKIE);
$_SESSION = clean_input($_SESSION);

function clean_input($array){
    if(count($array)){
        foreach ($array as $key => $value) {
            $array[$key]=htmlentities($value, ENT_QUOTES, 'UTF-8');
        }
    }
    return $array;
}

我只想弄清楚这里可能出现什么问题。

答案 3 :(得分:1)

我最初的回答是建议您首先确保您的演示逻辑与业务逻辑等分开处理。

如果表示逻辑确实是独立的,那么您需要评估当前输出到屏幕的方式。你可以通过相同的函数调用来运行每个输出,这些函数调用会将所有输出转移到屏幕上吗?

例如,当您实际输出到屏幕时调用clean_output,但是在数据库操作或对数据进行业务逻辑操作之前我不会这样做,因为您可能会逃避原本应该保留的内容。

相关问题