我运行了一个笔测试应用程序,它发现了大量的XSS错误,具体地说,我对通过querystring将未经验证的数据回显到浏览器中感到内疚。
具体地说,运行此命令会将javascript放入我的页面。“ScRiPt%20%0a%0d>alert(426177032569)%3B/ScRiPt.”http://www.mywebsite.com/search.php?q=%00
谢天谢地,我不会让用户将数据保存到数据库并显示回给其他用户,所以我认为人们只能解决这个问题,但我仍然想解决它。
建议这样做:
echo htmlentities($_POST[‘input’], ENT_QUOTES, ‘UTF-8’);但目前我需要尽快修复这个问题,然后根据具体情况进行修复。我在网站上的每个页面上都有一个头文件,我知道这是不好的形式,但如果我这样做了,可能会爆炸:
array_walk($_POST, 'htmlentities'); 我需要为COOKIE做这件事,同时也要得到。我从不使用_REQUEST。
谢谢
发布于 2009-01-16 22:54:43
HTML转义显然是错误的,但可能是暂时的修复,直到您用适当的东西替换代码。从长远来看,它将是不可维护的,并且在您开始跨&-编码字符进行子字符串操作(包括截断,您的数据库可能会自动执行)的任何地方都会出现大量奇怪的应用程序级错误。这不太可能导致安全漏洞,尽管你不能在不仔细查看应用程序的情况下判断。
如果你每次都开始用$_SESSION编码,你很快就会得到像&这样的多重编码过长的字符串。
我认为人们只能黑进他们自己
或者,其他网页上的攻击者可以重定向或iframe到您的网页,并注入足够的脚本,以显示一个看起来像您网站的假登录框,获取用户名和密码或自动删除他们的帐户。诸如此类的东西。不是很好。
echo建议这样做:
htmlentities($_POST‘’input‘,ENT _QUOTES,’UTF-8‘);
不需要htmlentities和所有这些参数-使用htmlspecialchars。
您可以使用以下命令来节省一些按键次数:
function h($s) { echo(htmlspecialchars($s)); }
...
<?php h($POST['input']) ?>这真的不是那么多额外的麻烦。
发布于 2009-01-16 19:30:26
盲目地转义前端的所有输入将意味着程序中处理这些输入的任何部分都必须处理<、>、&等的html转义版本。如果您将数据存储在数据库中,那么您的数据库中就会有html转义的数据。如果您在非html上下文中使用数据(如发送电子邮件),人们将看到<而不是<等。
您可能只想在输出时进行转义。
发布于 2009-01-16 19:52:32
我最初的反应是建议您首先确保您的表示逻辑与业务逻辑分开处理,等等。
如果表示逻辑确实是独立的,那么您需要评估当前如何输出到屏幕。您是否可以通过相同的函数调用运行每个输出,从而将所有输出转义到屏幕上?
例如,当您要实际输出到屏幕时,调用clean_output,但我不会在对数据进行数据库操作或业务逻辑操作之前这样做,因为您很可能会逃脱一些本应保留原样的操作。
https://stackoverflow.com/questions/451601
复制相似问题