新闻中心
消费主张 IT业界 今日观察 消费警示 曝光台 热点专栏 奇闻趣事 一语惊人 专利之窗 动态备忘
领券购
生活必须 吃货优选 学习艺术 旅游出行 手机电脑 电子电器 热血男装 热销女装
图片中心
美女欣赏 风景欣赏 艺术欣赏 实物图片 制作美图 生活图片
下载中心
手机软件 语文数学 常用软件 红绿软件 信息社政 音体美合 科学自然 英语外语
映讯频道
浓缩电影 邻国热剧 一技之长 艺术无界 教育教学 纪录之窗 战争片 动作片 情感片 国内片 喜剧片 恐怖片 科幻片 大陆剧 港澳台剧 动漫片 明星云集 欧美剧集
聚划算
数码产品 服装服饰 家电家具 装潢装饰 商旅游玩 生活必备 二手特色 健康保健
FLASH频道
MTV类 运动游戏 益智游戏 女生游戏 休闲游戏 电脑运用 有声故事 有声艺术
社会专题
美文园地 制作教程 历史天空 游山玩水 美食天下 科技科幻 天文地理 时尚酷玩 健康保健 寻医问药 有书有道 农村特色 幽默笑话 汽车电子 星新一代 教育咨询 天下军事 硬件网络 黑白社会 靓丽女人 代码效果 免费资源 便民服务 办公达人 玄幻奇幻 软件技术
关闭
当前位置:首页社会专题硬件网络
产生二次漏洞的原因及怎么预防

MySQL二次漏洞的简单预防:

本文主要针对PHP对MySQL的操作简单提出产生二次漏洞的原因,以及防范方案。

一、提出问题

众所周知,数据库操作中对于一些特殊字符(例如单引号“'”、反斜线“\”等元字符)有着严格的限制,如果向数据库中写入的数据含有这样的特殊字符,操作将会带来不安全因素。所以对于用户输入的数据,我们完全认为它是没有安全性的,需要在程序中对其进行适当的过滤处理后,方可写入数据库。

对于这点,相信大多数PHP程序员都会注意到,一般采取的方法是使用AddSlashes()字符串函数对用户输入的数据进行处理,把数据中的特殊字符加上反斜线进行转译。这样对于一般的数据库写入是正常的,并不会带来什么问题,而问题来源于之后的取出操作。对于前面用AddSlashes()函数进行转译后保存在数据库中的数据,经过查看数据库我们发现里面存储的是原始的数据,也就是说其中的特殊字符并没有被加上反斜线。此时当数据来源于这时的数据库本身时,安全问题仍然存在,这就造成了二次漏洞。

流程描述 原始的数据,如“'”=> 程序处理(安全的数据如“\'” )=> MySQL里存

储(原始的数据如“'”) => 程序处理(处理的是“'”)=> 产生危险

二、分析问题

因此在进行数据过滤的时候,不要只是暂时地让数据失去危害,可以考虑永久地让数据失去危害,譬如在过滤的时候不是将“'”变成“\'”等,而是在条件允许的情况下将其直接转换成HTML字符“'”,这样并不影响显示但是数据却不再会包含让数据库的元字符,所以不用担心注入漏洞了,其他的字符可以一样考虑处理。

三、解决问题

为解决此问题,我们可以用str_replace()函数依次对必要的特殊字符进行替换。此时要注意替换后的字符串长度将会改变,每替换一个字符,字符串长度将会增加5。我们还需在写入数据库之前判断它是否超过字段大小。

五、演示代码

File:test.php

代码:

<?php

/*

*   二次漏洞简单检测

*   Author Linvo

*   Build 2007-11-8

*/

/*

*   链接数据库(根据情况自己修改)

*/

$Host = 'localhost';

$User = 'root';

$Pass = 'password';

$DB = 'test'; //测试库名

$db = @mysql_connect($Host,$User,$Pass);

if(!$db)    die("连接服务器MySQL出错!");

else    if(!mysql_select_db($DB,$db))   die("连接数据库出错!");

define(INPUT_MAX_LENGTH, 10);   //前台maxlength值(初步检测)

define(INDB_MAX_LENGTH, 20);    //数据库中字段设置的大小值(用于写入前的必要安全测试)

/*

*   原始数据(如用户输入等)

*/

$string = "’\\"; //用户输入内容

if(strlen($string) > INPUT_MAX_LENGTH) //初步检测

die("输入内容超长");

echo "输入的内容:".$string;

/*

*   过滤方案

*/

//$string_in1 = AddSlashes($string); //方案一:临时失去危险,但有二次漏洞

$string_in1 = str_slashes($string); //方案二:永久性失去危险!(自定义函数)

/*

*   安全测试

*/

$string_in2 = test_db($string_in1, 1); //一次漏洞检测

$string_in3 = test_db($string_in2, 2); //二次漏洞检测

/*

*   数据库操作(函数)

*/

function test_db($str_in, $time)

{

echo "第 $time 次要写入的内容:".$str_in;

if(strlen($str_in) > INDB_MAX_LENGTH) die("第 $time 次写入数据超长!");//必要安全测试!

$result = mysql_query("INSERT INTO str(str) VALUES('$str_in')"); //写入

if(!$result)

{

die("<font color=red>第 $time 次写入数据库失败</font>");

}

echo "第 $time 次写入完毕";

$result = mysql_query("SELECT str FROM str ORDER BY id DESC LIMIT 1");//取出

if($item = mysql_fetch_array($result))

{

$str_out = $item['str'];

}

echo "第 $time 次输出:".$str_out."";

return $str_out;

}

/*

*   永久性过滤危险字符

*/

function str_slashes($str)

{

$str = str_replace("'","'",$str); //转译 '

$str = str_replace("\\","\",$str); //转译 \

return $str;

}

?>

提示:输入修改代码都可运行!
1
酒精度
60
顶一下
相关阅读
内容加载中……