2009-08-07 5 views
57

Sto riscontrando problemi nel tentativo di proteggere ELMAH. Ho seguito Phil Haacked's tutorial, con l'unica differenza che il progetto demo è un'applicazione web e il mio progetto è un sito web.Protezione di Elmah nel sito Web ASP.NET

<add verb="POST,GET,HEAD" path="/admin/elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" /> 

    <location path="admin"> 
     <system.web> 
      <authorization> 
       <deny users="?"/> 
      </authorization> 
     </system.web> 
    </location> 

Con il leader "/" Ricevo la risposta che "La risorsa non può essere trovato.", Se mi tolgo la porta "/" tutto funziona bene, tranne l'autenticazione può essere bypassato aggiungendo un nome di directory di fronte di /admin/elmah.axd.

Per esempio, senza il leader "/"

www.mysite.com/admin/elmah.axd - innesca l'autenticazione
www.mysite.com/asdasdasd/admin/elmah.axd - non lo fa grilletto l'autenticazione e visualizza ELMAH

Come posso garantire che ELMAH sia protetto mantenendo la possibilità di visualizzare in remoto il registro?

Grazie.

Nota per gli altri:
seguito la risposta di Alan sotto i risultati di seguito.

www.mysite.com/admin/elmah.axd - innesca l'autenticazione
www.mysite.com/admin/asdasdasd/elmah.axd - innesca l'autenticazione
www.mysite.com/asdasdasd/admin/ elmah.axd - La risorsa non può essere trovata. (Esattamente quello che volevamo)

risposta

70

ho giocato in giro con il web.config ed ho ottenuto il seguente al lavoro. In pratica invece di mettere il HttpHandler elmah.axd nel system.web generale, aggiungerlo in particolare nel system.web del vostro "admin" posizione di percorso.

<location path="admin"> 
    <system.web> 
     <httpHandlers> 
      <add verb="POST,GET,HEAD" path="elmah.axd" 
       type="Elmah.ErrorLogPageFactory, Elmah" /> 
     </httpHandlers> 
     <authorization> 
      <deny users="?"/> 
     </authorization> 
    </system.web> 
</location> 
+8

se si utilizza asp.net mvc non dimenticare di aggiungere: routes.IgnoreRoute ("admin/elmah.axd/{* pathInfo}"); – santiagoIT

+0

Problemi di sicurezza e *** ELMAH ***: http://geeks.ms/lruiz/2014/07/21/asp-net-revisa-la-configuracin-de-elmah-en-produccin/ –

1

In Windows Server 7.5 di IIS 2008, esiste un'altra sezione denominata system.webServer. Affinché ELMAH al lavoro, questo doveva essere aggiunto:

<system.webServer> 
    <handlers> 
    <add name="Elmah" verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" /> 
    </handlers> 
</system.webServer> 

Ho provato un paio di variazioni, ma sono in grado di utilizzare la soluzione di cui sopra per la prevenzione '/blah/elmah.axd' dal lavoro.

Qualsiasi suggerimento su come rendere la soluzione sopra funziona per IIS 7.x?

Grazie.

+0

Una volta I rimosso elmah.axd dalla mia sezione httpHandlers di system.web e dai gestori in system.webserver, ora ottengo l'errore 404. Ho il mio percorso di posizione = "admin" esattamente come suggerito da Alan. Esecuzione di IIS 7.5. – InvisibleMan1002

+0

@Dan Atkinson è un'affermazione imprecisa. Se si esegue l'hosting in IIS 7+, è necessario registrare HttpHandlers e HttpModules nella sezione di configurazione 'system.webServer'. –

+0

@ChrisMarisic: Sai, hai assolutamente ragione! Ho ritirato (cancellato) la mia precedente affermazione. Grazie per avermi corretto. :) –

25

Se si utilizza ASP.NET MVC, è necessario che il motore di routing ignori tale percorso. Se si desidera spostare ELMAH a /admin/elmah.axd per esempio si dovrebbe aggiungere quanto segue al Global.asax.cs:

routes.IgnoreRoute("admin/elmah.axd/{*pathInfo}"); 
+0

Questo ha risolto il mio problema su MVC, ma suppongo che la domanda originale non riguardasse ASP.NET MVC. – pauloya

+0

+1 per specificare la correzione specifica MVC. Ha funzionato per me in MVC3. Senza di esso @ La risposta di Alan non funzionerà in MVC. – N30

+0

@Paulo, la domanda non specifica Webform o MVC. ASP.NET è la base per entrambi, quindi includi questo bit in più di cui avresti bisogno per MVC. – aarondcoleman

17

Dopo aver trascorso un po 'cercando di ottenere questo al lavoro applicando le patch insieme i vari pezzi di consigli da ciascuna delle risposte, ho messo insieme una soluzione completa che dovrebbe funzionare per tutti i gusti di IIS.

Ecco cosa ha bisogno di essere in ciascuna delle vostre sezioni web.config:

<configuration> 
    <configSections> 
    <sectionGroup name="elmah"> 
     <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" /> 
     <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" /> 
     <section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" /> 
     <section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah" /> 
    </sectionGroup> 
    </configSections> 

    <elmah> 
    <!-- set allowRemoteAccess="0" for extra security --> 
    <security allowRemoteAccess="1"/> 
    </elmah> 

    <system.web> 
    <httpModules> 
     <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" /> 
     <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" /> 
     <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" /> 
    </httpModules> 
    </system.web> 

    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
     <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" /> 
     <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler" /> 
     <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler" /> 
    </modules> 
    </system.webServer> 

    <location path="admin"> 
    <system.web> 
     <authorization> 
     <!--<allow users="Admin" /> --> 
     <deny users="?" /> 
     </authorization> 
     <httpHandlers> 
     <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" /> 
     </httpHandlers> 
    </system.web> 
    <system.webServer> 
     <handlers> 
     <add name="Elmah" path="elmah.axd" verb="POST,GET,HEAD" type="Elmah.ErrorLogPageFactory, Elmah" preCondition="integratedMode" /> 
     </handlers> 
    </system.webServer> 
    </location> 

</configuration> 

E se si sta utilizzando Asp.Net MVC, aggiungi

routes.IgnoreRoute("admin/elmah.axd/{*pathInfo}"); 

nel metodo RegisterRoutes.