来源:自学PHP网 时间:2015-04-15 15:00 作者: 阅读:次
[导读] SQL注入,这个词相信多数程序员都不陌生。而且可能都对这样的漏洞攻击有过修补的经验。本文主要还是写给一些新手程序员看,避免自己写的程序被黑客利用,提升安全性。下面以P...
SQL注入,这个词相信多数程序员都不陌生。而且可能都对这样的漏洞攻击有过修补的经验。本文主要还是写给一些新手程序员看,避免自己写的程序被黑客利用,提升安全性。下面以PHP程序为例进行讲解 SQL注入的原理 要说原理,主要还是从PHP的MYSQL查询语句开始。让我们来看一下 普通的数据库查询语句。如下: $sql = “SELECT * FROM `xxxx` WHERE `id` = ‘$id’ ORDER BY id ASC”; 这是一条普通的查询语句。为了让程序能够通过get 或 post方式传参进行动态查询,一般都会通过在SQL语句中加入变量的方式进行查询;即上面语句中的变量”$id”。 一般来说,PHP程序员都会使用$_GET['']、$_REQUEST['']等方式获取url中的传参。这样一来,便给了黑客可乘之机。 举个例子,上面这条语句中如果对应的url为 www.521478.com/index.php?id=1 , 那么程序语句实际上之行为:$sql = “SELECT * FROM `xxxx` WHERE `id` = 1 ORDER BY id ASC”;(确实,这样是没问题的) 再举个例子,如果这条语句中对应的url为www.521478.com/index.php?id=1 and 1=1 ,那么程序语句已经变成了 $sql = “SELECT * FROM `xxxx` WHERE `id` = 1 and 1=1 ORDER BY id ASC”; 到这里,大家应该清楚黑客是如何利用SQL注入漏洞进行攻击了吧?看清了注入漏洞的工作原理,我们现在要做的就是把变量$id通过$_GET['']等方式获取来的参数字符进行过滤。 例如:我们过滤掉”and”,”=” 这样的字符,那么程序语句就变成了$sql = “SELECT * FROM `xxxx` WHERE `id` = 1 11 ORDER BY id ASC”; 黑客就无法额外增加一些SQL查询语句来进行程序设计以外的动作。 如何过滤URL传参的变量 在PHP程序中,我们可以使用 str_replace() 函数对字符串变量的内容进行字符替换。 语法如下:str_replace(“需要替换的字段”,”替换为的字段”,”字符串内容”); 套用到上面的例子中,假如我们需要过滤掉”and”我们可以这样写: $id = $_GET['id']; $id=str_replace(“and”,”",$id); 这样一来,变量id字符串中的”and”被替换为空字符,可以理解为被删除了。可能大家会问,这样不是只替换了一个字符吗?SQL中的执行字符好像很多啊? 没错,在不同的使用环境下,可能我们某一个程序需要替换十几个字符。所以我们需要使用数组的方式,将字符替换封装为一个函数,便于我们在任何时候调用它。 字符替换函数 function fliter_sql($value) { $sql = array(“select”, ‘insert’, “update”, “delete”, “‘”, “/*”, “../”, “./”, “union”, “into”, “load_file”, “outfile”,”=”,”aNd”,”!”,”script>”,”<”,”>”,”iframe>”,’onlaod’,'”>’); $sql_re = array(“”,”",”",”",”",”",”",”",”",”",”",”",”",”",”",”",”",”",”",”",”"); return str_replace($sql, $sql_re, $value); } 这是我经常使用的过滤函数,通过它基本上可以过滤掉绝大多数的SQL注入。使用的时候只需要调用这个函数,例如:$id = fliter_sql($_GET['id']); 即可。 如果帮到大家,转载时请附带加上一个出处,文章来自“521478”
|
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com