使用 eBay 方式在 PHP 中防止对用户提交的 HTML 内容的 XSS 攻击

Posted

技术标签:

【中文标题】使用 eBay 方式在 PHP 中防止对用户提交的 HTML 内容的 XSS 攻击【英文标题】:Preventing XSS attacks on user submitted HTML content in PHP, the eBay way 【发布时间】:2011-09-11 04:39:30 【问题描述】:

我已经阅读了很多文章,这些文章描述了使用 htmlspecialchars 和正则表达式、白名单/黑名单以及使用 HTML Purifier、HTMLawed 等 html 过滤脚本等功能来防止用户提交的 HTML 内容中 XSS 攻击的方法。

不幸的是,这些都不能解释像 eBay 这样的网站如何能够允许大量潜在的恶意 HTML 标签,如 <link><script><object> 以及 CSS 样式和 HTML 属性,如背景: url() 等。似乎它们允许用户在他们的项目描述中提交几乎任何东西。我在项目描述中看到了一些最复杂的 HTML、javascript 和 Flash 模板。

eBay 有何不同之处?是否有我遗漏的其他技术或层,允许他们阻止 XSS 攻击,同时仍然允许在用户的项目描述中包含几乎所有内容?

对此的任何想法或见解将不胜感激!

【问题讨论】:

如果您使用 htmlpurifier 方法将已知良好标记列入白名单,并建立一个非常强大的白名单,您可以安全地执行此操作。 嘿。我能够创建一个包含警报的列表,但是当我尝试 alert(document.cookie) 时,我收到以下错误:“请在突出显示的字段中提供正确的信息。说明 - 您的列表不能包含 javascript (".cookie", " cookie(", "replace(", IFRAME, META, or includes), cookies or base href." 我想知道他们的过滤器有多聪明。即,编写 javascript 来生成“alert(document.cookie)” 感谢弗兰克,我以前使用过 HTMLPurifier,但只是开箱即用。开发人员友好且知识渊博,但在针对这种特殊情况的预设白名单或建议方面,他并没有提供太多帮助。是否有任何第 3 方白名单可以指向我? 我看到了。第 8 层防火墙评论是个笑话。认为它相当于“车灯液”。 【参考方案1】:

当你拥有一支程序员大军和一个装满钱的战争基金时,这很容易。

这不是火箭科学。他们确定了一个漏洞案例,并可能通过前端的 Regex 和 Javascript 以及大量的后端验证围绕它进行编码,以确保数据在插入之前不会受到损害。我们都应该这样做,除了 Ebay 比我们大多数人的工作成熟得多,而且规模更大。

如果这与我曾经工作过的银行类似,他们有一个 PAS 团队,专门负责查找产品中的微小错误,与工程师一起开票,并优先跟进整个流程。在开发人员、测试人员、质量管理人员和 PAS 之间,没有理由泄露一个漏洞,但如果它发生泄漏,应该迅速做出反应。

如果您打算走这条路,您应该考虑采用“渐进式增强”方法来应对这一挑战。从最初完全阻止 javascript 开始。然后,通过您认为安全的方法增强以允许--一些--并且仅在您继续时允许安全的内容。继续这个过程,在捕获测试或生产中出现的边缘情况的同时,允许越来越多的情况。逐渐地,您将从允许允许的内容转变为阻止不允许的内容。虽然这应该不费吹灰之力,但即使是尖端公司也错过了生命周期管理和改进的基本概念。

话虽如此,在尝试清理输入时,最好将前端和后端验证方法结合起来。前端为客户提供更直观的快速反馈,但与任何客户端语言一样,精明的用户都可以克服。后端验证是您的防火墙,确保任何从前端溜过的东西都得到妥善处理。您的数据库是您的生命线,所以要不惜一切代价保护它!

除非您拥有一支军队和巨额预算,否则尝试在诸如允许近乎全权委托的输入的 CMS 等广泛的东西上为每个边缘案例编写代码几乎总是以失败的财务风险告终。

【讨论】:

很棒的评论。感谢您的提示!【参考方案2】:

我花了一些时间在它上面,并且我能够alert(document.cookie)——这是他们的黑名单显然试图阻止的——通过建立在此处列出的多年前的漏洞利用:

http://menno.b10m.net/blog/blosxom.cgi/web/ebay-xss.html

我还没有实际发布列表,所以我只能肯定这在列表预览模式下有效。

如果这是任何迹象,那么您的问题的答案是:ebay 并不能真正防止 xss 攻击。他们有一些黑名单,但他们似乎很容易逃避。

编辑:我现在似乎在我的 ebay“关于我”页面上工作, 一个实际的实时页面。长话短说,ebay 过滤 XSS 的尝试似乎很可悲。

【讨论】:

您的报告很棒,非常感谢。小心不要让您的 eBay 帐户被禁止:P【参考方案3】:

虽然我不能肯定地说,但有很多技术可以提供帮助。 实现这一目标的主要组成部分是拥有一个活跃且可用的安全+开发部门。

虽然它们肯定有过滤机制,但代码可能会在模拟器中进行评估,并根据某些标准(例如可疑内容、混淆等)进行评级。

然后,还有Mechanical Turk 方面,亚马逊正在疯狂地使用它(基本上,他们雇佣“廉价劳动力”人类来智能地判断事物)。

【讨论】:

嗯嗯..有趣。谢谢。

以上是关于使用 eBay 方式在 PHP 中防止对用户提交的 HTML 内容的 XSS 攻击的主要内容,如果未能解决你的问题,请参考以下文章

php通过记录IP来防止表单重复提交方法分析

php防止用户重复提交表单

PHP 怎么防止GET方式提交重复数据?

php中如何防止刷新一次提交一次

php 如何防止表单重复提交呢

有哪些技术可以防止多次提交比赛?