今天分享一个Thinkphp安全方面的知识:SQL注入篇
1. 什么是SQL注入?
利用现有应用程序,将(恶意)的SQL命令注入到后台数据库执行一些恶意的操作。这是黑客对数据库进行攻击的常用手段之一。
2. 导致SQL注入原因
程序在编写的时候,没有对输入的数据的合法性进行判断,注入者可在表单中输入一段数据库查询代码并提交,程序可将提交的信息组成一条sql语句,服务器执行该条sql语句。注入者可根据程序返回的结果,获取一些敏感数据,甚至控制整个服务器。
3. ThinkPHP如何防止sql注入?(个人整理的一些建议)
- 查询条件尽量使用数组方式,这是更为安全的方式
- 如果不得已必须使用字符串查询条件,使用预处理机制
- 使用自动验证和自动完成机制进行针对应用的自定义过滤;
- 如果环境允许,尽量使用PDO方式,并使用参数绑定。
防止措施:
-
使用数组方式将自动使用框架自带的字段类型检测防止注入
//获取正常的id值 $_GET['id'] = 8; //直接将数据放入where条件 $data = M('User')->where('id='.$_GET['id'])->find(); //此时用于若是传递“异常”的id $_GET['id'] = '8 or status = 1'; //解决方式:可以使用数组方式来传递数据 $data = M('User')->where(array('id'=>$_GET['id']))->find();
-
使用预处理机制
$data = M('User')->where(("id=%d and username='%s'",array($id,$username))->select();
-
对获取的数据进行类型约束
$data = M('User')->where(array('id'=>(int)$_GET['id']))->find();
-
对类型进行强制转换
$data = M('User')->where(array('id'=>I('get,id',’’,’intval’)))->find();
-
PDO驱动可以使用参数绑定
$data = M('User')->where(array('id'=>':id'))->bind(':id',I('get.id'))->select();
网友评论