- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我们在应用程序中使用 .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();
}
}
}
第二个列表项中的阿拉伯字符已正确编码,但如果第四个元素中已编码的字符通过编码器传递,则 '&' 字符将再次编码为 &
然后无法在网页上正确显示。
应用程序的输出显示了这一点(未编码的阿拉伯字符在控制台中显示为“???”):
Hello World => Hello World
??? => على
blöd => blöd
الم => &#1575;&#1604;&#1605;
有什么办法可以避免这种情况吗?
我们目前接受用户输入并通过编码器传递,然后将其保存在我们的数据库中 - 然后将此编码数据发送到前端并显示。如果用户编辑字符串并将其传递回我们的后端,我们会在保存之前再次对其进行编码,因此我们会遇到与符号有关的问题。
我看到一些关于其他问题的评论说用户输入应该在输入时保存在数据库中,然后在发送显示之前通过编码器传递;我们可以这样做,但是必须确保在数据输出的所有不同位置都对其进行了编码。这也无助于解决从前端返回的已编辑数据的问题——我们仍然不知道数据是否经过编码,只会在下次发送显示时重新编码。
有没有什么方法可以让编码器不把像ا
这样的字符重新编码成ا
,或者我们只是做错了什么?
最佳答案
这是预期的行为,您不应试图阻止它。
传递给 HtmlEncode
的字符串通常由您的程序的用户提供,并且最终应该以传递给该方法的确切方式出现在 HTML 中。这意味着所有 &
(和类似情况)都需要编码。例如。如果用户输入类似 "use '&'在 HTML 中表示 '&'”
您真的不会期望 在呈现的 HTML 中“使用 '&' 在 HTML 中表示 '&'”
。
如何解决问题:
您确实必须知道您正在使用的字符串内容的编码是什么。绝对没有办法知道字符串是否经过 HTML 编码或编码了多少次。这同样适用于 url 编码(也称为 % 编码,如 ?q=search%20alot
)和 JavaScript 字符串值编码(如 I said\"Hi Matt\"\nin这是一篇冗长而冗长的文章
)。
这意味着您要么需要存储具有一致编码的字符串,要么存储应用于字符串的编码类型以及每个字符串(即数据库中的下一列)。以下是我将用于不同情况的描述:“这是纯文本,未编码”,“这是准备呈现 HTML,已清理”,“这是用户提供的原始 HTML,未清理”,“这是编码为 JavaScript 字符串的纯文本(使用 \n
)”。
将字符串错误分类为“准备呈现 HTML,不要 HtmlEncode”的危险很大 - 您可以轻松地将恶意用户的输入呈现为 HTML 并导致跨站点脚本 (XSS) 漏洞。您获得的过度编码行为更安全,也可能产生无用的输出 - 因此要求字符串数据带有定义明确的编码。
请注意,HtmlEncode
方法的常见用法是最终将其呈现为原始 HTML - 根据您使用的框架,可能有更好的方法来处理它。如果您使用的是 ASP.Net MVC,则常规 @Model.Text
将提供所有必要的编码。
作为指定编码的方法之一,您可以使用 HtmlString类来声明“字符串值表示可以按原样安全地在 HTML 中呈现的原始 HTML”。将 HtmlEncode
的输出存储在 HtmlString
类型的变量/属性中可能是个好主意,这样每个人都知道该值已被清理并应直接呈现。
关于c# - 如何防止阿拉伯字符被AntiXssEncoder重新编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45193923/
我在 mysql 数据库中有一个“价格”字段,其中包含以阿拉伯或波斯数字表示的产品价格。 数字示例:12345567890 //1234567890 我不知道如何格式化它以便以用户友好的方式格式化。我
由于单独使用 prawn gem 时阿拉伯字母显示为未知字符,因此我安装了 Arabic-Prawn gem 0.0.1 以阿拉伯语打印数据。我用下面的代码作为测试 Prawn::Document.g
我是一名优秀的程序员,十分优秀!