防止XSS攻击用户提交的PHP HTML内容,易趣的方式


Preventing XSS attacks on user submitted HTML content in PHP, the eBay way

我读过很多文章,描述了在用户提交的HTML内容中使用htmlspecialchar和regexs、白名单/黑名单等功能以及使用HTML净化器、HTMLawed等HTML过滤脚本来防止XSS攻击的方法。

不幸的是,这些都不能解释像eBay这样的网站是如何允许大量潜在的恶意HTML标签(如<link><script><object>)以及CSS样式和HTML属性(如background:url())等的。似乎它们允许用户在物品描述中提交几乎任何内容。我在商品描述中看到了一些最精细的HTML、Javascript和Flash模板。

易趣有什么不同之处?我是否缺少另一种技术或层,允许他们阻止XSS攻击,同时仍然允许在用户的项目描述中包含几乎所有内容?

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

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

这不是火箭科学。他们识别了一个漏洞案例,并通过前端的Regex和Javascript进行编码,以及大量的后端验证,以确保数据在插入之前不会受到损害。这是我们所有人都应该做的事情,只是对于Ebay来说,它比我们大多数人所做的要成熟得多,而且far更大。

如果它和我曾经工作过的银行有什么相似之处,他们有一个PAS团队,致力于发现产品中的微小错误,与工程师一起开罚单,并优先遵循流程。在开发人员、测试人员、质量管理人员和PAS之间,没有理由暴露漏洞,但如果漏洞碰巧出现,应该迅速做出反应。

如果你计划走这条路,你应该考虑采取"渐进增强"的方法来应对这一挑战。首先要完全屏蔽javascript。然后,通过一种你认为安全的方法进行增强,允许——有些——并且在继续的过程中只允许安全的东西。继续这一过程,允许越来越多的边缘案例出现在测试或生产中。渐渐地,您将从允许的内容迁移到阻止不允许的内容。虽然这应该是一件很容易的事,但即使是尖端公司也错过了生命周期管理和改进的基本概念。

也就是说,当试图净化输入时,最好将前端和后端验证方法结合起来。前端为客户端提供了更直观的快速反馈,但与任何客户端语言一样,saavy用户都可以克服这一点。后端验证是你的防火墙,确保任何通过前端的东西都得到适当的处理。你的数据库是你的生命线,所以要不惜一切代价保护它!

除非你有一支军队和庞大的预算,否则试图在CMS这样广泛的平台上为每一个边缘案例编码,几乎总是以失败的财务风险告终。

我花了一些时间,通过建立在这里列出的一个多年的漏洞之上,我能够alert(document.cookie)——他们的黑名单显然试图阻止这一点:

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

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

如果这是任何迹象,那么你的问题的答案是:ebay并不能真正阻止xss攻击。他们有一些黑名单,但它们似乎是微不足道的。

编辑:我现在似乎在我的ebay"关于我"页面上有这个功能,一个真正的实时页面。长话短说,ebay过滤XSS的尝试似乎相当可悲。

虽然我不能肯定,但有很多技术可以帮助解决这个问题。这项工作的主要组成部分是拥有一个活跃且可用的安全+开发部门。

尽管它们肯定有一个过滤机制,但代码可能会在模拟器中进行评估,并根据某些标准(如可疑内容、模糊处理等)进行评级。

然后,还有亚马逊正在疯狂使用的机械土耳其人方面(基本上,他们雇佣"廉价劳动力"来聪明地判断事物)。