仅限HTMLEncode脚本标记

时间:2009-09-29 13:39:27

标签: asp.net security html-encode

我正在研究StackQL.net,它只是一个简单的网站,允许您在StackOverflow公共数据集上运行ad hoc tsql查询。这很难看(我不是平面设计师),但它确实有效。

我做出的一个选择是我想要对邮件正文的全部内容进行html编码。这样,您可以从查询中的帖子中看到一些格式。它甚至会加载图像,我很好。

但我担心这也会使<script>个标签处于活动状态。有人可以在stackoverflow答案中植入恶意脚本;他们甚至可以立即删除它,所以没有人看到它。人们在第一次访问时尝试的最常见查询之一是简单的Select * from posts,所以稍微有点时间,这样的脚本最终可能会在几个人的浏览器中运行。在更新(希望即将发布)10月数据导出之前,我想确保这不是一个问题。

什么是最好,最安全的方法,以确保脚本标记最终编码?

6 个答案:

答案 0 :(得分:3)

您可能需要修改HTMLSanatize script以符合您的目的。它由Jeff Atwood编写,允许显示某些类型的HTML。因为它是为Stack Overflow编写的,所以它也符合你的目的。

我不知道Jeff目前部署的是“最新”,但这是一个很好的起点。

答案 1 :(得分:2)

不要忘记onclickonmouseover等或javascript:psuedo-urls(<img src="javascript:evil!Evil!">)或CSS(style="property: expression(evil!Evil!);")或...

除了简单的脚本元素之外,还有许多攻击媒介。

实施white list,而不是黑名单。

答案 2 :(得分:1)

如果消息是XHTML格式,那么您可以执行XSL转换并编码/剥离您不想要的标记和属性。如果你使用像TinyMCE或CKEditor这样的东西来提供输出XHTML的所见即所得编辑器,它会变得容易些。

答案 3 :(得分:0)

如何简单地打破<script>标签?只转发<>该标记,最后只有&lt;script&gt;,这可能是一种简单易行的方法。

当然链接是另一个向量。您还应该禁用href='javascript:'的每个实例,以及以on *。

开头的每个属性

可以肯定的是,它是从轨道上进行的。

答案 4 :(得分:0)

  

但我担心这也会使<script个标签处于活动状态。

哦,这只是HTML'恶意内容'的开头,可能导致跨站点脚本。还有事件处理程序;内联,嵌入和链接的CSS(表达式,行为,绑定),Flash和其他可嵌入的插件,iframe用于利用网站,javascript:和其他危险方案(比你想象的还要多!)在每个可以接受的地方URL,元刷新,UTF-8 overlongs,UTF-7错误嗅探,数据绑定,VML和其他非HTML内容,被许可的浏览器解析为脚本的破坏标记......

简而言之,任何使用简单正则表达式清理HTML的快速修复尝试都会失败。

要么逃避所有内容,以便将任何HTML显示为纯文本,要么使用完整的基于解析器和白名单的杀毒软件。 (并保持最新,因为即使这是一项艰苦的工作,并且经常会有新发现的漏洞。)

但是你不是使用与SO本身相同的Markdown系统来渲染帖子吗?那将是显而易见的事情。我不能保证Markdown中没有允许跨站点脚本的漏洞(过去肯定有过,而且可能还有一些比较模糊的漏洞,因为它是一个非常复杂的系统)。但至少你不会比SO更不安全!

答案 5 :(得分:-1)

使用 Regex 将脚本标签替换为编码标签。这将过滤其中包含单词“ script”并HtmlEncode的标签。因此,所有脚本标签(例如<script></script><script type="text/javascript">等)都将被编码,而不会编码字符串中的其他标签。

Regex.Replace(text, @"</?(\w+)[^>]*>",
            tag => tag.Groups[1].Value.ToLower().Contains("script") ? HttpUtility.HtmlEncode(tag.Value) : tag.Value,
            RegexOptions.Singleline);