Sitecore ASP.NET en de error page

by Jan Bluemink Created: 9 mei 2014, last update: 20 Apr 2016

De Sitecore error page en foutafhandeling in .NET lijkt makkelijk maar er zijn best wat weetjes over al dan niet exotische fout sitiuaties. In dit artikel beschrijven we alle uitzonderingen we richten ons hierbij op errors die veroorzaakt worden door een bepaal request te doen naar de Sitecore IIS webserver. Een aantal situaties zullen we vergelijk met Umbraco het populairste open source op Microsoft .NET draaiende Content Management Systeem (CMS) ter wereld.

Sitecore error pages

Sitecore heeft een aantal error pages die staan in folder: /sitecore/service/ Als je deze error situaties wilt gebruiken, nolayout, noaccess, nolicense e.t.c dan kun je het beste de verwijziging in de web.config patchen naar een locatie buiten de Sitecore folder daar je op een Content Delivery server de Sitecore folder wilt wissen/afschermen.

Sitecore en MVC, language processor Default page

De language processor heeft een bugje die ook nog in 7.2 zit die aan het licht komt als je MVC gebruikt. als je een url hebt zonder / en met language code dus bijvoorbeeld /nl-NL.aspx dan krijg je de /default.aspx die Sitecore meelevert. Je kunt dat fixen door in je Global.asax het volgende te zetten:

        protected void Application_Start()
        {

            System.Web.Routing.RouteTable.Routes.RouteExistingFiles = true;

Zie ook: http://www.sitecore.net/Community/Technical-Blogs/John-West-Sitecore-Blog/Posts/2012/11/Conflicting-Files-MVC-Routes-and-Item-Paths-in-the-Sitecore-ASPNET-CMS.aspx

 

Overzicht

ERROR

Voorbeeld URL

Reserved filenames

/lpt1

Dangerous Request.Path

/*

404.7 file extension filter

/jan.config

404.8 .Net filter

/web.config

404.11 Request double escape sequence

/+

Illegal characters in path /”

/”

ERROR alias exists, but points to a non-existing item

 

A potentially dangerous Request.QueryString value

/?t=<script>

A potentially dangerous Request.Form value

 

Sitecore Language Code in URL of querystring

/de-AT?sc_lang=de-AT

Max url length

 

404.15 query string is too long

 

Url met .

/nl.aspx/nul.core

405 Method Not Allowed

/sitecore_webDAV.ashx

Reserved filenames

COM1-9, LPT1-9, AUX, PRT, NUL, CON zijn gereserveerd en geven een speciale 404 terug. Dit stampt nog af van MS-DOS, probeer in Windows maar eens een file of directory te maken die CON heet (NTFS), dat mag niet. Zelfde voor urls. Maak in Umbraco of Sitecore een pagina aan die /lpt1 of /lpt1.aspx als URL heeft dat mag maar hij zal niet werken en een error geven.
 

Sitecore-lpt1-in-url

Tester issue’s nodig? test of je bijvoorbeeld pagina’s met /lpt1 kunt maken.


Het vervelende aan deze error is dat de ASP.NET Error Pages en de IIS Error Pages deze error niet op pakken. De Out Of the Box (OOTB) bij Umbraco en Sitecore geleverde config vangen dit ook niet op met eigen errorpage. URL Rewrite is wel een optie. Je kunt de URL ook wel toestaan door:
<system.web>
    <httpRuntime relaxedUrlToFileSystemMapping="true"/>
Dat voelt aan het uitzetten van security. Bijna alle .NET websites tonen bij deze urls dan ook geen nette error pagina.

Zie ook:
http://haacked.com/archive/2010/04/29/allowing-reserved-filenames-in-URLs.aspx

 

Dangerous Request.Path

Een *, :, &, %25, < of > in de url geef een 400, A potentially dangerous Request.Path value was detected from the client (*). Dit is erg handig om 400 errors te testen daar je in je applicatie vaak al je bekende errors al afvangt. Weet je nu een manier om er toch een te krijgen.
De bij Umbraco en Sitecore geleverde config vangen dit ook niet op. .Net error pages werken wel prima voor deze error.
Wat wel een issue kan zijn is dat het ook in de Sitecore log komt, dat is niet zo handig als je de monitor aan de log hebt gehangen en checkt op errors.

Message: A potentially dangerous Request.Path value was detected from the client (<).
Source: System.Web
   at System.Web.HttpRequest.ValidateInputIfRequiredByConfig()
   at System.Web.HttpApplication.PipelineStepManager.ValidateHelper(HttpContext context)


Als dit soort errors in de Sitecore log file een issue zijn kun je ze bijvoorbeeld met een custom log4net filter in een andere log file zetten.
Deze melding komt ook als Warning in de windows event log.
Het is te configureren in de web.config
<httpRuntime requestPathInvalidCharacters="&lt;,&gt;,*,%,:,&amp;,\"/>

 

404.7 file extension filter

Een url als /Blabla.config levert een 404.7 The request filtering module is configured to deny the file extension. 404.7 betekende als http status 404 maar op IIS nivo kun je het subnummer nog gebruiken.

<httpErrors errorMode="Custom">
            <error statusCode="404" subStatusCode="7" path="/error.html" responseMode="Redirect" />


404.8 .Net filter

Url als /web.config en /bin geven een 500
The request filtering module is configured to deny a path in the URL that contains a hiddenSegment section.
Je kunt het per segment configuren of extra segmenten toevoegen.
http://www.iis.net/configreference/system.webserver/security/requestfiltering/hiddensegments

 

404.11 Request double escape sequence

Urls met + karakters geven een error bijvoorbeeld /test+test
In Sitecore mag je geen items met een plus aanmaken, in Umbraco mag dat wel daar word het  + teken in de url vervangen door “plus” zodat dat niet fout kan gaan. Echter in Sitecore kun je de LinkManager ook zo configureren dat je “Use Display name als url” gebruikt de display name mag wel een + bevatten en dan word er een ongeldige url neergezet. (In Sitecore 6.5 getest)
Je kunt het wel toestaan als je wilt maar dan open je potentiele security gaten.
<system.webServer>
    <security>
        <requestFiltering allowDoubleEscaping="true"/>
    </security>
</system.webServer>

Illegal characters in path

Karakters als een | en een “ geven een 500 Illegal characters in path.
Deze melding komt als Error in de Sitecore log en als warning in de windows event log.


Not Found ERROR alias exists, but points to a non-existing item.

Deze kun je in de Sitecore log krijgen. Als je een alias maak met map structuur, bijvoorbeeld test/abc dan heb je in de alias folder een test item waar geen item aan gekoppeld is en daaronder het abc item gekoppeld aan het item waar je de alias op maakt. Als je nu een request naar  url /test doet krijg je een 404 en in de Sitecore  log:
7280 13:35:46 ERROR An alias for "/test/" exists, but points to a non-existing item.


A potentially dangerous Request.QueryString value was detected from the client

De Querystring kan ook gescand worden op potentieel gevaarlijke strings.
/nl?abc=<script>
Geeft een "A potentially dangerous Request.QueryString value was detected from the client"
Als je er last van hebt kun je het per pagina uitzetten dat is vaak beter dan voor alle pagina’s
<%@ Page ... ValidateRequest="false" %>

Umbraco in webforms mode <umbraco:DisableRequestValidation runat="server"/>


A potentially dangerous Request.Form value was detected from the client

Net als bij de querystring ook een http post kan een security error geven.


Sitecore Language Code in URL of querystring

Afhankelijk van de configuratie kun je op 2 manieren de taal meegeven aan Sitecore.

1) In de querystring
Probeer b.v eens /?sc_lang=de-DE
Als je deze taal niet hebt en je er niet op controleert is je Sitecore website nu helemaal kapot en er is een cookie gezet zodat die het ook onthoud en je dus met een kapotte site blijft zitten, belangrijk dus om dit af te vangen bij een Sitecore Website. Je kunt het weer herstellen door in de url een bestaande languagecode mee  te geven.


2) Zelfde voor taalcodes in de URL
Probeer /en of /de-DE of een languacode waar je geen content for hebt, site stuk en de ongeldige taal word bewaard in een cookie. de boel herstellen kan door in de url eenn voor de site geldige taal mee te geven. Of het cookie wissen, het is een sessie cookie dus browser sluiten en opnieuw opstarten lost het ook op.


Max url length

De url heeft een lengte limiet, Een Umbraco item name heeft geen limiet. Dat levert dan bij overschrijding een “The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters” op. Een sitecore item name heeft wel een lengte limiet in de web.config


<setting name="MaxItemNameLength" value="100"/>


Als je een mappen structuur maakt kun je alsnog over de url limiet heen gaan. The length of the URL for this request exceeds the configured maxUrlLength value. Deze melding komt als error in de Sitecore log en als warning in de Event log
Instelbaar in de web.config


<httpRuntime maxUrlLength="1024" />


404.15 query string is too long

Ook de querystring heeft een limiet, daarom gebruik je ook een post i.p.v een querystring als je formulier groot kan worden.
The request filtering module is configured to deny a request where the query string is too long.


Url met .

Een . in de url zorgt ook voor ander gedrag. Word opgevat als file extensie. /test.test levert een 404.0 - Not Found op, wordt niet opgevangen door de standaard Sitecore of Umbraco 404 page. Dat werkt alleen met .aspx of geen extensie
Je kunt het ook combineren zoiets  /nl.aspx/nul.core levert in Umbraco een Failed to map the path '/nl.aspx/nul.core'. op in MVC mode of een The resource cannot be found. In webforms. In Sitecore ook meestal een error afhankelijk van de versie en exacte url. Dit is ook terug te vinden als warning in de event log.


Net als bij de + In Umbraco mag je een item name met . maken die word er dan uitgefilterd. In Sitecore is de . niet toegestaan. Gebruik je display name als url dan word de . enigszins merkwaardig escaped naar ,-d-, (in Sitecore 6.5)


405 Method Not Allowed

In Sitecore kun je een 405 krijgen met de volgende url /sitecore_webDAV.ashx

http://www.sitecore.net/sitecore_webDAV.ashx

Je kunt er eventueel ook nog wat voor zetten /hypotheek.aspx/sitecore_webDAV.ashx

Of probeer /sitecore_feed.ashx eens op een Sitecore website weliswaar geen error code maar wel een beetje vreemd.

http://www.sitecore.net/sitecore_feed.ashx

Bovenstaande urls en nog een paar anderen staan in de Sitecore web.config

 

 

 

 

 

 

 

 

 

 

Git LinkedIn Twitter