thinkphp怎么做才是安全的sql防注入

 我来答
黑马程序员
2017-03-09 · 改变中国IT教育,我们正在行动
黑马程序员
黑马程序员为大学毕业后,有理想、有梦想,想从事IT行业的年轻人改变自己的命运。黑马程序员成就IT黑马
向TA提问
展开全部
  1. 注入的产生一般都是对用户输入的参数未做任何处理直接对条件和语句进行拼装.


    代码举例:

    //不安全的写法举例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值得观注的新特性:

9.富文本过滤

富文本过滤是,XSS攻击最令人头疼的话题,不仅是小网站,就连BAT这样的巨头也是三天两头的被其困扰.

张恺阳
2017-05-10 · 知道合伙人软件行家
张恺阳
知道合伙人软件行家
采纳数:166 获赞数:532
开发过各种类型网站及APP等,如有相关问题可以随时向我提问。

向TA提问 私信TA
展开全部

问题分析:

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 · 做真实的自己 用良心做教育
千锋教育
千锋教育专注HTML5大前端、JavaEE、Python、人工智能、UI&UE、云计算、全栈软件测试、大数据、物联网+嵌入式、Unity游戏开发、网络安全、互联网营销、Go语言等培训教育。
向TA提问
展开全部
thinkphp核心代码已经处理过了,你只需要在获取参数的时候,使用他默认的 I 函数就可以了.
比如 I("post.name") 来获取 $_POST["name"]的值.

另外,SQL查询的时候,where语句尽量使用数组方式.你可以参考官网手册中的where
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式