先语:
本人作为开发者.
个人学习所用.
不断更新.
2014/02/27.
2014/02/28.
情况1:密码不加密
如果不加密,密码在数据库中为明文.
$sql = "SELECT * FROM `user` WHERE `name`='$user' AND `pwd`= '$pwd'";
如果密码为
$pwd = "1' OR '1'='1";
即可登陆成功
$sql = "SELECT * FROM `user` WHERE `name`=".$user." AND `pwd`= ".$pwd."";
如果密码为
$pwd = "1 OR 1=1";
即可登陆成功.
注释:
明文密码在这个时代是很少见的.所以这种简单的sql注入还是很少见的.
对策:
上述注入密码加密就可以避免了.
情况2:密码加密
如果密码md5加密,
数据库内容如图
密码经过md5加密,不是很复杂的密码,有兴趣的可以解密.
跳过登陆验证:
$sql = "SELECT * FROM `user` WHERE `name`='$user' AND `pwd`= '$pwd'";
如果用户名为
$user = "' OR 1=1 -- ";
即可登陆成功.
$sql = "SELECT * FROM `user` WHERE `name`=".$user." AND `pwd`= ".$pwd."";
如果用户名为
$user = "1 OR 1=1 -- ";
即可登陆成功
对策:
$user = str_replace(' ','',$user);
$pwd = str_replace(' ','',$pwd);
即可解决此两种风格问题.
或
$user = addslashes($user);
$pwd = addslashes($pwd);
$sql = "SELECT * FROM `user` WHERE `name`=".$user." AND `pwd`= ".$pwd."";
以上风格无法解决.
$sql = "SELECT * FROM `user` WHERE `name`='$user' AND `pwd`= '$pwd'";
以上风格可解决.
推荐上述两种处理数据方式一并使用.
mysql_real_escape_string()和addslashes()函数作用类似.
注释:默认情况下,PHP 指令 magic_quotes_gpc 为 on,对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。
重设密码波及其他用户甚至管理员账号(举例使用一种,代码风格变化类推即可)
此时密码加密但并未进行其他的保护措施.
$sql = "UPDATE `user` SET `pwd`='$pwd' WHERE `name`='$user'";
用户名及密码为
//波及名字内含有1的所有用户
$user = "' OR `name` LIKE '%1%'; -- ";
$pwd = "123";
//波及名字内含有admin的所有用户,默认管理员账户往往为admin或与admin相关
$user = "' OR `name` LIKE '%admin%'; -- ";
$pwd = "123";
//波及所有用户
$user = "' OR `name`<>''; -- ";
$pwd = "123";
以上即可将目标用户密码更改为123
从而威胁用户使用安全
对策:
$user = str_replace(' ','',mysql_real_escape_string($user));
$pwd = str_replace(' ','',mysql_real_escape_string($pwd));
即可.
通过限制查询
有些限制环节,比如只允许查询与自己相近的上下10条的资料
$sql = "SELECT * FROM `user` WHERE id='1' LIMIT 1 OFFSET $offset";
在查询处更改
$offset = "0 UNION SELECT * FROM `user` -- ";
即可获得所有用户资料
对策:
$offset = intval($offset);
即可解决此问题.