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值得观注的新特性:

9.富文本过滤

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

温馨提示:内容为网友见解,仅供参考
第1个回答  2017-05-10

问题分析:

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']的数据。

第2个回答  2018-07-28
thinkphp核心代码已经处理过了,你只需要在获取参数的时候,使用他默认的 I 函数就可以了.
比如 I("post.name") 来获取 $_POST["name"]的值.

另外,SQL查询的时候,where语句尽量使用数组方式.你可以参考官网手册中的where本回答被网友采纳

在thinkphp框架中如何防止sql注入
在ThinkPHP框架中,防止SQL注入的关键在于使用参数绑定和查询构造器,避免直接将用户输入拼接到SQL语句中。首先,ThinkPHP提供了强大的数据库操作类,其中包含了各种数据库操作方法。当使用这些方法时,框架会自动对输入的数据进行转义处理,从而降低SQL注入的风险。但更为推荐的做法是使用参数绑定。参数绑定能够...

ThinkPHP如何防止SQL注入?
(1)查询条件尽量使用数组方式,这是更为安全的方式;(2)如果不得已必须使用字符串查询条件,使用预处理机制;(3)使用绑定参数;(4)强制进行字段类型验证,可以对数值数据类型做强制转换;(5)使用自动验证和自动完成机制进行针对应用的自定义过滤;(6)使用字段类型检查、自动验证和自动完成机制等...

thinkphp怎么做才是安全的sql防注入
_GET['id']='8 UNION SELECT * FROM `member`';;\/\/隐患:构造畸形语句进行注入;2.防止注入的总的原则是<<根据具体业务逻辑,对来源于用户的值的范围,类型和正负等进行限制和判断>>,同时<<尽量使用THINKPHP自带的SQL函数和写法>>.3.在THINKPHP3.2版本中的操作步骤是:一:在项目配置文件中添加...

thinkphp怎么做才是安全的sql防注入
主要的sql注入来源于数据请求。比如表单的提交。攻击者会在请求中带上一些可执行的sql语句。达到注入的目的。Thinkphp内置了数据过滤机制。可以有效的将一些存在风险的符号过滤处理。具体如下:1、Thinkphp3.2版本:使用I方法来获取post、get等参数。例如获取id参数。I('get.id');I('post.id');2、T...

php如何防止sql注入
采用escape函数过滤非法字符。escape可以将非法字符比如 斜杠等非法字符转义,防止sql注入,这种方式简单粗暴,但是不太建议这么用。自己手写过滤函数,手写一个php sql非法参数过滤函数来说还是比较简单的,但是你的函数需要非常的健壮,不让仍然有可能被非法黑客攻击;你的Coding水平直接决定了你的函数的健壮性...

Thinkphp3.2.3 SQL注入总结
针对ThinkPHP3.2.3版本的SQL注入总结,首先确保数据库配置正确,使用预定义的数据库如sqllabs的数据库。构建一个查询入口,如在Application\/Home\/Controller\/IndexController.class.php文件中,使用sqllabs的users表。ThinkPHP内置了大写函数,对SQL注入进行检测。常规注入方法如'1' or '1'='1'#在实际...

thinkphp 3.2.3 exp注入漏洞分析
id[0]=exp&id[1]==1 or sleep(5)。通过断点调试,跟踪至Model类的select函数,进而深入至其内部处理逻辑,发现$exp的值即为传入的exp,该值被直接拼接到后续SQL语句中,形成SQL注入。使用I函数可以防止注入攻击,原因在于ThinkPHP\\Common\\functions.ph中的think_filter函数会将特殊关键字(如EXP、OR...

Thinkphp框架 < 5.0.16 sql注入漏洞分析
在\\thinkphp\\library\\think\\db\\Query.php中,`parseTable`函数对传入的数组进行处理。然而,当数组的第一个元素为'inc'时,函数并未进行安全检查,导致SQL注入。示例中的数组被拼接进SQL语句后执行,成功引发了错误,表明攻击成功。对于为何设置特定数组格式,是为了在后续的代码中组合数据。`parseData`...

ThinkPHP 3.2.0 的注入漏洞,如何在这个程序利用
Thinkphp里面的where方法是具有过滤作用的,也就是说你这里想通过openid参数去注入是失败的。因为where方法对传入的参数进行了转义。具体可以去看下源码。

ThinkPHP漏洞分析与利用
这些函数风险点大部分可能导致SQL注入漏洞。因此,在利用ThinkPHP进行Web开发时,开发者应关注框架的历史风险点,尽量避免使用这些函数或版本,以确保Web应用的安全性。基于漏洞分析,可总结出几种直接利用ThinkPHP框架漏洞的利用链。其中,ThinkPHP 2.x\/3.0版本存在GetShell漏洞,而ThinkPHP 5.0、5.1...

相似回答