Sitecore ASP.NET en de error page
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;
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.
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="<,>,*,%,:,&,\"/>
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