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
);
请,此代码不适用于生产用途。请!!
所以我的问题是,在库的当前实现中,是否有另一种将所有编码标记为不安全的方法?
它在一月份被确认为一个错误,它只是因为无法修复而被关闭。
似乎如果您遇到此错误,则必须使用我的问题中的不推荐代码。
此外,如果您必须在运行时多次更改编码,则需要找到一种方法来手动重置内部数组。否则,编码将包括任何以前的"MarkAsSafe"调用。这可以通过操作不推荐的私有/内部变量来完成。