2

我不知道我这样做是否正确。
我第一次构建一些东西来防止页面上的攻击。
我将从底部开始:
我有财产:

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 标签。断线工作正常。我可以用粗体、斜体等设置文本样式。

但如果我输入:

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


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

4

2 回答 2

5

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

你在哪里使用它?

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

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

但是请记住,新版本的 AntiXSS 库有点过于严格,并且会去除<strong>可能<br>不需要的标签。

作为 AntiXSS 库的替代方案,您可以使用HTML Agility Pack来完成这项工作。里克·斯特拉尔blogged about a sample implementation

于 2013-01-30T21:29:06.130 回答
1

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

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

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

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

于 2013-01-30T21:09:44.103 回答