感谢大家的帮助,实在是不好意思。其实是一个正则匹配的问题,被我搞复杂了。现在情况是这样
正则表达式做了修改:(?i:(?:(select|;)(.*)+(?:benchmark|if|sleep)\s*?\(\s*?\(?\s*?\w+))
可以匹配到tes12t.t?d=SELECT%20IF(1=1,'true','false')
测试例子如下(因为一些异常情况,发现我不能在这里做解码处理)
if ngx.re.match(ngx.var.request_uri,[[(?i:(?:(select|;)(.*)+(?:benchmark|if|sleep)\s*?\(\s*?\(?\s*?\w+))]],"i") then
ngx.say(ngx.var.request_uri)
end
在nginx lua运行时候出错:
2012/08/09 11:14:33 [error] 12519#0: *17037650 lua handler aborted: runtime error: /usr/local/nginx/conf/4.lua:45: pcre_exec() failed: -8 on "/tes12t.t?d=SELECT%20IF(1=1,'true','false')" using "(?i:(?:(select|;)(.*)+(?:benchmark|if|sleep)\s*?\(\s*?\(?\s*?\w+))"
stack traceback:
[C]: in function 'match'
/usr/local/nginx/conf/4.lua:45: in function </usr/local/nginx/conf/4.lua:1>, client: x.x.x.x, server:
www.test.com, request: "GET /tes12t.t?d=SELECT%20IF(1=1,'true','false') HTTP/1.1", host: "x.x.x.x"
在 2012年8月9日 上午10:31,kindle
<linuxr...@gmail.com>写道:
非常感谢,我试试
在 2012年8月9日 上午10:16,agentzh
<age...@gmail.com>写道:
Hello!
2012/8/8 kindle <linuxr...@gmail.com>:
> 匹配目标字符串就是 a b(100,e(f(116)))
>
这里的一个建议是,尽量不要对 ngx.var.request_uri 进行正则匹配,因为 Nginx 的标准变量 $request_uri
是未经过 URI 解码的原始形式,比如 "/a b" 和 "/a%20b" 是彼此等价的
URI,但作为字符串它们又是不相等的。建议改成分别对 ngx.var.uri 和 ngx.req.get_args()["test"]
进行匹配。
可以看一看下面这个例子:
location /test {
default_type "text/plain";
content_by_lua '
ngx.say("request uri: ", ngx.var.request_uri)
ngx.say("uri: ", ngx.var.uri)
ngx.say("arg test: ", ngx.var.arg_test)
ngx.say("arg test 2: ", ngx.req.get_uri_args()["test"])
';
}
假设当前 nginx 监听的是本机的 1984 端口,则当在 Firefox 地址栏里输入下面这个 URL 时,
http://localhost:1984/test it?test=a b
会得到这样的页面输出:
request uri: /test%20it?test=a%20b
uri: /test it
arg test: a%20b
arg test 2: a b
我们看到,Firefox 作为编写良好的 HTTP 客户端,根据 RFC 的要求,自动把原始 URL 中的空格字符编码为了 %20 序列。