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