thinkphp怎么做才是安全的sql防注入
注入的产生一般都是对用户输入的参数未做任何处理直接对条件和语句进行拼装.
代码举例:
//不安全的写法举例1
$_GET['id']=8;//希望得到的是正整数
$data=M('Member')->where('id='.$_GET['id'])->find();
$_GET['id']='8 or status=1';//隐患:构造畸形查询条件进行注入;
//安全的替换写法
$data=M('Member')->where(array('id'=>$_GET['id']))->find();//使用数组方式将自动使用框架自带的字段类型检测防止注入
$data=M('Member')->where(array('id'=>(int)$_GET['id']))->find();//类型约束
$data=M('Member')->where('id='.intval($_GET['id']))->find();//类型转换
$data=M('Member')->where(array('id'=>I('get.id','','intval')))->find();//本人习惯写法
$data=M('Member')->where(array('id'=>':id'))->bind(':id',I('get.id'))->select();//PDO驱动可以使用参数绑定
$data=M('Member')->where("id=%d",array($_GET['id']))->find();//预处理机制
//不安全的写法举例2
$_GET['id']=8;//希望得到的是正整数
$data=M()->query('SELECT * FROM `member` WHERE id='.$_GET['id']);//执行的SQL语句
$_GET['id']='8 UNION SELECT * FROM `member`';;//隐患:构造畸形语句进行注入;
2.防止注入的总的原则是<<根据具体业务逻辑,对来源于用户的值的范围,类型和正负等进行限制和判断>>,同时<<尽量使用THINKPHP自带的SQL函数和写法>>.
3.在THINKPHP3.2版本中的操作步骤是:
一:在项目配置文件中添加配置: 'DEFAULT_FILTER' => 'htmlspecialchars', //默认过滤函数
二: 使用框架带的I方法获取来自用户提交的数据;
例子:M('Member')->save(array('content'=>I('post.content')));这样添加的content内容是经过htmlspecialchars处理过的.
4.为COOKIE添加httponly配置
5.最新版本的thinkphp已经支持此参数。
6.HTML5值得观注的新特性:
富文本过滤是,XSS攻击最令人头疼的话题,不仅是小网站,就连BAT这样的巨头也是三天两头的被其困扰.
问题分析:
SQL注入大部分情况下都是由于并没有对用户提交的数据、URL参数等进行过滤,而恰恰在这些未被过滤的参数或数据中存在了sql执行语句,最终导致数据库的数据被篡改、被导出等风险。
解决方案:
在Thinkphp框架中,不要使用类似$_GET或者$_POST等PHP原生的数据获取方式,可以使用框架提供一个函数来获取这些数据及参数。目前较为常用的Thinkphp版本有3.2系列以及5.0系列,他们的方法大同小异,但略有区别,接下来我们分别对这2个系列版本进行实际讲解。
1、Thinkphp3.2系列版本:
在Thinkphp3.2版本中,提供了函数 I 来对数据或者URL参数进行过滤及获取。
举例如下:
I('get.'); //相当于获取全部$_GET的数据。
I('get.name'); //相当于获取$_GET['name']的数据。
I('post.'); //相当于获取全部的$_POST的数据。
I('post.id'); //相当于获取$_POST['id']的数据。
2、Thinkphp5.0系列版本:
在Thinkphp5.0版本中,提供了函数 input 来对数据或者URL参数进行过滤及获取。其使用方法与Thinkphp3.2版本中类似。
举例如下:
input('get.'); //相当于获取全部$_GET的数据。
input('get.name'); //相当于获取$_GET['name']的数据。
input('post.'); //相当于获取全部的$_POST的数据。
input('post.id'); //相当于获取$_POST['id']的数据。
2018-07-28 · 做真实的自己 用良心做教育
比如 I("post.name") 来获取 $_POST["name"]的值.
另外,SQL查询的时候,where语句尽量使用数组方式.你可以参考官网手册中的where
广告 您可能关注的内容 |