PHP的正则匹配为何被绕过?

大别阿郎 发布于 2015/02/13 21:17
阅读 2K+
收藏 0

今天加强一下登录功能,在Zend Framework的控制器里这样写:

          Zend_Loader::loadClass('Zend_Filter_StripTags');
          $filter = new Zend_Filter_StripTags();
          $user = trim($filter->filter($this->_request->getPost('username')));
         
          //立即对用户名进行验证
          if(!preg_match('/[^0-9A-Za-z]/',$user))
          {
            die("<script>alert('用户名不合法!');history.back();</script>"); 
          }

后来发现下面这样一个很长的用户名竟然可以通过正则的检查,不明白。请高手指点。

if(now()=sysdate(),sleep(0),0)/*'XOR(if(now()=sysdate(),sleep(0),0))OR'"XOR(if(now()=sysdate(),sleep(0),0))OR"*/

加载中
0
saintatgod
saintatgod
在你的程序里面,验证前输出一下$user,看看是什么东东
0
halcy0n
halcy0n
同意ls,把$user里面的东西打出来.
0
leo108
leo108
你这个正则……屏蔽了大多数正常用户,只有用户名里包含非数字或者字母的才能通过验证
0
leoawalker
leoawalker
判断写错了。。。正则匹配的是非法字符  判断就不要用非了
0
倪倪
楼上反了吧
0
hylent
hylent
 哈哈  这正则。。。
0
jacky-zhuo
jacky-zhuo
//preg_match前不要加!  或者正则改为

!preg_match('/^[0-9A-Za-z]$/', $user);



0
-放弃OSC-
-放弃OSC-
/[^0-9A-Za-z]/因为没有设置起始结束位置,只要字符串中有一个非字母/数字的字符就可以匹配成功。如果匹配只能是字母数字,这么写比较合适吧: /^[0-9a-zA-Z]{6,32}$/,如果也匹配下划线,/^\w{6,32}$/,如果不判断长度,直接把^去掉,或者把前面的!去掉。
0
吾爱
吾爱
if(!preg_match('/[^0-9A-Za-z]/',$user))

逻辑错误,把前面的感叹号去掉,或者

if(!preg_match('/^[0-9a-z]$/i',$user))

0
大别阿郎
大别阿郎

这么多热心的朋友,非常感谢各位的帮助!

看来真的是犯了一个低级错误。

返回顶部
顶部