使用markdown防止脚本注入

时间:2010-12-23 17:54:52

标签: c# javascript html markdown javascript-injection

我想在用户输入以下内容时保护我的页面:

<script type="text/javascript">
    alert("hi");
</script>

我正在使用ShowDown:

jQuery.fn.markDown = function() 
{
    return this.each(function() {
        var caller = this;
        var converter = new Showdown.converter();

        var text = $(caller).text();
        var html = converter.makeHtml(text);

        $(caller).html(html);
    });
}

4 个答案:

答案 0 :(得分:3)

如果要在.NET服务器端代码上清理html,我建议您在将标记转换为html之后使用Microsoft web protection library,然后再将其呈现给页面。 例如以下片段:

x = @"<div>safe</div>
       <script type='text/javascript'>
         alert('hi');
       </script>";
return Microsoft.Security.Application.Sanitizer.GetSafeHtmlFragment(x);

返回<div>safe</div>

http://wpl.codeplex.com/

答案 1 :(得分:1)

ShowDown页面会删除任何javascript,所以我不知道你的意思。但你不能在客户端上这样做。如果永远不会将其提交给服务器,则无关紧要。但是,99%的情况下,您希望将其存储在服务器上。

我认为最好的方法是从提交的html中创建服务器端DOM对象(可能是欺骗并绕过ShowDown)并查找任何脚本或其他危险标记。这不是那么简单!

对我来说,最好的妥协是使用服务器端降价语言(如https://github.com/charliesome/bbsharp),然后您可以使用它来生成html。然后,您将html编码任何html,然后将其传递给将markdown转换为HTML的工具。

答案 2 :(得分:1)

可能有效的解决方案之一是在使用Showdown转换之前剥离源中的所有标记或对标记进行HTML编码。

关于如何删除所有HTML标记,有几种方法可以在这个问题中找到:

Strip HTML from Text JavaScript

有关如何对标记进行HTML编码,您可以使用:

myString.replace(/</g, '&lt;').replace(/>/g, '&gt;');

注意:这将使您无法在Showdown中使用HTML。

答案 3 :(得分:0)

我使用HTML Purifier,它非常适合过滤用户输入,并且可以高度自定义。

我假设您可以将它与MarkDown一起使用,但我从未尝试过。