Convalida QUERY_STRING su RewriteCond per la protezione XSS

Oct 29 2020

Vorrei creare una condizione di riscrittura che convalidi QUERY_STRING per evitare che XSS.

Il mio articolo assomiglia a:

/ItemPage.jsp?itemId=item_12345_12

dove item_12345 è obbligatorio e "_ {VERSIONNUMBER} è facoltativo nella stringa di query.

In passato ho creato un RewriteCond per molte parti javascript che potrebbero essere critiche.

Esempio:

RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [OR]
RewriteCond %{QUERY_STRING} script [NC,OR]
RewriteCond %{QUERY_STRING} img [NC,OR]
RewriteCond %{QUERY_STRING} svg [NC,OR]
...
RewriteRule ^/ItemPage\.jsp?$ /StartPage.jsp [L,R=301]

Dopo aver trovato nel tempo di utilizzo tante nuove possibili stringhe da filtrare, la lista cresce sempre di più. E ora voglio reindirizzare tutte le richieste, che non utilizzano questo schema per ridurre al minimo le regole.

RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [OR]
RewriteCond %{QUERY_STRING} ^((?!itemId=[\w]).)* [NC,OR]
RewriteRule ^/ItemPage\.jsp?$ /StartPage.jsp [L,R=301]

Ma se utilizzo questa condizione verrò reindirizzato tutto il tempo. ItemId non è obbligatorio su ItemPage.jsp ma se ItemId è impostato nella stringa di query è necessario che ItemId = item_12345 + ItemId facoltativo = item_12345_12.

Questa regola è possibile in Apache2.4 per filtrare il codice XSS?

Risposte

AndrewSchulman Oct 31 2020 at 08:26

Penso che quello che vuoi è:

RewriteCond %{QUERY_STRING} !^(ItemId=[[:alpha:]]+_\d+(_\d+)?)?$ [NC] RewriteRule ^/ItemPage\.jsp$ /StartPage.jsp [L,R=301]

Nota, non includere un ?nella condizione della RewriteRule, come hai fatto nella tua domanda. Quello non corrisponde al letterale ?nella richiesta. Invece rende la "p" in /ItemPage.jspopzionale, quindi anche la corrispondenza /ItemPage.js.