【发布时间】:2011-03-24 04:58:07
【问题描述】:
我对 PHP 很陌生,但我听说 XSS 漏洞利用很糟糕。我知道它们是什么,但如何保护我的网站?
【问题讨论】:
我对 PHP 很陌生,但我听说 XSS 漏洞利用很糟糕。我知道它们是什么,但如何保护我的网站?
【问题讨论】:
为了防止 XSS 攻击,您只需正确检查并验证您计划使用的所有用户输入数据,并且不允许从该表单插入 html 或 javascript 代码。 或者您可以使用 htmlspecialchars() 将 HTML 字符转换为 HTML 实体。因此,像 这样标记标签开始/结束的字符将转换为 html 实体,您可以使用 strip_tags() 仅允许某些标签,因为该函数不会去除有害属性,如 onclick 或 onload。
【讨论】:
使用htmlentities() 函数转义所有用户数据(数据库中的用户数据)。
对于 HTML 数据(例如来自 WYSIWYG 编辑器),在将数据保存到数据库之前,请使用 HTML Purifier 清理数据。
【讨论】:
mysqli_preg_replace(),即使在使用HTML Purifier 之后?htmlentities() 是否为表单中的text field 提供足够的安全性来清理数据?你可以建议我一些links 或videos 以开始使用HTML Purifier
strip_tags() 如果你不想有任何标签。这意味着像<somthinghere>htmlspecialchars() 这样的东西会将它们转换为 html,因此浏览器只会显示而不尝试运行。
如果你想允许好的 html,我会使用 htmLawed 或 htmlpurifier
【讨论】:
很遗憾,preventing XSS in PHP 是一项不平凡的工作。
与 SQL injection 不同,您可以通过准备好的声明和精心挑选的白名单来缓解这种情况,没有可证明的安全方法将您尝试传递给 HTML 文档的信息与文档结构的其余部分分开。
但是,您可以通过在转义时特别小心 (and keeping your software up-to-date) 来缓解已知的攻击媒介。
要牢记的最重要的规则:始终在输出时转义,从不在输入时。如果您担心性能,可以安全地缓存转义的输出,但始终在未转义的数据。
按优先顺序:
{{ var|e('html_attr') }}
htmlentities($var, ENT_QUOTES | ENT_HTML5, $charset) 并确保文档的其余部分使用与$charset 相同的字符集。在大多数情况下,'UTF-8' 是所需的字符集。尝试在输入上过滤 XSS 是 premature optimization,这可能会导致其他地方出现意外漏洞。
例如,最近的WordPress XSS vulnerability 使用 MySQL 列截断来破坏其转义策略并允许过早转义的有效负载不安全地存储。不要重复他们的错误。
【讨论】: