前言
随着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
訪问正常.那么假设我们构造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:本文仅仅是为提高程序员的安全意识。加强安全防护。请不要用于非法用途。因为水平有限,本文仅仅做抛砖引玉,转载请注明出处,谢谢。
那么怎么预防这个问题呢?这个也是非常easy的。仅仅要在GET或POST中过滤一下參数就能够了。
用正則表達式或者其它都是能够的。眼下的非常多框架都是已经过滤的。详细怎么用就交给你自己了哦。实在不会的话能够留言。