在web开发中你不得不注意的安全验证问题#1-SQL

前言

随着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:本文仅仅是为提高程序员的安全意识。加强安全防护。请不要用于非法用途。因为水平有限,本文仅仅做抛砖引玉,转载请注明出处,谢谢。


那么怎么预防这个问题呢?这个也是非常easy的。仅仅要在GET或POST中过滤一下參数就能够了。

用正則表達式或者其它都是能够的。眼下的非常多框架都是已经过滤的。详细怎么用就交给你自己了哦。实在不会的话能够留言。




posted on 2019-05-13 20:42  xfgnongmin  阅读(133)  评论(0编辑  收藏  举报

导航