SQL注入攻击与防御

一、什么是SQL注入 
    程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。

    攻击者可以提交一段精心构造的数据库查询代码,根据返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。

受影响的系统:对输入的参数不进行检查和过滤的系统。

二、简单的SQL注入实例 
假设这么一个情景,一个网页的后台入口处需要验证用户名和密码,验证程序的SQL语句是这样写: 
Select* fromadminwhereuser=‘TxtBox1.txt’andpass=‘TxtBox2.txt’ 
如果用户填写的用户名和密码都是: ‘abc’ or ‘1’=‘1’ 
那么将导致SQL语句是: 
Select* fromadminwhereuser=‘abc’ or ‘1’=‘1’andpass==‘abc’ or ‘1’=‘1’ 
这条语句是永真式,那么攻击者就成功登陆了后台。这就是最简单的SQL注入方式。

三、SQL注入过程 
(1).寻找可能存在SQL注入漏洞的链接 
(2).测试该网站是否有SQL注入漏洞 
(3).猜管理员帐号表 
(4).猜测管理员表中的字段 
(5).猜测用户名和密码的长度 
(6).猜测用户名 
(7).猜测密码

四、SQL注入的防范 
由于SQL注入攻击是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以许多防火墙等都不会对SQL注入发出警报。而目前互联网上存在SQL注入漏洞的Web站点并不在少数,对此,网站管理员和Web应用开发程序员必须引起足够的重视。

SQL注入漏洞在网上极为普遍,通常是由于程序员对用户提交的数据和输入参数没有进行严格的过滤所导致的。

比如过滤逗号,单引号,分号等;如果select、delete、from、*、union之类的字符串同时出现多个的话,也要引起重视;最好对用户提交的参数的长度也进行判断。

防范SQL注入的另一个可行办法是摒弃动态SQL语句,而改用用户存储过程来访问和操作数据。这需要在建立数据库后,仔细考虑Web程序需要对数据库进行的各种操作,并为之建立存储过程,然后让Web程序调用存储过程来完成数据库操作。这样,用户提交的数据将不是用来生成动态SQL语句,而是确确实实地作为参数传递给存储过程,从而有效阻断了SQL注入的途径

PHP与SQL注入防御小例

下面的代码:PHP代码

if ($admin)    
{    
echo '登陆成功!';    
include('admin.php');    
}    
else    
{    
echo '你不是管理员,无法进行管理!';    
}    

我们的这个页是http://daybook.diandian.com/login.php,那么我们提交:http://daybook.diandian.com/login.php?admin=1,直接就是管理员了,直接进行管理。
如何避免上面的问题呢?首先,从php.ini入手,把php.ini里面的register_global =off,就是不是所有的注册变量为全局,那么就能避免了。但是,我们不是服务器管理员,只能从代码上改进了,那么我们如何改进上面的代码呢?我们改写如下:
  • PHP代码
$admin = 0; // 初始化变量    
if ($_POST['admin_user'] && $_POST['admin_pass'])    
{    
// 判断提交的管理员用户名和密码是不是对的相应的处理代码    
// ...    
$admin = 1;    
}    
else    
{    
$admin = 0;    
}    
if ($admin)    
{    
echo '登陆成功!';    
include('admin.php');    
}    
else    
{    
echo '你不是管理员,无法进行管理!';    
}    

那么这时候你再提交`http://daybook.diandian.com/login.php?admin=1`就不好使了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值