我有一个托管在 Apache Tomcat 7 服务器上的网站,该网站使用 Authorize.net 网关和商家服务来处理付款。我最近对我的网站进行了一次必需的 PCI 合规性测试,但由于存在反射型跨站点脚本 (XSS) 漏洞,测试失败。他们给出的示例是使用脚本替换我的某个表单参数的值:警报(‘测试’)
我觉得我已经在客户端解决了这个问题,方法是在提交表单时验证输入,如果其中一个输入无效,则不继续。但是,最近重新扫描失败了,所以我认为我需要做更多。
我的第一个问题:是否可以通过 URL 向服务器传递 POST 参数? 我认为这只能通过 GET 方法实现,但我没有使用该方法。我想弄清楚的是他们如何提交这些数据。当然,他们没有提供支持,所以我必须自己解决这个问题。
有人用过 PCI RapidComply 吗?你用什么来解决 XSS 验证问题?
谢谢!
答案1
您无法通过 URL 传递 POST 参数,但这对于 XSS 漏洞来说并非必需。第三方网站可以使用 JavaScript 将用户发送到您的网站,并附带他们想要的任何 POST 参数:
<html>
<body onload="document.forms[0].submit()">
<form action="https://yoursite.example.com/" method="post">
<input type="hidden" name="parameter" value="alert('test')">
</form>
</body>
</html>
只要攻击者能够让有权访问您网站的最终用户加载这样的 HTML 文档(例如通过放置在广告网络上的 iframe),他们就能够让用户在该用户的上下文(会话)中在您的页面上运行任意 JavaScript。
防止这种情况的唯一方法是通过服务器端进行处理。一般来说,提交的任何用户数据都应经过清理,同时还要记住在输出 HTML 时对所有内容进行转义。通常最后一部分应该由模板库来处理。