カスタムコード化C#クラスは、Ubuntu 16.04にインストールされたMono .NET 4.0ライブラリで正しく実行されますか?

カスタムコード化C#クラスは、Ubuntu 16.04にインストールされたMono .NET 4.0ライブラリで正しく実行されますか?

私はApache Server 2.0とmod-mono-server4.exeがインストールされているLenovo ThinkstationデスクトップでUbuntu Linux 16.04オペレーティングシステムを実行しているASP.NET 4のデフォルトのエンコーダを変更したいと思います。

私の質問は、次のレシピがUbuntu 16.04にインストールされている.NET Mono 4.0ライブラリで動作するかどうかです。次のようなエンコーダタイプ設定を使用する4.5より前のバージョン(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というライブラリに組み込まれているルーチンの問題)は、エンコードを必要としないすべての文字を決定します。

この資料では、Web Protection Library を ASP.Net 4.0 アプリケーションの基本エンコーダとして使用する方法を説明します。最初のステップは、Web保護ライブラリをダウンロードすることです。この例では、次の場所にあるバージョン4.0を使用しています。http://wpl.codeplex.com/

次に、これを実現するにはアプリが必要です。既存のアプリケーションを使用するか、新しいアプリケーションを作成できます。 AntiXSSLibrary.dllへの参照を追加します。

このライブラリを使用するには、新しいクラスを作成する必要があります。図1では、私のクラスのコードを見ることができます。私はクラス名を「MyEncoder」と指定しました。これは単なる例です。 (これは本番コードではありません。)このクラスには2つの重要な要素があります。

  1. このクラスはSystem.Web.Util.HttpEncoderから継承する必要があります。

  2. 変更するすべてのエンコード方法をオーバーライドする必要があります。

図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ファイルを更新することです。これを行うには、図2に示すようにhttpRuntime要素を変更して「encoderType」属性を設定します。 「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]

1時間後、次の例外が発生しました。

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-assemblies-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への外部参照として追加しました。 ASP.NET アプリケーションの bin フォルダーに System.Web.dll を置かないでください。

  1. Web.configのhttpRuntime行で、エンコーダの種類を次のように変更します。

おすすめ記事