System.Web.Security.AntiXss.AntiXssEncoder.MarkAsSafe 和 Lowe

本文关键字:MarkAsSafe Lowe AntiXssEncoder AntiXss Web Security System | 更新日期: 2023-09-27 18:35:44

我做了一个Microsoft Connect错误提交,我在提交中链接了这个问题。


我正在玩System.Web.Security.AntiXss.AntiXssEncoder.MarkAsSafe来测试一些东西,我发现了这个。

这段代码,看起来很合适:

protected void Application_Start(object sender, EventArgs e)
{
    System.Web.Security.AntiXss.AntiXssEncoder.MarkAsSafe
    (
        LowerCodeCharts.None,
        LowerMidCodeCharts.None,
        MidCodeCharts.None,
        UpperMidCodeCharts.None,
        UpperCodeCharts.None
    );
    /*2 randoms characters from each pdf linked below */
    System.Diagnostics.Debug.WriteLine(
        System.Web.Security.AntiXss.AntiXssEncoder.HtmlEncode(
               "%* ܼ aW ?? ?? ??", false));
    System.Diagnostics.Debug.WriteLine(
        System.Web.Security.AntiXss.AntiXssEncoder.HtmlEncode(
               "%* ܼ aW ?? ?? ??", true));
}

不能像它应该的那样工作。上面的字符串未被编码。

似乎它仍然使用LowerCodeCharts.Default,忽略我使用这些字符集的LowerCodeCharts.None(我在这里找到了每个字符集的列表)。

BasicLatin, C1ControlsAndLatin1Supplement, LatinExtendedA, LatinExtendedB, IpaExtensions, SpacingModifierLetters, CombiningDiacriticalMarks


所以在与 ILSpy 一起查看后System.Web.Security.AntiXss.UnicodeCharacterEncoder

我找到了这段代码;

public static void MarkAsSafe(....)
{
if (lowerCodeCharts == UnicodeCharacterEncoder.currentLowerCodeChartSettings && 
    lowerMidCodeCharts == UnicodeCharacterEncoder.currentLowerMidCodeChartSettings && 
    midCodeCharts == UnicodeCharacterEncoder.currentMidCodeChartSettings && 
    upperMidCodeCharts == UnicodeCharacterEncoder.currentUpperMidCodeChartSettings && 
    upperCodeCharts == UnicodeCharacterEncoder.currentUpperCodeChartSettings)
{
    return;
}
  /*actual code that does something*/
}

我用 ILSpy 查看了,默认值是 None 对于所有这些

这使我第一次尝试MarkAsSafe无效

当我打电话时,无论有没有我的None

System.Diagnostics.Debug.WriteLine(
    System.Web.Security.AntiXss.AntiXssEncoder.HtmlEncode(
           "%* ܼ aW ?? ?? ??", false));
通过

查看ILSpy中的System.Web.Security.AntiXss.UnicodeCharacterEncoder,它通过这个

private static void InitialiseSafeList()
{
/*some code */
if (UnicodeCharacterEncoder.characterValues == null)
{
    UnicodeCharacterEncoder.InitialiseSafeList();
}
/*some code */
}

因为此时UnicodeCharacterEncoder.characterValues为空,所以我使用 Visual Studio 中的监视窗口对此进行了验证。UnicodeCharacterEncoder.InitialiseSafeList方法如此行

SafeList.PunchUnicodeThrough(ref UnicodeCharacterEncoder.characterValues, 
                                 LowerCodeCharts.Default, 
                                 LowerMidCodeCharts.None, 
                                 MidCodeCharts.None, 
                                 UpperMidCodeCharts.None, 
                                 UpperCodeCharts.None);

所以为了让它真正None,我尝试调用 MarkAsSafe 两次,一次具有假价值以确保它不会使其无效,然后用 ALL None 调用它

System.Web.Security.AntiXss.AntiXssEncoder.MarkAsSafe
(
LowerCodeCharts.None,
LowerMidCodeCharts.None,
MidCodeCharts.Arrows,      /*    FAKE VALUE to trigger the proper code */
UpperMidCodeCharts.None,
UpperCodeCharts.None);
System.Web.Security.AntiXss.AntiXssEncoder.MarkAsSafe
    (
    LowerCodeCharts.None, /*    NOW THIS WORK      */
    LowerMidCodeCharts.None,
    MidCodeCharts.None,
    UpperMidCodeCharts.None,
    UpperCodeCharts.None);

现在我实际上得到了一个编码的字符串

%*ܼąŴƣǼɤʩ˦˿

然而,不可能重置内部数组UnicodeCharacterEncoder.characterValues所以在我的示例中,因为我使用了MidCodeCharts.Arrows,它们现在被视为安全。不可能把它改回不安全。


为了好玩,我想找到一种方法让它像它应该的那样工作,这让它工作

请,此代码不适用于生产用途。请!!

var assembly = Assembly.GetAssembly(typeof(System.Web.Security.AntiXss.AntiXssEncoder));
var type = assembly.GetType("System.Web.Security.AntiXss.UnicodeCharacterEncoder");
var field = type.GetField("currentLowerCodeChartSettings", BindingFlags.Static | BindingFlags.NonPublic);
field.SetValue(null, -1);

System.Web.Security.AntiXss.AntiXssEncoder.MarkAsSafe
(
    System.Web.Security.AntiXss.LowerCodeCharts.None,
    System.Web.Security.AntiXss.LowerMidCodeCharts.None,
    System.Web.Security.AntiXss.MidCodeCharts.None,
    System.Web.Security.AntiXss.UpperMidCodeCharts.None,
    System.Web.Security.AntiXss.UpperCodeCharts.None
);

请,此代码不适用于生产用途。请!!


所以我的问题是,在库的当前实现中,是否有另一种将所有编码标记为不安全的方法?

System.Web.Security.AntiXss.AntiXssEncoder.MarkAsSafe 和 Lowe

它在一月份被确认为一个错误,它只是因为无法修复而被关闭。

似乎如果您遇到此错误,则必须使用我的问题中的不推荐代码。

此外,如果您必须在运行时多次更改编码,则需要找到一种方法来手动重置内部数组。否则,编码将包括任何以前的"MarkAsSafe"调用。这可以通过操作不推荐的私有/内部变量来完成。