사용자 정의 코딩된 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 기능에 중점을 둡니다. 보안 관점에서 이러한 기능은 교차 오류를 완화하는 데 사용됩니다. 사이트 스크립팅(Anti-XSS라는 라이브러리에 내장된 루틴 문제)은 인코딩이 필요하지 않은 모든 문자를 결정합니다. , 예를 들어 a-z0-9를 선택한 다음 다른 모든 항목을 인코딩하는 것이 더 안전한 인코딩 방법입니다.

이 문서에서는 Web Protection Library를 ASP.Net 4.0 응용 프로그램의 기본 인코더로 사용하는 방법을 보여 드리겠습니다. 첫 번째 단계는 웹 보호 라이브러리를 다운로드하는 것입니다. 이 예에서는 다음 위치에서 찾을 수 있는 버전 4.0을 사용하고 있습니다.http://wpl.codeplex.com/.

다음으로, 이를 실현하려면 앱이 필요합니다. 기존 애플리케이션을 사용하거나 새 애플리케이션을 만들 수 있습니다. AntiXSSLibrary.dll에 대한 참조를 추가합니다.

이 라이브러리를 사용하려면 새 클래스를 만들어야 합니다. 그림 1에서 내 수업의 코드를 볼 수 있습니다. 저는 클래스 이름을 "MyEncoder"로 지정했습니다. 이는 단지 예일 뿐입니다. (이것은 프로덕션 코드가 아닙니다.) 이 클래스에는 두 가지 중요한 요소가 있습니다.

  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]

한 시간 후에 다음과 같은 예외가 발생했습니다.

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 줄에서 인코더 유형을 다음과 같이 변경합니다.

관련 정보