我读过很多文章,描述了使用 htmlspecialchars 和正则表达式、白名单/黑名单等功能以及使用 HTML 过滤脚本(如 HTML Purifier、HTMLawed 等)防止用户提交的 HTML 内容中的 XSS 攻击的方法。
不幸的是,这些都无法解释像 eBay 这样的网站如何能够允许如此大量的潜在恶意 HTML 标签,例如 <link> , <script> , <object>以及 CSS 样式和 HTML 属性,例如 background: url() 等。似乎它们允许用户将几乎所有内容提交到他们的元素描述中。我在元素描述中看到了一些最精致的 HTML、Javascript 和 Flash 模板。
eBay 有何不同之处?是否有我遗漏的另一种技术或层,允许他们阻止 XSS 攻击,同时仍然允许在用户的元素描述中包含几乎所有内容?
任何想法或对此的见解将不胜感激!
最佳答案
当你有一群程序员和一大笔钱时,这很容易。
这不是火箭科学。他们确定了一个漏洞案例,并可能通过前端的 Regex 和 Javascript 以及大量的后端验证来围绕它进行编码,以确保数据在插入之前不会受到损害。这与我们所有人都应该做的一样,只是对于 Ebay,它比我们大多数人所做的要成熟得多,而且规模也大得多。
如果它像我以前工作的银行一样,他们有一个 PAS 团队,致力于发现产品中的微小错误、与工程师开票,并优先跟踪流程。在开发人员、测试人员、质量管理人员和 PAS 之间,没有理由应该泄露漏洞,但如果它碰巧漏掉了,就应该迅速使用react。
如果您打算走这条路,您应该考虑采用“渐进增强”的方法来应对这一挑战。首先首先完全阻止 javascript。然后,通过您认为安全的方法增强以允许 --some-- 并且只允许在您继续时安全的内容。继续这个过程允许越来越多,同时捕捉在测试或生产中出现的边缘案例。逐渐地,您将从允许允许的内容迁移到阻止不允许的内容。虽然这应该是显而易见的,但即使是最先进的公司也会在生命周期管理和改进的基本概念上错失良机。
也就是说,在尝试净化输入时,最好结合使用前端和后端验证方法。前端向客户提供更直观的快速反馈,但与任何客户端语言一样,精明的用户可以克服。后端验证是您的防火墙,确保任何通过前端的内容都得到适当处理。您的数据库是您的生命线,因此请不惜一切代价保护它!
除非您有一支军队和巨额预算,否则尝试在像 CMS 这样允许近乎全权输入的内容管理系统这样广泛的东西上为每个边缘案例编写代码几乎总是以失败告终。
关于php - 防止对用户在 PHP 中提交的 HTML 内容进行 XSS 攻击,eBay 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6284620/
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。
我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas