我们在我们的应用程序中使用.NET Framework提供的System.Web.Security.AntiXss.AntiXssEncoder类(我们的目标是.NET Framework 4.5.2),但是它们遇到了包含阿拉伯字符的字段问题。如何防止阿拉伯字符被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();
}
}
}
在第二个列表项的阿拉伯字符正确编码,但如果在第四元素已编码的字符通过编码器通过,那么'&'字符将被第二次编码为&
,然后在网页上无法正确显示。
这从应用程序输出显示此(未编码阿拉伯字符显示为在控制台“???”):
Hello World => Hello World
??? => على
blöd => blöd
الم => &#1575;&#1604;&#1605;
是否有任何的方法来防止这种情况?
我们目前采取用户输入并将其传递到编码器,然后将其保存在我们的数据库中,然后将此编码数据发送到前端并显示出来。如果用户编辑字符串并将其传回给我们的后端,我们再次对其进行编码,然后再保存它,所以我们得到了&符号的问题。
我在其他问题上看到过一些评论,说用户输入应该保存在数据库中,然后在发送给显示器之前通过编码器;我们可以做到这一点,但是必须确保在输出数据的所有不同位置进行编码。这对于从前端返回的编辑数据的问题也无济于事 - 我们仍然不知道数据是否被编码,并且在下次发送显示时会重新编码。
有什么方法可以让编码器不会像ا
那样将字符重新编码为&#1575;
,或者我们只是在做错什么?
你必须知道一个字符串是否被编码,总是。防止双重编码问题的唯一方法是不重新编码您知道要编码的字符串。是的,数据库*应该*包含原始的,未转义的值,因为替代方案是当您尝试查找“على”时,数据库代码突然必须知道HTML编码。正确编码字符串以进行显示和传输始终是前端的责任。 –
谢谢@jeroenmostert - 这是有道理的,我可以,我们正在做的只是错误的 –