2009-09-29 50 views
2

我正在研究StackQL.net,它只是一个简单的网站,它允许您在StackOverflow公共数据集上运行ad hoc tsql查询。这是丑陋的(我不是一个平面设计师),但它的作品。HTMLEncode script tags only

我做的选择之一是我做不是想要html编码后期主体的全部内容。这样,您可以看到查询中帖子的一些格式。它甚至会载入图像,我很好。

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

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

回答

3

您可能需要修改HTMLSanatize script以符合您的目的。它由Jeff Atwood编写,允许显示某些类型的HTML。既然它是为堆栈溢出编写的,它也适合你的目的。

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

+0

这很可能最终会成为公认的答案,但直到本周末我才会尝试。 – 2009-10-01 13:24:37

2

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

有超越简单的脚本元素攻击媒介的主机。

执行white list,而不是黑名单。

0

简单地打破<script>标签呢?对于该标签,只跳出<>,最后以&lt;script&gt;结束,这可能是一种简单而简单的方法。

当然链接是另一个向量。您还应该禁用href='javascript:'的每个实例,并且每个属性都以on *开头。

可以肯定的是,它可以从轨道上消除它。

+0

替换< and >会打破我想允许的其他格式。 – 2009-09-29 13:45:52

+0

@Joel Coehoorn:替换

0

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

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

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

要么逃避一切,以便任何HTML以纯文本形式显示,或使用完整的基于解析器和白名单的sanitiser。 (并保持最新状态,因为即使这是一项艰巨的工作,并且经常会在其中发现新的洞)。

但是您是否使用与SO本身相同的Markdown系统来呈现帖子?这将是显而易见的事情。我不能保证在Markdown中没有任何可以允许跨站脚本的漏洞(过去肯定有过,而且可能还有一些比较复杂的系统仍然存在)。但至少你不会比没有更安全的!

+0

是的,我想我会用George提出的Html Sanitize脚本。 – 2009-09-29 14:59:04