我一直在到处寻找,试图找到解决这个问题的办法。我最近一直在我们的网站上运行扫描,以发现 XSS 和 SQL 注入(inject)的任何漏洞。有些项目引起了我的注意。
用户输入的任何数据现在都使用 filter_var() 进行验证和清理。
我现在的问题是 XSS 和操纵 URL 的人。似乎无处不在的简单方法是:
http://www.domainname.com/script.php/">< script>alert('xss');< /script >
然后这会更改一些 $_SERVER
变量并导致我的所有 CSS、链接、图像等的相对路径无效,并且页面无法正确加载。
我清除了脚本中使用的所有变量,但我不确定如何移除 URL 中不需要的数据。
提前致谢。
添加: 然后这会在模板文件中产生一个简单的链接:
<a href="anotherpage.php">Link</a>
实际链接到:
"http://www.domainname.com/script.php/"><script>alert('xss');</script>/anotherpage.php
最佳答案
This then changes some of the
$_SERVER
variables and causes all of my relative paths to CSS, links, images, etc.. to be invalid and the page doesn't load correctly.
这听起来您的网站犯了一个大错误,您应该重新考虑如何将输入中的链接信息注入(inject)到输出中。
单独过滤输入在这里无济于事,您还需要过滤输出。
如果您的应用程序收到的请求与允许请求的超集不匹配,通常会更容易返回 404 错误。
I am not sure how I get around removing this unwanted data in the URL.
其实请求已经发送过了,所以URL已经设置好了。你不能“改变”它。这只是所请求的信息。
现在您有责任处理它,而不是再盲目地传递它,例如进入您的输出(然后您的链接被破坏)。
编辑:您现在更具体地写下了您所关注的内容。我会在这里和 dqhendricks 合二为一:谁在乎?
如果您真的对用户只是使用她的浏览器并输入她随意输入的任何 URL 这一事实感到不舒服,那么,技术上正确的响应是:
400 Bad Request (ref)
并返回一个没有或只有完全限定的 URI(绝对 URI)或重新定义 Base-URI 的页面,否则浏览器会将输入到其地址栏中的 URI 作为 < em>基本 URI。参见 Uniform Resource Identifier (URI): Generic Syntax RFC 3986; Section 5. Reference ResolutionSpecs。
关于php - PHP 脚本中的 XSS 漏洞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8764696/