我正在将 URL 与正则表达式进行匹配,测试它们是否反映了“关闭”命令。
这是一个执行关闭的 URL:
/exec?debug=true&command=shutdown&f=0
这是另一个执行关闭的合法但令人困惑的 URL:
/exec?commando=yes&zcommand=34&command=shutdown&p
现在,我必须确保只有一个command=...参数,它是command=shutdown。或者,我可以确保第一个 command=...参数是command=shutdown。
这是我对请求的正则表达式的测试:
/exec?version=0.4&command=shutdown&out=JSON&zcommand=1
应该匹配
/exec?version=0.4&command=startup&out=JSON&zcommand=1&commando=shutdown
应该不匹配
/exec?command=shutdown&out=JSON
应该匹配
/exec?version=0.4&command=admin&out=JSON&zcommand=1&command=shutdown
应该不匹配
这是我的基线——一个通过上述测试的正则表达式——除了最后一个:
^/exec?(.*\&)*command=shutdown(\&.*)*$
问题在于出现多个命令=...,其中第一个命令未关闭。
我尝试使用lookbehind:
^/exec?(.*\&)*(?<!(\&|\?)command=.*)command=shutdown(\&.*)*$
但我得到:
Look-behind group does not have an obvious maximum length near index 31
我什至尝试过原子分组。无济于事。我不能使以下表达式不匹配:
/exec?version=0.4&command=admin&out=JSON&zcommand=1&command=shutdown
任何人都可以帮助通过所有测试的正则表达式吗?
澄清
我知道我欠你一些背景信息。
我的任务是配置一个过滤器来保护我们系统的所有 servlet 的入口,并验证是否有一个打开的 HTTP 会话(换句话说:成功登录)。该过滤器还允许配置哪些 URL 不需要登录。
有些例外很简单:/login 不需要登录。调用 localhost 不需要登录。
但有时它会变得复杂。就像关闭命令不需要登录,而其他命令可以而且应该(奇怪的原因超出了我的问题范围)。
由于这是一个安全问题,我不能允许用户仅将 &command=shutdown 附加到 URL 并绕过过滤器。
所以我真的需要一个正则表达式,否则我需要重新定义配置规范。