防止SQL注入的常见方法

时间:2017-06-23 23:47:02 类型:PHP
字号:    

一、SQL注入简介

    SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库。


二、SQL注入攻击的总体思路

1.寻找到SQL注入的位置

2.判断服务器类型和后台数据库类型

3.针对不通的服务器和数据库特点进行SQL注入攻击

 

三、SQL注入攻击实例

比如在一个登录界面,要求输入用户名和密码:

可以这样输入实现免帐号登录:

用户名: ‘or 1 = 1 –

密 码:

点登陆,如若没有做特殊处理,那么这个非法用户就很得意的登陆进去了.(当然现在的有些语言的数据库API已经处理了这些问题)

这是为什么呢? 下面我们分析一下:

从理论上说,后台认证程序中会有如下的SQL语句:

String sql = "select * from user_table where username=

' "+userName+" ' and password=' "+password+" '";

当输入了上面的用户名和密码,上面的SQL语句变成:

SELECT * FROM user_table WHERE username=

'’or 1 = 1 -- and password='’

分析SQL语句:

条件后面username=”or 1=1 用户名等于 ” 或1=1 那么这个条件一定会成功;

然后后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用,这样语句永远都能正确执行,用户轻易骗过系统,获取合法身份。

这还是比较温柔的,如果是执行

SELECT * FROM user_table WHERE

username='' ;DROP DATABASE (DB Name) --' and password=''

….其后果可想而知…

四. 解决方法:

 1>   首先对接收到的数据先进行字符串过滤, 如使用以下函数 

    

function post_check($post) {    
	if (!get_magic_quotes_gpc()) {    // 判断magic_quotes_gpc是否为打开    
		$post = addslashes($post);    // 进行magic_quotes_gpc没有打开的情况对提交数据的过滤    
	}    
	//$post = str_replace("_", "", $post);    // 把 '_'过滤掉    
	$post = str_replace("%", "", $post);    // 把 '%'过滤掉   
	$post = str_replace("'", "", $post);
	$post = str_replace("exec", "", $post);
	$post = str_replace("select", "", $post);
	$post = str_replace("update", "", $post);
	$post = str_replace("exec", "", $post);
	$post = str_replace("from", "", $post);
	$post = str_replace("drop", "", $post);    
	$post = nl2br($post);    // 回车转换    
	$post = htmlspecialchars($post);    // html标记转换      
     return $post;    
} 


2. 平台尽量使用一些PHP 框架来操作, 因为这些框架在底层都使用了安全过滤机制, 如: THINKPHP框架, 在底层使用了PDO预处理机制及自动参数绑定功能

3. 如果一定要使用原生SQL语句查询, 请使用PDO的参数绑定, 或者命名点位符功能