Podařilo se mi napsat a zprovoznit modul, který umožní obejít dříve zmíněnou bezpečnostní chybu v ASP.NET, a to bez zásahu do aplikace samé. Jeho aplikace nevyžaduje žádné specifické znalosti a je velmi jednoduchá.

Modul si můžete stáhnout na adrese http://oraclebugfix.codeplex.com/

Postup instalace

Poznámka: Modul vyžaduje .NET Framework 2.0 a novější a běží jenom na IIS 7.0 a novějších.

  1. Stáhněte si nejnovější verzi z http://oraclebugfix.codeplex.com/.
  2. Rozbalte ZIP archiv někam, třeba do C:\OracleFix.
  3. Spusťte soubor install.cmd. Tento skript zaregistruje můj modul do GAC a zároveň do IIS.

Až budete chtít modul odinstalovat, tak stačí spustit uninstall.cmd, který provede odregistraci z GAC a IIS.

Jak to funguje

Modul je ve své podstatě primitivní, jak jest možno zhodnotit nahlédnutím do zdrojového kódu:

using System;
using System.Security.Cryptography;
using System.Threading;
using System.Web;

namespace Altairis.Web.OracleBugFix {
    public class ErrorHandlingModule : IHttpModule {
        private const int HTTP_STATUS_CODE = 404;
        private const int HTTP_SUBSTATUS_CODE = 0;
        private const string HTTP_STATUS_TEXT = "Object Not Found";

        public void Dispose() {
            // Nothing to do here
        }

        public void Init(HttpApplication context) {
            context.Error += new EventHandler(context_Error);
        }

        void context_Error(object sender, EventArgs e) {
            // Fires when any error occurs
            var app = sender as HttpApplication;

            // Clear buffered data
            app.Context.Response.Clear();
            app.Context.ClearError();

            // Set error response status
            app.Context.Response.StatusCode = HTTP_STATUS_CODE;
            app.Context.Response.SubStatusCode = HTTP_SUBSTATUS_CODE;
            app.Context.Response.StatusDescription = HTTP_STATUS_TEXT;

            // Send error page text
            app.Context.Response.ContentType = "text/html";
            app.Context.Response.Output.Write(Properties.Resources.ErrorPage);

            // Introduce random delay
            var delay = new byte[1];
            RandomNumberGenerator rng = new RNGCryptoServiceProvider();
            rng.GetBytes(delay);
            Thread.Sleep((int)delay[0]);
            IDisposable disposable = rng as IDisposable;
            if (disposable != null) { disposable.Dispose(); }

            // Complete request
            app.CompleteRequest();
        }

    }
}

Kód nedělá nic jiného, než že odchytí jakoukoliv chybu a vyhodí ji jako 404, bez ohledu na to, co byla původně.

Podrobnější popis, možnost stažení kompetních zdrojáků i zkompilovaného balíčku najdete na http://oraclebugfix.codeplex.com/.