0

我运行了一个渗透测试应用程序,它发现了大量的 XSS 错误,具体来说,我犯了通过查询字符串将未经验证的数据回显到浏览器的错误。

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

谢天谢地,我不允许用户将数据保存到数据库并显示回其他用户,所以我认为人们只能用这个问题破解自己,但我仍然想修复它。

建议这样做:

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

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

array_walk($_POST, 'htmlentities');  

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

谢谢

4

4 回答 4

3

HTML 转义显然是错误的事情,但在您用适当的代码替换代码之前,它可能是一个临时修复。从长远来看,它将无法维护,并且在您开始跨 & 编码的字符进行子字符串操作(包括截断,您的数据库可能会自动执行)的任何地方,您都会遇到大量奇怪的应用程序级错误。这不太可能导致安全漏洞,尽管如果不更详细地查看应用程序就无法判断。

如果您每次都在 $_SESSION 中开始编码,您将得到多重编码过长的字符串,例如 &amp ; 很快。

我认为人们只能破解自己

或者,另一个网页上的攻击者可以重定向或 iframe 到您的网页,注入足够多的脚本来显示一个看起来就像您网站的假登录框,获取用户名和密码或自动删除他们的帐户。类似的东西。不是很好。

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

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

您可以使用以下方式为自己节省一些按键:

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

这真的没有那么多额外的麻烦。

于 2009-01-16T22:54:42.753 回答
2

盲目地转义前端的所有输入将意味着处理该输入的程序的任何部分都必须处理 <、>、& 等的 html 转义版本。如果您将数据存储在数据库中,那么您将在您的数据库中有 html 转义的数据。如果您在非 html 上下文中使用数据(例如发送电子邮件),人们会看到 < 而不是 < 等

您可能只想在输出时转义。

于 2009-01-16T19:30:26.207 回答
1

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

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

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

于 2009-01-16T19:52:32.293 回答
0

上面的代码不起作用,但这确实:

$_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;
}

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

于 2009-01-16T19:47:07.907 回答