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.
- Stáhněte si nejnovější verzi z http://oraclebugfix.codeplex.com/.
- Rozbalte ZIP archiv někam, třeba do C:\OracleFix.
- 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/.