我想更改在 Lenovo Thinkstation 桌面和 apache server 2.0 和 mod-mono-server4.exe 上运行 Ubuntu Linux 16.04 操作系统的 ASP.NET 4 的默认编码器。
我的问题是以下配方是否适用于 Ubuntu 16.04 上安装的 .NET Mono 4.0 库。这种方法的优点是什么,因为我们使用 4.5 之前的 .NET 版本(即 ASP.NET 4.0),其中我们使用以下编码器类型设置,如下所示。
<httpRuntime encoderType="Microsoft.Security.Application.AntiXssEncoder, AntiXssLibrary" />
事实证明,它可以与 Ubuntu 16.04 上安装的 .NET Mono 4.0 库一起正常运行。
James Jardine 于 2011 年 7 月 9 日在此 URL 中发布了食谱,[https://www.jardinesoftware.net/2011/07/09/asp-net-4-change-the-default-encoder/]标题为 ASP.Net 4:更改默认编码器
引用这篇好文章,“在 ASP.Net 4.0 中,Microsoft 添加了覆盖默认编码器的功能。这特别关注 HTMLEncode、HTMLAttributeEncode 和 URLEncode 功能。从安全角度来看,这些函数用于帮助缓解跨站点脚本 (XSS) 内置例程的问题在于它们是基于黑名单方法而不是白名单方法构建的。例如,.Net 版本的 HTMLEncode 对以下字符进行编码:<、>、”、&,而 Microsoft Web 保护库(以前称为 Anti-XSS 库)则确定所有不需要编码的字符。 ,例如 a-z0-9,然后对其余所有内容进行编码这是一种更安全的编码方法。
在这篇文章中,我将向您展示如何使用 Web 保护库作为 ASP.Net 4.0 应用程序的默认编码器。第一步是下载 Web 保护库。在此示例中,我使用版本 4.0,可以在以下位置找到该版本:http://wpl.codeplex.com/。
接下来,您需要有一个应用程序来实现这一点。您可以使用现有的应用程序,也可以创建一个新的应用程序。添加对 AntiXSSLibrary.dll 的引用。
要使用该库,需要创建一个新类。您可以在图 1 中看到我的类中的代码。我将类命名为“MyEncoder”,这只是一个示例。 (这不是生产代码)此类有两个重要因素:
该类必须继承自System.Web.Util.HttpEncoder。
您必须覆盖要更改的每个编码方法。
图1
using System;
using System.Web;
public class MyEncoder : System.Web.Util.HttpEncoder
{
public MyEncoder(){}
protected override void HtmlEncode(string value, System.IO.TextWriter output)
{
if (null == value)
return;
output.Write(Microsoft.Security.Application.Encoder.HtmlEncode(value));
}
protected override void HtmlAttributeEncode(string value, System.IO.TextWriter output)
{
if (null == value)
return;
output.Write(Microsoft.Security.Application.Encoder.HtmlAttributeEncode(value));
}
}
实现此自定义编码的最后一步是更新 Web.config 文件。为此,请修改您的 httpRuntime 元素以设置“encoderType”属性,如图 2 所示。将“MyEncoder”更改为您创建的类的名称。如果您没有 httpRuntime 元素,只需添加它即可。
图2
<system.web>
<compilation debug="true" targetFramework="4.0"/>
<httpRuntime encoderType="MyEncoder"/>
</system.web>
答案1
是的,自定义编码 C# 类可以与 Ubuntu 16.04 上安装的 Mono .NET 4.0 库一起正常运行。
在与 .NET 4.0 HttpEncoder 功能进行斗争之后
[https://msdn.microsoft.com/en-us/library/system.web.util.httpencoder(v=vs.100).aspx]
一个小时,我得到了这个异常:
The actual exception which was being reported was:
System.Web.HttpException: Code generation failed. ---> System.Configuration.ConfigurationErrorsException: Could not load type 'AntiXssEncoder, AntiXssLibrary'.
at System.Web.Util.HttpEncoder.GetCustomEncoderFromConfig () <0x40e99f10 + 0x0015f> in <filename unknown>:0
at System.Lazy`1[T].CreateValue () <0x40e8cc80 + 0x001d2> in <filename unknown>:0
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () <0x40ea1490 + 0x00033> in <filename unknown>:0
at System.Lazy`1[T].get_Value () <0x40e8c580 + 0x000cc> in <filename unknown>:0
at System.Web.Util.HttpEncoder.get_Current () <0x40e99c50 + 0x0006f> in <filename unknown>:0
at System.Web.HttpUtility.HtmlEncode (System.String s) <0x40e99b80 + 0x00053> in <filename unknown>:0
at System.Web.HttpException.HtmlEncode (System.String s) <0x40e99ae0 + 0x00047> in <filename unknown>:0
at System.Web.HttpException.FormatFullStackTrace () <0x40e98510 + 0x001cf> in <filename unknown>:0
at System.Web.HttpException.GetHtmlErrorMessage () <0x40e968f0 + 0x001d3> in <filename unknown>:0
--- End of inner exception stack trace ---
at System.Web.Compilation.BuildManager.GenerateAssembly (System.Web.Compilation.AssemblyBuilder abuilder, System.Web.Compilation.BuildProviderGroup group, System.Web.VirtualPath vp, Boolean debug) <0x40eb3f10 + 0x0045f> in <filename unknown>:0
at System.Web.Compilation.BuildManager.BuildInner (System.Web.VirtualPath vp, Boolean debug) <0x40ea7280 + 0x0057b> in <filename unknown>:0
at System.Web.Compilation.BuildManager.Build (System.Web.VirtualPath vp) <0x40ea6c90 + 0x0014b> in <filename unknown>:0
at System.Web.Compilation.BuildManager.GetCompiledType (System.Web.VirtualPath virtualPath) <0x40ea6940 + 0x00093> in <filename unknown>:0
at System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath (System.Web.VirtualPath virtualPath, System.Type requiredBaseType) <0x40ea6800 + 0x00033> in <filename unknown>:0
at System.Web.UI.PageParser.GetCompiledPageInstance (System.String virtualPath, System.String inputFile, System.Web.HttpContext context) <0x40ea6460 + 0x000bb> in <filename unknown>:0
at System.Web.UI.PageHandlerFactory.GetHandler (System.Web.HttpContext context, System.String requestType, System.String url, System.String path) <0x40ea6420 + 0x00027> in <filename unknown>:0
at System.Web.HttpApplication.GetHandler (System.Web.HttpContext context, System.String url, Boolean ignoreContextHandler) <0x40e7e970 + 0x002de> in <filename unknown>:0
at System.Web.HttpApplication.GetHandler (System.Web.HttpContext context, System.String url) <0x40e7e940 + 0x0001b> in <filename unknown>:0
at System.Web.HttpApplication+<Pipeline>c__Iterator1.MoveNext () <0x40e80000 + 0x02a5f> in <filename unknown>:0
因此,我通过研究 c# Type.GetType(typename, false) 修复了这个异常。在此 URL 中,[https://stackoverflow.com/questions/31613899/why-do-i-have-to-specify-the- assembly-in-my-app-config-but-not-for-my-web-config],@rene 写道:
"If the type is in the currently executing assembly or in Mscorlib.dll, it is sufficient to supply the type name qualified by its namespace."
"It is adviced to always specify the assemblyname. In the asp.net scenario, if the assemblyname is present in the type parameter it short-circuits to the Type.GetType call which prevents the loading and inspection of all dll's in the bin folder of your webapp."
1. Compiing:
sudo mcs -t:library -r:../bin/System.dll -r:/usr/lib/mono/gac/System.Web/4.0.0.0__b03f5f7f11d50a3a/System.Web.dll -r:../bin/AntiXSSLibrary.dll MyEncoder.cs
它构建了程序集 MyEncoder.dll,我将其复制到 bin 文件夹中并添加为我的 csproj 的外部引用。请不要将 System.Web.dll 放在 ASP.NET 应用程序的 bin 文件夹中。
将 Web.config 的 httpRuntime 行中的编码器类型更改为: