代码之家  ›  专栏  ›  技术社区  ›  leora Matt Lacey

为什么我需要做html.encode()。

  •  5
  • leora Matt Lacey  · 技术社区  · 14 年前

    如果我有一个用户将数据输入到富文本编辑器(小编辑器)中,并提交我正在存储到数据库中的数据,然后检索以显示在其他动态网页上,那么为什么我需要在这里编码呢?

    唯一的原因是有人可能将javascript粘贴到富文本编辑器中吗?还有其他原因吗?

    9 回复  |  直到 14 年前
        1
  •  16
  •   Web Logic    14 年前

    安全是原因。

    最明显/最常见的原因是 Cross-Site-Scripting (XSS)。这是您可能在站点中看到的安全问题的根本原因。

    跨站点脚本(XSS)是一种类型 计算机安全漏洞 通常在Web应用程序中找到 使恶意攻击者能够 将客户端脚本插入Web 其他用户查看的页面。安 利用跨站点脚本 攻击者可以使用漏洞 绕过访问控制,如 同一原产地政策。跨站点 在网站上执行的脚本是 大约80%的安全 赛门铁克记录的漏洞 截至2007。 1 它们的影响范围可能很广 从小麻烦到重大麻烦 安全风险,取决于 处理数据的敏感度 易受攻击的地点,以及 安全缓解措施由 网站的所有者。

    另外,如下面的注释所示,您的站点布局也可能被搞砸。

    你需要 Microsoft Anti-Cross Site Scripting Library

    更多资源

    http://forums.asp.net/t/1223756.aspx

        2
  •  3
  •   SLaks    14 年前

    你犯了一些错误。

    如果您接受来自富文本编辑器的HTML格式文本,则 不能 呼叫 Html.Encode 或者它将对所有HTML标记进行编码,您将看到原始标记而不是格式化文本。

    但是,您仍然需要防止XSS。

    换句话说,如果用户输入以下HTML:

    <b>Hello!</b>
    <script>alert('XSS!');</script>
    

    你想保留 <b> 标记,但删除(不编码) <script> 标签。
    同样,您需要删除内联事件属性(如 onmouseover )和javascript URL(如 <a href="javascript:alert('XSS!');>Dancing Bunnies!</a> )

    您应该通过一个严格的XML解析器运行用户的HTML,并在保存内容时维护一个严格的标记和属性的白名单。

        3
  •  3
  •   C. Dragon 76    14 年前

    我觉得你把“编码”和“擦洗”混淆了。

    如果你想接受 文本 从用户那里,你需要 编码 在将其呈现为HTML之前,它是HTML。这样,文本

    a < b
    

    HTML编码为

    a &lt; b
    

    在HTML浏览器中呈现为:

    A & B;B
    

    如果你想接受 HTML 对于一个用户(在本例中听起来像您这样),它已经是HTML格式,所以您不想再次调用HTML.Encode。但是,您可能希望清除它以删除某些不允许的标记(如脚本块)。

        4
  •  2
  •   Abe Miessler    14 年前

    安全是主要原因。

        5
  •  2
  •   Vivian River    14 年前

    用户不仅可以输入javascript代码或其他一些淘气的东西,还需要使用HTML编码来在页面上显示某些字符。您不希望您的页面中断,因为您的数据库包含:“nice page:->”。

    此外,如果要将代码输入数据库,请确保对数据库的输入进行“sanatize”。

        6
  •  1
  •   Dustin Laine    14 年前

    是的,如果有人将恶意字符串输入到富文本编辑器中,它将阻止JavaScript执行。但是,纯文本javascript并不是您唯一关心的问题,例如,这是一个XSS:

    <IMG SRC=&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041>
    

    在这里查看一系列不同的XSS选项; http://ha.ckers.org/xss.html

        7
  •  1
  •   John Ptacek    14 年前

    作为旁白……MVC2实现了新功能,因此您不再需要调用html.encode

    如果更改视图语法

    MVC将自动为您编码。它使事情变得更容易/更快。同样,仅MVC2

        8
  •  0
  •   Atanas Korchev    14 年前

    另一个原因是一些用户可以输入一些结束标记 </div></table> 可能会破坏网站的布局。 如果使用的是HTML编辑工具,请确保生成的HTML在不使用编码将其嵌入页面之前是有效的。为此,需要进行一些服务器端解析。你可以使用 HtmlAgilityPack 这样做。

        9
  •  0
  •   Flory    14 年前

    按照你的建议去做的主要原因是为了逃避你的输出。因为您接受HTML并想输出它,所以不能这样做。你需要做的是过滤掉用户可以做的不安全的事情,或者至少不是你想要的。

    为此,我建议 AntiSamy .

    你可以演示一下 here .

    你所做的有很多继承风险,你应该仔细考虑。