我使用AntiXSS但我仍然可以破解页面

时间:2013-01-30 20:17:30

标签: asp.net-mvc asp.net-mvc-3 tinymce xss antixsslibrary

我不知道我是否正确行事。
我第一次建立一些东西来阻止对页面的攻击 我将从底部开始:
我有财产:

public string Description {get;set;}

用户可以通过tinyMCE

设置它的值
tinyMCE.init({
            mode: "textareas",
            theme: "advanced",
            encoding : "xml"...

在我将其保存在数据库之前的控制器中我做了:

model.Description = HttpUtility.HtmlDecode(model.Description);

在数据库中,我有一个像:

的值
<p>bla bla bla</p>

我在我的项目中添加了AntiXSS库:

public class AntiXssEncoder : HttpEncoder
    {
        public AntiXssEncoder() { }

        protected override void HtmlEncode(string value, TextWriter output)
        {
            output.Write(Encoder.HtmlEncode(value)); // on breakpoint code always get in here
        }
...

当我从数据库显示数据时,我使用:

@Html.Raw(Model.Place.Description)

它工作正常我只看到文字。没有Html标签。 Breaklines工作正常。我可以用粗体,斜体等方式设置文本样式。

但如果我进入:

<script>alert(open to attack);</script>


我有警报窗口。我不明白我是否需要做更多的事情来防止这种情况发生?

2 个答案:

答案 0 :(得分:5)

  

我将AntiXSS库添加到我的项目

你在哪里使用它?

确保您不仅添加了AntiXSS,而且还实际使用了它:

@Html.Raw(Microsoft.Security.Application.Sanitizer.GetSafeHtmlFragment(Model.Place.Description))

但请记住,AntiXSS库的新版本有点过于严格,会删除<strong><br>之类的标签,这可能是不合适的。

作为AntiXSS库的替代方案,您可以使用HTML Agility Pack来完成这项工作。 Rick Strahl blogged about a sample implementation

答案 1 :(得分:1)

首先,您正在显示RAW Html-未以任何方式编码。 如果你想显示Html,理想情况下你应该做几件事。

  1. 使用GetSafeHtmlFragment使用antixss Sanitizer类对其进行消毒。 请注意,这不会完全保护你。 在保存到数据库之前执行此操作。

  2. 实现尚未完全支持的标头以防止其他脚本运行。这仅限于一些现代浏览器。

  3. 或者......不允许html或不允许任何已知字符标记之外的HTML。即白名单方法,因此您允许<strong>,并且不允许在其他字母数字字符之外进行任何操作。

相关问题