Agr*_*dha 3 c# antixsslibrary asp.net-core-2.1
AntiXssEncoder.HtmlEncode 仅支持.Net 框架。当我们的应用程序位于 .net core 2.1 中时,我可以使用 WebUtility.HtmlEncode 进行 Antixss 吗?
\n\nAntiXssEncoder.HtmlEncode 仅支持.Net 框架。当我们的应用程序位于 .net core 2.1 中时,我可以使用 WebUtility.HtmlEncode 进行 Antixss 吗?
\n
正确的。
\n但我想强调的是,不存在“反 XSS HTML 编码器”这样的东西,因为所有正确实现的 HTML 编码器在正确使用时都会保护您的网站免受 XSS 攻击。
\nAntiXssEncoder,但考虑到当时的主要HtmlEncode实现实际上是有缺陷的,并且不安全可能与它有关,但现在那已经是古老的历史了。)在.NET Core 2.1中,您只需要使用System.Net.WebUtility.HtmlEncode.
在其他 .NET 版本(尤其是历史版本)中,事情很复杂,如果你敢的话,请继续阅读......
\nAntiXssEncoder(又名AntiXss和AntiXss.Encoder)存在 - 以及为什么它在 2021 年已过时:NuGet 包(又名)AntiXssEncoder中的类在移至.AntiXssMicrosoft.Security.Application.AntiXssSystem.Web.Security.AntiXss
AntiXssEncoder、Encoder、 和AntiXss只是相同底层实现的替代 API Encoder。该AntiXssEncoderinSystem.Web.Security.AntiXss在 .NET Core 2.1 中不可用。但这并不是一个严重的问题:
Microsoft.Security.Application.AntiXss创建原始版本HttpUtility.HtmlEncode是因为它不编码单撇号字符,因此被认为是不安全的,因此 XSS 攻击可能针对.aspx使用单撇号分隔 HTML 属性的 ASP.NET 1.x 和 ASP.NET 2.x WebForms ( ) 页面包含用户指定的值。
例如:
\nString userProvidedValue = "bad.gif\' onerror=\'alert()";\n<img src=\'<%= this.Server.HtmlEncode( userProvidedValue ) %>\' />\nRun Code Online (Sandbox Code Playgroud)\n...将呈现为:
\n<img src=\'bad.gif\' onerror=\'alert()\' />\nRun Code Online (Sandbox Code Playgroud)\n然而,这个问题在 ASP.NET 4.0 中得到了修复,并HttpUtility.HtmlEncode进行了更正,对这些撇号进行 HTML 编码。因此,上面完全相同的代码现在将呈现如下,其中不会显示alert():
<img src=\'bad.gif' onerror='alert()\' />\nRun Code Online (Sandbox Code Playgroud)\nAntiXssEncoder还支持指定排除的 Unicode 代码点或Char值的列表,添加此列表是因为AntiXssEncoder默认对0xFFFF 以上的所有 Char值(不是代码点!)进行十六进制编码,不幸的是,这意味着即使是完全安全的阿拉伯语、希伯来语、汉字、等将被转义,使原始 HTML 几乎不可读,并使输出 HTML 长度膨胀。
例如,(乱码)字符串"\xd9\x84\xd9\x83 \xd8\xa3\xd9\x86 \xd9\x83\xd9\x84\xd8\xa7"将被呈现为"لك أن كلا"- 这不好。
幸运的是,AntiXssEncoder.MarkAsSafe可以用于由程序员自行决定排除字符范围。
到 .NET Core 2.1 发布时,该类System.Net.WebUtility(当然不要与 混淆System.Web.HttpUtility)得到了改进,因此它不会不必要地对高Char值进行十六进制编码,并且还会对撇号进行 HTML 编码,因此为什么AntiXssEncoder不再使用需要。
在 .NET Core 3.1(及更高版本,包括 .NET 5 和 .NET 6)中,情况进一步改进,但也有点令人困惑......
\nSystem.Text.Encodings.Web.HtmlEncoder添加了。这是一个单独的实现(而不是简单地包装WebUtility),它恢复了AntiXssEncoder从编码中排除字符范围的能力,以防万一您需要该功能。但在我看来,这有点极端。\nHtmlEncoder.Create(TextEncoderSettings)已配置的TextEncoderSettings对象并排除所需的字符范围来完成此操作。在 .NET Core 3.1 中,为了向后兼容,微软重新带回了 .NET Core 3.1System.Web.HttpUtility,但这只是 .NET Core 的另一个包装器WebUtility.HtmlEncode。
HtmlAttributeEncode- ,它不编码单撇号。在我看来,没有充分的理由使用这种方法。事实上,我很惊讶微软没有用 来注释它[Obsolete]。但是,在 .NET Core(以及 .NET 5 及更高版本)中,没有任何方法可以对文本进行 HTML 编码,以便使用命名实体而不是十六进制编码实体(除了<、>l和&)。
AntiXssEncoder.HtmlEncode(bothMicrosoft.Security和System.Web.Security) 方法都有一个useNamedEntities参数,该参数涉及已知实体名称的大型硬编码表,例如,\xc2\xa3用变得£而不是。\n&#nnnn;为编码Unicode 代码点的方法,特别是与其他一些字符值相反的方法。编码方案,而以前在 HTML4 中,规范引用 ISO 10646(又名UCS)字符,这不是我们今天所知的 Unicode。(我怀疑如果页面没有使用 Unicode(如 Shift-JIS)编码,浏览器可能会尝试根据文档的编码/代码页映射字符,但我可能是错的)。最后,这是一个比较所有不同的输出的表格HtmlEncode2021 年 .NET 中所有不同方法的输出:
HtmlEncode.NET Framework 4.8 中可用的方法HtmlEncode方法被排除在外,因为它们只是其他实现的包装器:\nSystem.Web.HttpServerUtility(又名Server.HtmlEncode)仅转发至HttpUtility.HtmlEncode。System.Web.UI.HtmlTextWriter.WriteEncodedText还转发至HttpUtility.HtmlEncode.System.Web.HttpUtility.HtmlEncode:\nHttpUtility.HtmlEncode方法仅转发到System.Web.Util.HttpEncoder.Current.HtmlEncode(s)\nSystem.Web.Util.HttpEncoder.**Current**可以在运行时替换,这就是 ASP.NET 4.x(我忘了是哪个)的更新如何能够让几乎每个人都使用(当时要好得多),而AntiXssEncoder无需人们更改现有的应用程序代码。整洁的。System.Web.Util.HttpEncoder.**Current**可以指向任何兼容的实现,而System.Web.Util.HttpEncoder.**Default**`` is _always_ just a wrapper over WebUtility.HtmlEncode`。System.Web.Util.HttpEncoder.Default- 如上所述,这只是另一个System.Net.WebUtility包装器。| # | 输入 | 代码点 | UTF-8 字节 | UTF-16 字节 | System.Net.WebUtility.HtmlEncode | System.Text.Encodings.Web.HtmlEncoder | System.Web.Security.AntiXss.AntiXssEncoder.HtmlEncode(false) | System.Web.Security.AntiXss.AntiXssEncoder.HtmlEncode(true) |
|---|---|---|---|---|---|---|---|---|
0 | abc | U+0061 U+0062 U+0063 | 61 62 63 | 61 00 62 00 63 00 | abc | abc | abc | abc |
1 | < | U+003C | 3C | 3C 00 | < | < | < | < |
2 | > | U+003E | 3E | 3E 00 | > | > | > | > |
3 | & | U+0026 | 26 | 26 00 | & | & | & | & |
4 | " | U+0022 | 22 | 22 00 | " | " | " | " |
5 | \' | U+0027 | 27 | 27 00 | ' | ' | ' | ' |
6 | \xc5\xb8 | U+009F | C2 9F | 9F 00 | \xc5\xb8 | Ÿ | Ÿ | Ÿ |
7 | | U+00A0 | C2 A0 | A0 00 |   |   |   | |
8 | \xc3\xbf | U+00FF | C3 BF | FF 00 | ÿ | ÿ | \xc3\xbf | ÿ |
9 | \xc4\x81 | U+0101 | C4 81 | 01 01 | \xc4\x81 | ā | \xc4\x81 | \xc4\x81 |
10 | ~ | U+007E | 7E | 7E 00 | ~ | ~ | ~ | ~ |
11 | | `U+007F` | `7F` | `7F 00` | |  |  |  | ||||
12 | \xc2\xa3 | U+00A3 | C2 A3 | A3 00 | £ | £ | \xc2\xa3 | £ |
13 | \xc3\xbf | U+00FF | C3 BF | FF 00 | ÿ | ÿ | \xc3\xbf | ÿ |
14 | \xe1\xb8\x82 | U+1E02 | E1 B8 82 | 02 1E | \xe1\xb8\x82 | Ḃ | Ḃ | Ḃ |
15 | | U+1F4A9 | F0 9F 92 A9 | 3D D8 A9 DC | 💩 | 💩 | 💩 | 💩 |
16 | | U+233B4 | F0 A3 8E B4 | 4C D8 B4 DF | 𣎴 | 𣎴 | 𣎴 | 𣎴 |
17 | | U+233B4 | F0 A3 8E B4 | 4C D8 B4 DF | 𣎴 | 𣎴 | 𣎴 | 𣎴 |
18 | \xd9\x84\xd9\x83 \xd8\xa3\xd9\x86 \xd9\x83\xd9\x84\xd8\xa7 | U+0644 U+0643 U+0020 U+0623 U+0646 U+0020 U+0643 U+0644 U+0627 | D9 84 D9 83 20 D8 A3 D9 86 20 D9 83 D9 84 D8 A7 | 44 06 43 06 20 00 23 06 46 06 20 00 43 06 44 06 27 06 | \xd9\x84\xd9\x83 \xd8\xa3\xd9\x86 \xd9\x83\xd9\x84\xd8\xa7 | لك أن كلا | لك أن كلا | لك أن كلا |
HtmlEncode方法:包含此表仅出于计算机考古原因。**它不适用于 .NET Framework 4.8,也不适用于任何版本的 ASP.NET Core 和 ASP.NET-for-.NET 5 或更高版本。
\n| # | 输入 | 代码点 | UTF-8 字节 | UTF-16 字节 | System.Web.HttpUtility.HtmlEncode (ASP.NET 1.1 and 2.0) | Microsoft.Security.Application.Encoder.HtmlEncode(false) | Microsoft.Security.Application.Encoder.HtmlEncode(true) |
|---|---|---|---|---|---|---|---|
0 | abc | U+0061 U+0062 U+0063 | 61 62 63 | 61 00 62 00 63 00 | abc | abc | abc |
1 | < | U+003C | 3C | 3C 00 | < | < | < |
2 | > | U+003E | 3E | 3E 00 | > | > | > |
3 | & | U+0026 | 26 | 26 00 | & | & | & |
4 | " | U+0022 | 22 | 22 00 | " | " | " |
5 | \' | U+0027 | 27 | 27 00 | \' | ' | ' |
6 | \xc5\xb8 | U+009F | C2 9F | 9F 00 | \xc5\xb8 | Ÿ | Ÿ |
7 | | U+00A0 | C2 A0 | A0 00 |   |   | |
8 | \xc3\xbf | U+00FF | C3 BF | FF 00 | ÿ | \xc3\xbf | ÿ |
9 | \xc4\x81 | U+0101 | C4 81 | 01 01 | \xc4\x81 | \xc4\x81 | \xc4\x81 |
10 | ~ | U+007E | 7E | 7E 00 | ~ | ~ | ~ |
11 | | `U+007F` | `7F` | `7F 00` | |  |  | ||||
12 | \xc2\xa3 | U+00A3 | C2 A3 | A3 00 | £ | \xc2\xa3 | £ |
13 | \xc3\xbf | U+00FF | C3 BF | FF 00 | ÿ | \xc3\xbf | ÿ |
14 | \xe1\xb8\x82 | U+1E02 | E1 B8 82 | 02 1E | \xe1\xb8\x82 | Ḃ | Ḃ |
15 | | U+1F4A9 | F0 9F 92 A9 | 3D D8 A9 DC | | 💩 | 💩 |
16 | | U+233B4 | F0 A3 8E B4 | 4C D8 B4 DF | | 𣎴 | 𣎴 |
17 | | U+233B4 | F0 A3 8E B4 | 4C D8 B4 DF | | 𣎴 | 𣎴 |
18 | \xd9\x84\xd9\x83 \xd8\xa3\xd9\x86 \xd9\x83\xd9\x84\xd8\xa7 | U+0644 U+0643 U+0020 U+0623 U+0646 U+0020 U+0643 U+0644 U+0627 | D9 84 D9 83 20 D8 A3 D9 86 20 D9 83 D9 84 D8 A7 | 44 06 43 06 20 00 23 06 46 06 20 00 43 06 44 06 27 06 | \xd9\x84\xd9\x83 \xd8\xa3\xd9\x86 \xd9\x83\xd9\x84\xd8\xa7 | لك أن كلا | لك أن كلا |
HtmlEncode.NET 5 中的方法| # | 输入 | 代码点/符文 | UTF-8 字节 | UTF-16 字节 | System.Net.WebUtility.HtmlEncode | System.Web.HttpUtility.HtmlEncode (.NET 5) | System.Text.Encodings.Web.HtmlEncoder | ||
|---|---|---|---|---|---|---|---|---|---|
0 | abc | 97 98 99 | 61 62 63 | 61 00 62 00 63 00 | abc | abc | abc | ||
1 | < | 60 | 3C | 3C 00 | < | < | < | ||
2 | > | 62 | 3E | 3E 00 | > | > | > | ||
3 | & | 38 | 26<
|