Valide QUERY_STRING em RewriteCond para proteção XSS

Oct 29 2020

Eu gostaria de criar uma condição de reescrita que valide o QUERY_STRING para prevenir de XSS.

Meu item se parece com:

/ItemPage.jsp?itemId=item_12345_12

onde item_12345 é obrigatório e "_ {VERSIONNUMBER} é opcional na string de consulta.

No passado, criei um RewriteCond para muitas partes de javascript que podem ser críticas.

Exemplo:

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]

Depois que descobri na hora de usar muitas novas strings possíveis para filtrar, a lista cresceu cada vez mais. E agora eu quero redirecionar todas as solicitações, que não usam esse esquema para minimizar as regras.

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

Mas se eu usar essa condição, serei redirecionado o tempo todo. ItemId não é obrigatório em ItemPage.jsp, mas se ItemId for definido na string de consulta, é necessário que ItemId = item_12345 + ItemId opcional = item_12345_12.

Essa regra é possível no Apache2.4 para filtrar o código XSS?

Respostas

AndrewSchulman Oct 31 2020 at 08:26

Acho que o que você quer é:

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

Observe, não inclua um ?na condição de RewriteRule, como você fez em sua pergunta. Isso não corresponde ao literal ?da solicitação. Em vez disso, torna o "p" /ItemPage.jspopcional, para que você também corresponda /ItemPage.js.