有没有办法重写这个正则表达式,使其不包括“/js”的前瞻?
就性能而言,这甚至是我应该担心的事情吗?它被用于过滤 HTTP 请求。
\.(asmx(?!/js)|aspx|htm)
编辑: 要明确:我想特别阻止“.asmx/js”,但允许所有其他 .asmx 请求通过。
BAD: Portal.asmx/js
GOOD: Portal.asmx/UpdateProduct
有没有办法重写这个正则表达式,使其不包括“/js”的前瞻?
就性能而言,这甚至是我应该担心的事情吗?它被用于过滤 HTTP 请求。
\.(asmx(?!/js)|aspx|htm)
编辑: 要明确:我想特别阻止“.asmx/js”,但允许所有其他 .asmx 请求通过。
BAD: Portal.asmx/js
GOOD: Portal.asmx/UpdateProduct
如果您想阻止Portal.asmx/js
但允许Portal.asmx/UpdateProduct
有两种方法来处理它 - 列出所有接受值的白名单模式,或者对不需要的匹配项进行否定前瞻。
负前瞻几乎肯定会比列出所有可接受的值更好。
但是,简单地使用现有的表达式不会完全匹配您想要的。例如,它会阻止Portal.asmx/json
并允许Portal.asmx/js.aspx
- 这可能不是 URL,而只是突出显示需要修复的内容。
这个表达(从eyelidlessness answer复制)将适当地处理事情:
\.(asmx(?!/js[/\z])|aspx$|html?$)
值得解释的是,[/\z]
字符类将匹配/
或<end of string>
-\z
与 to 相同,$
但适用于字符类(其中$
将匹配文字 $ 字符)。
(两者之间存在差异$
,\z
但仅在多行模式下,这与 URL 过滤无关)。
一般来说,除非你有一个可衡量的性能问题,否则不要担心性能(否则你怎么知道你所做的改变是否有任何影响)。
不要担心这种简单的前瞻的性能。你的正则表达式很好。
编辑:但它可能会发现误报(例如 Portal.asmx/jssomething),您可以尝试以下操作:
\.(asmx(?!/js[/\z])|aspx$|html?$)