何为注入?
比如我们在查询数据库的时候,我们通过文章的id号来取出这篇文章的所有信息。那么SQL语句可以这样写:
代码如下 | 复制代码 |
select * from blog where id=5 |
id的值通过用户的操作来传递,一般是GET方式,形如read.php?id=5。这样看起来是没有任何问题,但是如果我们稍微改下SQL语句:
代码如下 | 复制代码 |
select * from blog where id=5 or 1=1 |
1=1这个是恒等的,那么这条语句就会取出所有的文章。要修改这个只需要改一下GET的传值即可:read.php?id='5 or 1=1';注意这两个单引号...所以最简单的就是我们可以通过直接把参数改为单引号来查看这个链接是否存在注入。当然,非法用户看到所有的文章并不要紧,但是如果这个表是保存账号和密码的呢?
2.如何防范注入?
说到底,防范注入的根本就在于字符的过滤,因为非法用户一般都是通过构造URL来传值的,如果我们过滤了他传进来的非法参数,这非法的SQL语句就不会执行,那么我们也就防止网站被注入!
PHP内置的过滤字符串还是相当不错的,先看看具体代码:
代码如下 | 复制代码 |
function safe($s) { if(!get_magic_quotes_gpc()) { if(is_array($s)) foreach($s as $key=>$value) $s[$key] = addslashes($value); else $s=addslashes($s); } return $s; }
function html_safe($s) { return nl2br(htmlspecialchars(safe($s) )) ; } |
如果你不知道上面用到的几个内置函数,也懒了去查手册的话,那我就说下这几个函数:
magic_quotes_gpc这个称为魔术引号,如果这个功能开启,那么当向数据库中插入数据时,魔术引号所做的就是自动对所有的 GET、POST、COOKIE 数据运用 addslashes() 函数。get_magic_quotes_gpc()就是用来获取服务器上这个功能是否开启的:如果开启了,那么直接返回数据;如果没开启,那么手动对参数进行addslashes()转义。这样就可以防止双层转义~
addslashes -- 使用反斜线引用字符串。描述:string addslashes ( string str );返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。这些字符是单引号(')、双引号(")、反斜线()与 NUL(NULL 字符)。 一个使用 addslashes() 的例子是当你要往数据库中输入数据时。例如,将名字 O'reilly 插入到数据库中,这就需要对其进行转义。大多数据库使用 作为转义符:O'reilly。这样可以将数据放入数据库中,而不会插入额外的 。当 PHP 指令 magic_quotes_sybase 被设置成 on 时,意味着插入 ' 时将使用 ' 进行转义。
下面的那个htmlspecialchars就是对Html中的字符进行转换,比如说将‘&’转成‘&’,,将‘<’转成‘<’。nl2br这个是将回车换行转换成
,这个在用户输入评论之类的信息时候用得比较多。
通过上面的几个函数,我们已经可以过滤一些简单的注入了。另外再说几个小的方面:
对于最开始的那个例子,实际上改进的地方很多,比如写成这样看起来应该更规范一些:
代码如下 | 复制代码 |
SELECT * FROM `blog` WHERE `id`='$id' |
对于SQL的关键字我们用大写来表示,对于数据库中的表和字段我们用小写,另外在字段名和表名上加上“·”这个符号(键盘上数字1左边的那个键上),并且在进来的id上我们用单引号引起来。
对于这样的传进来参数是数字类型的,我们可以对$_GET到的值进行强制转换。但我更习惯这样:
代码如下 | 复制代码 |
$id = $_GET['id']*1; //获取文章的id,用来显示文章信息 if($id == 0){ echo "ERROR..."; exit(); } |
如果一发现传进来的不是数字,那么很大可能性性是存在问题的参数,那么我们直接给出错误提示然后退出就行,这样再省得再去给非法用户执行数据库查询操作了。
最后我们看一下JBlog中的一个处理注入的地方:
includecommon.php的38行
代码如下 | 复制代码 |
if ( !get_magic_quotes_gpc() ) { $_GET = add_slashes($_GET); $_POST = add_slashes($_POST); $_COOKIE = add_slashes($_COOKIE); } |
includefunc_global.php的194行
代码如下 | 复制代码 |
//addslashes function add_slashes($string) { if (!is_array($string)) return addslashes($string); foreach ($string as $key => $val) { $string[$key] = add_slashes($val); } return $string; }
|
当然,这应该只是一部分,其他的应该也大同小异。
茶杯头甜蜜终章dlc 官方手机版v1.0.0.3
下载火柴人传说暗影格斗内置菜单 最新版v3.0.1
下载荒野乱斗测试服 安卓版v61.10.3
下载荒野乱斗彩虹服 安卓版v61.10.3
下载寒霜启示录 安卓版v1.25.10
寒霜启示录是一款生存模拟游戏,不少玩家可能对于末日都有着自己
末日城堡免广告版 安卓最新版v0.7.1
末日城堡免广告版是一款非常好玩的模拟经营类游戏,内部可以不看
甜蜜人生模拟器 最新版v1.4.5
甜蜜人生模拟器是一款非常好玩的模拟恋爱手游,玩家在这里能够对
武器锻造师内置功能菜单 v10.4
武器锻造师内置菜单版是游戏的破解版本,在该版本中为玩家提供了
开放空间overfield 安卓版v1.0.5
开放空间Overfield是一款箱庭养成经营手游,让你在广阔