防止XSS攻击?

时间:2011-03-24 04:58:08

标签: php xss

我对PHP很新,但我听说XSS漏洞很糟糕。我知道它们是什么,但我如何保护我的网站?

4 个答案:

答案 0 :(得分:10)

为防止XSS攻击,您只需检查并验证您计划使用的所有用户输入数据,并且不允许从该表单插入html或javascript代码。 或者您可以使用htmlspecialchars()将HTML字符转换为HTML实体。所以像<>这样的字符标记开头/结尾的标签变成了html实体,你可以使用strip_tags()只允许一些标签,因为函数不会去除onclick或onload等有害属性。

答案 1 :(得分:4)

使用htmlentities()函数转义所有用户数据(来自用户的数据库中的数据)。

对于HTML数据(例如来自WYSIWYG编辑器),在将数据保存到数据库之前使用HTML Purifier清除数据。

答案 2 :(得分:0)

strip_tags()如果您想要根本没有标签。含义如<somthinghere>
htmlspecialchars()会将它们转换为html,因此浏览器只会显示而不会尝试运行 如果你想允许好的HTML,我会使用像htmLawedhtmlpurifier

这样的东西

答案 3 :(得分:0)

坏消息

不幸的是,preventing XSS in PHP是一件非常重要的事情。

与使用预准备语句和精心挑选的白名单缓解的SQL injection不同,没有可证明的安全方法将您尝试传递给HTML文档的信息与文档结构的其余部分分开

好消息

但是,您可以通过对转义(and keeping your software up-to-date)特别谨慎来减轻已知的攻击媒介。

要记住的最重要的规则:始终在输出时转义,从不输入。如果您担心性能,可以安全地缓存转义输出,但始终存储和操作未转义的数据。

XSS缓解策略

按优先顺序排列:

  1. 如果您使用的是模板引擎(例如Twig,Smarty,Blade),请检查它是否提供了上下文相关的转义。我从Twig的经验中知道。 {{ var|e('html_attr') }}
  2. 如果您想允许HTML,请使用HTML Purifier。即使您认为您只接受Markdown或ReStructuredText,您仍然希望净化这些标记语言输出的HTML。
  3. 否则,请使用htmlentities($var, ENT_QUOTES | ENT_HTML5, $charset)并确保文档的其余部分使用与$charset相同的字符集。在大多数情况下,'UTF-8'是所需的字符集。
  4. 为什么我不应该过滤输入?

    尝试在输入上过滤XSS为premature optimization,这可能会导致其他地方出现意外漏洞。

    例如,最近WordPress XSS vulnerability使用了MySQL列截断来打破其转义策略并允许过早转义的有效负载存储不安全。不要重复他们的错误。