在 RewriteCond 上验证 QUERY_STRING 以进行 XSS 保护

在 RewriteCond 上验证 QUERY_STRING 以进行 XSS 保护

我想创建一个重写条件来验证 QUERY_STRING 以防止 XSS。

我的物品看起来像:

/ItemPage.jsp?itemId=item_12345_12

其中 item_12345 是必需的,而查询字符串中的 "_{VERSIONNUMBER} 是可选的。

过去,我为许多可能很关键的 javascript 部分创建了 RewriteCond。

例子:

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]

我发现在使用过程中有许多新的可能字符串进行过滤后,列表变得越来越长。现在我想重定向所有不使用此模式的请求以最小化规则。

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

但如果我使用此条件,我将一直被重定向。ItemPage.jsp 上不需要 ItemId,但如果在查询字符串中设置了 ItemId,则需要 ItemId=item_12345 + 可选 ItemId=item_12345_12。

该规则是否可以在 Apache2.4 中过滤 XSS 代码?

答案1

我认为你想要的是:

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

请注意,不要?像问题中那样在 RewriteRule 的条件中包含 。这不符合?请求中的文字。相反,它使 中的“p”成为/ItemPage.jsp可选项,因此您也匹配/ItemPage.js

相关内容