前言
随着WEB开发的发展如日中天,越来越多的程序猿加入这个行列,尤其是在大型项目团队开发的过程中,程序员们的水平参差不齐。导致各种各样的安全验证不严密导致各种问题。正如那句话所说,水桶能装水的多少不取决于最高的挡板,而是最低的挡板。
那今天我就给大家演示一下常见的安全问题SQL的形成原因和预防。
环境准备
我本来打算用java做实验的,考虑到PHP的话比较快,就用PHP演示吧。
下面是我连接数据库的代码以及数据库的内容。文件名sql.php
<?php $conn=mysql_connect('localhost','root','root') or die("数据库连接失败"); mysql_query("set names gb2312"); mysql_select_db("mytest"); $id=$_GET['id']; $sql2="select * from user where id =".$id; $result2=mysql_query($sql2); while($alluser=mysql_fetch_array($result2)) { echo $alluser["name"]."==>".$alluser["school"]."<br>"; } mysql_close($conn); ?>
这是很常见的连接数据库代码,数据库中有三个字段分别是id title content
那我们访问我们的地址
http://127.0.0.1/safe/sql.php?id=1
从数据库中读取id为1的内容,并输入到页面。
访问正常.那么如果我们构造URL成这个样子呢?
http://127.0.0.1/safe/sql.php?id=1 and 1=1 //这个是显示正常的,意思是把and后的也一起查询。1=1显然成立
http://127.0.0.1/safe/sql.php?id=1 and 1=2 //这个是显示不正常的,意思是把and后的也一起查询。1=2显然不成立
结果如下图
这样是很明显有SQL注入的漏洞的。
你以为这个漏洞没什么影响么?那你大错特错了。
稍微有点数据库的知识就可以构造一下查询的语句
如上可看到,我们用order这个方法的时候,可以猜测到一共有多少字段,很显然3个是正确的。
那么接下来可以用union来连接查询,前提知道管理员表名。
构造URL如下
http://127.0.0.1/safe/sql.php?id=1 union select 1,2,3 from admin
这可能需要一点数据库知识,意思是连接查询,可将显示位输出到当前页面。
结果如下
很显然多出了一个1和2的显示位,那么就可以得到敏感信息了。
构造如下
127.0.0.1/safe/sql.php?id=1 union select username,password,3 from admin
意思不在累述。
结果如下
这样你的后台管理账号和密码就被显示出来了,如果你的项目后台被别人登陆,后果不堪设想!
PS:本文只是为提高程序猿的安全意识,加强安全防护,请不要用于非法用途!由于水平有限,本文只做抛砖引玉,转载请注明出处,谢谢。
那么怎么预防这个问题呢?这个也是很简单的,只要在GET或POST中过滤一下参数就可以了。用正则表达式或者其他都是可以的。目前的很多框架都是已经过滤的,具体怎么用就交给你自己了哦。实在不会的话可以留言。
在web开发中你不得不注意的安全验证问题#1-SQL