Valide QUERY_STRING en RewriteCond para protección XSS
Me gustaría crear una condición de reescritura que valide QUERY_STRING para evitar XSS.
Mi artículo se parece a:
/ItemPage.jsp?itemId=item_12345_12
donde item_12345 es obligatorio y "_ {VERSIONNUMBER} es opcional en la cadena de consulta.
En el pasado, creé un RewriteCond para muchas partes de JavaScript que podrían ser críticas.
Ejemplo:
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]
Después de encontrar en el momento de usar muchas nuevas cadenas posibles para filtrar, la lista crece cada vez más. Y ahora quiero redirigir todas las solicitudes, que no usan este esquema para minimizar las reglas.
RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [OR]
RewriteCond %{QUERY_STRING} ^((?!itemId=[\w]).)* [NC,OR]
RewriteRule ^/ItemPage\.jsp?$ /StartPage.jsp [L,R=301]
Pero si utilizo esta condición, seré redirigido todo el tiempo. ItemId no es obligatorio en ItemPage.jsp, pero si ItemId está configurado en la cadena de consulta, se requiere que ItemId = item_12345 + ItemId opcional = item_12345_12.
¿Es posible esa regla en Apache2.4 para filtrar el código XSS?
Respuestas
Creo que lo que quieres es:
RewriteCond %{QUERY_STRING} !^(ItemId=[[:alpha:]]+_\d+(_\d+)?)?$ [NC] RewriteRule ^/ItemPage\.jsp$ /StartPage.jsp [L,R=301]
Tenga en cuenta que no incluya un ?en la condición de RewriteRule, como lo hizo en su pregunta. Eso no coincide con el literal ?de la solicitud. En su lugar, hace que la "p" en /ItemPage.jspopcional, por lo que también coincide /ItemPage.js.