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为 index.php?id=1 ,那么程序语句的实际行为:$sql = “SELECT * FROM `xxxx` WHERE `id` = 1 ORDER BY id ASC”;(的确,这没问题)
再举一个例子,如果这个句子对应url为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’]); 即可。
是管理员,frontopen管理员,嗯,介绍结束了!
站内专栏 站点 站内专栏 站内专栏 QQ交谈
捐 如果你认为这篇文章有用,请支持作者!鼓励作者写更好更多的文章!