Mat*_*ner 6 .net c# xss encoding asp.net-web-api
我们在我们的应用程序中使用.NET Framework(我们的目标是.NET Framework 4.5.2)提供的System.Web.Security.AntiXss.AntiXssEncoder类,但是遇到包含阿拉伯字符的字段的问题.
以下控制台应用程序演示了我们遇到的问题:
using System;
using System.Collections.Generic;
using System.Web.Security.AntiXss;
namespace EncodingTest
{
class Program
{
static void Main(string[] args)
{
var source = new List<string> { "Hello World", "???", "blöd", "الم" };
foreach (var testString in source)
{
var antiXssEncoded = AntiXssEncoder.HtmlEncode(testString, false);
Console.WriteLine($"{testString} => {antiXssEncoded}");
Console.WriteLine();
}
Console.ReadKey();
}
}
}
Run Code Online (Sandbox Code Playgroud)
第二个列表项中的阿拉伯字符已正确编码,但如果第四个元素中已编码的字符通过编码器,则"&"字符将再次编码,然后在&网页上无法正确显示.
应用程序的输出显示(未编码的阿拉伯字符在控制台中显示为"???"):
Hello World => Hello World
??? => على
blöd => blöd
الم => &#1575;&#1604;&#1605;
Run Code Online (Sandbox Code Playgroud)
有什么方法可以防止这种情况吗?
我们目前接受用户输入并将其传递通过编码器,然后将其保存在我们的数据库中 - 然后将此编码数据发送到前端并显示.如果用户编辑字符串并将其传递回我们的后端,我们会在保存之前再次对其进行编码,因此我们会遇到&符号的问题.
我已经看到一些关于其他问题的评论说用户输入应该保存在数据库中,然后在发送显示之前通过编码器; 我们可以做到这一点,但必须确保在数据输出的所有不同位置编码.它也无法解决从前端返回的编辑数据的问题 - 我们仍然不知道数据是否被编码,并且只是在下次发送显示时才对其进行重新编码.
有没有一些方法,使编码器不重新编码的字符,如ا到&#1575;,还是我们只是做错了什么?
这是预期行为,您不应试图阻止它。
传递给的字符串HtmlEncode通常由程序的用户提供,并且最终应该以传递给方法的确切方式出现在 HTML 中。这意味着所有&(以及类似的情况)都需要进行编码。例如,如果用户输入的内容与您在呈现的 HTML 中"use '&' to represent '&' in HTML"确实不期望的内容相同。"use '&' to represent '&' in HTML"
如何解决问题:
您确实必须知道您正在使用的字符串内容的编码是什么。绝对没有办法知道字符串是否经过 HTML 编码或编码了多少次。这同样适用于 url 编码(也称为 %-encoding like ?q=search%20alot)和 JavaScript-string-value 编码(like I said \"Hi Matt\"\nin this is long & winded post)。
这意味着您要么需要使用一致的编码存储字符串,要么存储应用于字符串的编码类型以及每个字符串(即数据库中的下一列)。以下是我针对不同情况使用的描述:“这是纯文本,未编码”,“这是已准备好渲染 HTML,已清理”,“这是用户提供的原始 HTML,未清理”,“这是纯文本编码为 JavaScript 字符串(使用\n)”。
将字符串错误分类为“准备渲染 HTML,不要 HtmlEncode”存在重大危险 - 您可以轻松地将恶意用户的输入渲染为 HTML 并导致跨站点脚本 (XSS) 漏洞。您获得的过度编码行为更安全,但也会产生无用的输出 - 因此要求字符串数据具有明确定义的编码。
请注意,方法的常见用法HtmlEncode是最终将其呈现为原始 HTML - 根据您使用的框架,可能有更好的方法来处理它。如果您使用 ASP.Net MVC,则常规的@Model.Text将提供所有必要的编码。
作为指定编码的方法之一,您可以使用HtmlString类来声明“字符串值表示可以按原样在 HTML 中安全呈现的原始 HTML”。将输出存储HtmlEncode在类型的变量/属性中可能是个好主意HtmlString,这样每个人都知道该值已被清理并应直接呈现。
| 归档时间: |
|
| 查看次数: |
306 次 |
| 最近记录: |