使用HTMLEncode显示上传的文字是否足够?

时间:2012-01-30 21:35:15

标签: javascript asp.net xss html-encode

我们允许用户上传图片并提供文字说明。用户可以通过javascript通过弹出框(实际上是div)查看。上传的文本是javascript函数的参数。我担心XSS并且还发现了HTMLEncode()的问题。
我们正在使用HTMLEncode来防范XSS。不幸的是,我们发现HTMLEncode()只替换了'<'和'>'。我们还需要替换人们可能包含的单引号和双引号。是否有一个函数可以执行所有这些特殊类型字符,或者我们必须通过.NET string.Replace()手动执行此操作吗?

4 个答案:

答案 0 :(得分:2)

  

不幸的是,我们发现HTMLEncode()只替换'<'和'>'。

假设您正在讨论HttpServerUtility.HtmlEncode,那么 会对双引号字符进行编码。由于某种原因,它还将范围U + 0080编码为U + 00FF作为字符引用。

它不编码的是单引号。有点遗憾,但你通常可以通过在HTML / XML中仅使用双引号作为属性值分隔符来解决它。在这种情况下,HtmlEncode足以阻止HTML注入。

但是,javascript位于您的代码中,而HtmlEncode绝对不足以将内容转移到JavaScript字符串文字中。 JavaScript编码与HTML编码不同,所以如果你担心单引号,那么你需要使用JS字符串编码器。

(一个JSON编码器是一个很好的开端,但你要确保它编码U + 2028和U + 2029字符,这些字符令人讨厌,在JSON中有效,但在JavaScript中却没有。你也可能需要一些如果你在HTML上下文中有JavaScript,那么各种各样的HTML转义。这可能会变得毛茸茸;通常通过在纯HTML中隐藏你想要的内容来避免这些问题更好,例如在隐藏的输入或自定义属性中,您可以使用标准的HTML转义,然后从JS中的DOM中读取该数据。)

答案 1 :(得分:0)

如果文本描述嵌入在JavaScript字符串文字中,那么为了防止XSS,您需要转义特殊字符,如引号,反斜杠和换行符。 HttpUtility.HtmlEncode方法适合此任务。

如果JavaScript字符串文字依次嵌入HTML中(例如,在属性中),那么除了JavaScript转义之外,您还需要应用HTML编码。

您可以使用Microsoft的Anti-Cross Site Scripting库来执行必要的转义和编码,但我建议您尽量避免这样做。例如,如果您正在使用WebForms,请考虑使用<asp:HiddenField>控件:在服务器端代码中设置其Value属性(将自动进行HTML编码),并访问其{来自客户端代码的{1}}属性。

答案 2 :(得分:0)

你怎么用这个扩展函数htmlencode所有输入:

private string HtmlEncode(string text)
        {
            char[] chars = HttpUtility.HtmlEncode(text).ToCharArray();
            StringBuilder result = new StringBuilder(text.Length + (int)(text.Length * 0.1));

            foreach (char c in chars)
            {
                int value = Convert.ToInt32(c);
                if (value > 127)
                    result.AppendFormat("&#{0};", value);
                else
                    result.Append(c);
            }

            return result.ToString();
        }

此函数会将所有非英文字符,符号,引号等转换为html实体。 尝试一下,让我知道这是否有帮助..

答案 3 :(得分:0)

如果您使用的是ASP.NET MVC2或ASP.NET 4,则可以将&lt;%=替换为&lt;%:来对输出进行编码。它可以安全地用于它看起来的一切(比如HTML Helpers)。

这里有一个很好的写法:New <%: %> Syntax for HTML Encoding Output in ASP.NET 4 (and ASP.NET MVC 2)