我正在尝试编写一个安全且轻量级的基于白名单的 HTML 净化器,它将使用 DOMDocument。为了避免不必要的复杂性,我愿意做出以下妥协:
script 和 style 标签一起剥离body标签的子节点我已经阅读了很多关于 XSS 攻击和预防的文章,我希望我不要太天真(如果我是,请告诉我!)假设如果我遵循我上面提到的所有规则,我将远离 XSS。
问题是我不确定除了 default Javascript event attributes 之外还有哪些其他标签和属性(在任何 [X]HTML 版本和/或浏览器版本/实现中)可以触发 Javascript 事件:
onAbortonBluronChange点击onDblClickonDragDroponErroronFocusonKeyDownonKeyPressonKeyUponLoadonMouseDownonMouseMoveonMouseOutonMouseOveronMouseUponMoveonResetonResizeonSelect提交onUnload是否有任何其他非默认或专有事件属性可以触发 Javascript(或 VBScript 等...)事件或代码执行?我可以想到 href、style 和 action,例如:
<a href="javascript:alert(document.location);">XSS</a> // or
<b style="width: expression(alert(document.location));">XSS</b> // or
<form action="javascript:alert(document.location);"><input type="submit" /></form>
我可能会删除 HTML 标签中的所有 style 属性,action 和 href 属性构成了更大的挑战,但我认为以下代码足以确保它们的值是相对或绝对 URL 而不是一些讨厌的 Javascript 代码:
$value = $attribute->value;
if ((strpos($value, ':') !== false) && (preg_match('~^(?:(?:s?f|ht)tps?|mailto):~i', $value) == 0))
{
$node->removeAttributeNode($attribute);
}
所以,我的两个明显问题是:
经过大量测试、思考和研究,我想出了 following (rather simple) implementation它似乎不受我可以向其发起的任何 XSS 攻击向量的影响。
我非常感谢您所有宝贵的回答,谢谢。
最佳答案
你提到href和 action作为地方javascript:可以显示 URL,但您缺少 src一堆其他 URL 加载属性中的属性。
Line 399 of the OWASP Java HTMLPolicyBuilder是白名单 HTML sanitizer 中 URL 属性的定义。
private static final Set<String> URL_ATTRIBUTE_NAMES = ImmutableSet.of( "action", "archive", "background", "cite", "classid", "codebase", "data", "dsync", "formaction", "href", "icon", "longdesc", "manifest", "poster", "profile", "src", "usemap");
HTML5 Index包含属性类型的摘要。它没有提到一些有条件的东西,比如 <input type=URL value=...>但是,如果您扫描该列表以查找 valid URL和 friend 们,您应该对 HTML5 添加的内容有一个不错的了解。 HTML 4 attributes 的集合类型为 %URI信息也很丰富。
您的协议(protocol)白名单看起来与 OWASP sanitizer 非常相似一。添加ftp和 sftp看起来很无害。
HTML 元素和属性的安全相关架构信息的良好来源是 Caja JSON whitelists由 Caja JS HTML sanitizer 使用.
您打算如何渲染生成的 DOM?如果你不小心,那么即使你去掉所有的<script>元素,攻击者可能会得到一个有问题的渲染器来生成浏览器解释为包含 <script> 的内容。元素。考虑不包含脚本元素的有效 HTML。
<textarea></textarea><script>alert(1337)</script></textarea>
有缺陷的渲染器可能会输出以下内容:
<textarea></textarea><script>alert(1337)</script></textarea>
其中确实包含一个脚本元素。
(完全披露:我编写了上面提到的两种 HTML 清理程序。)
关于php - XSS - 哪些 HTML 标签和属性可以触发 Javascript 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6976053/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我试图使用yard记录一些Ruby代码,尽管我所做的正是所描述的here或here#@param[Integer]thenumberoftrials(>=0)#@param[Float]successprobabilityineachtrialdefinitialize(n,p)#initialize...end虽然我仍然得到这个奇怪的错误@paramtaghasunknownparametername:the@paramtaghasunknownparametername:success然后生成的html看起来很奇怪。我称yard为:$yarddoc-mmarkdown我做错了什么?
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的