Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1095622
  • 博文数量: 186
  • 博客积分: 4939
  • 博客等级: 上校
  • 技术积分: 2075
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-08 17:15
文章分类

全部博文(186)

文章存档

2018年(1)

2017年(3)

2016年(11)

2015年(42)

2014年(21)

2013年(9)

2012年(18)

2011年(46)

2010年(35)

分类: Python/Ruby

2011-09-06 15:23:47

登陆表单:

 

  1. <form action="login.php?action=login" " method="post">

  2.    text" name="username" />

  3.    " type="password" />

  4.      " name="Submit" value="submit" />
  5.      " name="Submit2" value="reset


//验证用户名,密码是否存在或正确

  1. <?php

  2. $user=$_POST["username"];
  3. $pwd=$_POST["password"];

  4. $sql="select * from user_table where username='$user' AND passwd='$pwd'";
  5. //省略掉connect ,使用database操作


  6. $result=mysql_query($sql);

  7. if (!empty($result))

  8.  return "sucessfully login !";

  9. else
  10.  return "username or password isn't wrong ";

  11. //省略其他操作


  12. ?>

 

看似没什么问题,假如用户在登录框填写:
admin , 'or' 1=1,那么post提交之后。sql语句却成了这样:
select * from user_table where username='xxxx' AND passwd='1' or '1=1'
it's crazy,不是吗?逻辑or 1=1成立了。就这样通过了验证获取了权限!

这只是简单一例,如何避免?
1. 登录界面用js禁止掉or 1=1这样的密码。

2.mysql_real_escape_string()转义掉特殊字符。

3.转变编程习惯,先select 出登录用户的密码,然后把post提交的密码和这个比较验证。

4.把post的密码用md5加密然后比较。

阅读(1127) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~