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.我还是比较喜欢这个

1:抵御99%的攻击方式,适用于90%的场景.

当网站不涉及复杂的用户交互时,可以对用户所有提交的文本进行htmlspecialchars函数处理。

在THINKPHP3.2版本中的操作步骤是:

一:在项目配置文件中添加配置: 'DEFAULT_FILTER' => 'htmlspecialchars', //默认过滤函数

二: 使用框架带的I方法获取来自用户提交的数据;

例子:M('Member')->save(array('content'=>I('post.content')));这样添加的content内容是经过htmlspecialchars处理过的.

提问:为什么经过htmlspecialchars处理过的文本可以保证是安全的?

回答:纵观XSS各种攻击方式绝大多数依赖<>'"& 这几个字符中的一个或几个对内容进行注入攻击。而htmlspecialchars函数的作用就是将这些字符转换成无害的HTML 实体;

提问:为什么有这么好的方法,而还有好多网站还是被攻击.

回答:因为好多程序员总会粗心忘记使用这个方法,而遗漏某条数据的过滤。

2:对COOKIE进行IP绑定

cookie里面一般有自动登录信息和session_id,就算对cookie里面的内容全部加了密,cookie的信息一但被别人通过XSS攻击获取后也一样等同于把自己的帐号密码给了别人。

对cookie进行IP绑定,(当然也可以获取用户客户端更多的其它信息进行同时绑定)可以根据用户的IP来判断这个cookie是不是来原始授权用户。

典型的应用示例:

用户设置了自动登录时保存自动登录信息:

$auto=I('post.auto');//用户设置了自动登录

if(!empty($auto)){

cookie('auto',encrypt(serialize($data)));//将登录信息保存到cookie,其中$data里含有加密后的帐号,密码,和用户的IP,这里的cookie已在全局中设置过期日期为一周

}

用户关闭浏览器再次访问网站时,进行自动登录

if (!is_login()) {//是否未登录状态?

$auth=cookie('auto');

if(!empty($auth)){//是否未有自动登录cookie?

$data=unserialize(decrypt($auth));

if(!empty($data) && !empty($data['username']) && !empty($data['password']) && !empty($data['last_login_ip'])){

$user=M('Member')->where(array('username'=>$data['username'],'password'=>$data['password']))->find();

if(!empty($user['id'])&&($user['last_login_ip']==get_client_ip())){//cookie帐号密码是否有效?//IP来源是否相同?

login_session($user['id'], $user['username'], $data['last_login_ip']);//用户自动登录成功

}

}

}

}

优点:大多数场景下可使被XSS攻击盗取的cookie失效。缺点:由于IP存在多台电脑共用的可能,对绑定做不到十分精细。

3:为COOKIE添加httponly配置

最新版本的thinkphp已经支持此参数。

此参数可以保证cookie只在http请求中被传输,而不被页面中的脚本获取,现市面上绝大多数浏览器已经支持。

4:HTML5值得观注的新特性:

为iframe的增加的sandbox属性,可以防止不信任的Web页面执行某些操作.相信这个方法以后会被广泛使用。

php中防sql注入,关于thinkphp中防SQL注入总结相关推荐

  1. php中msubstr,PHP学习:thinkphp中字符截取函数msubstr()用法分析

    <PHP学习:thinkphp中字符截取函数msubstr()用法分析>要点: 本文介绍了PHP学习:thinkphp中字符截取函数msubstr()用法分析,希望对您有用.如果有疑问,可 ...

  2. php中mvc代表什么意思,thinkphp中的mvc代表什么

    thinkphp中的mvc代表什么,控制器,视图,模型,目录,用户 thinkphp中的mvc代表什么 易采站长站,站长之家为您整理了thinkphp中的mvc代表什么的相关内容. ThinkPHP基 ...

  3. php 获取最后执行的sql,如何获取ThinkPHP框架最后一次执行SQL语句及变量调试

    这篇文章主要介绍了ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作,结合实例形式分析了thinkPHP获取最后一次执行SQL语句的getLastSql()及fetchSql()函数以及 ...

  4. mysql占位符 防注入_php mysql中防注入的几个小问题,麻烦大大帮我解答谢谢

    问:为什么第一种方式没有进行一个参数类型的绑定,那服务器怎么知道传过来的参数是不是合法? 回答: PHP是若类型语言,无需强制指定数据类型. 用户名,密码这样的参数是否合法,属于业务上的校验.上面的代 ...

  5. php多表数据排除,thinkphp中多表查询中防止数据重复的sql语句(必看)

    thinkphp中多表查询中防止数据重复的sql语句(必看) 这里有新鲜出炉的精品教程,程序狗速度看过来! ThinkPHP 开源 PHP 框架 ThinkPHP 是一个开源的 PHP 框架,是为了简 ...

  6. java中sql语句怎么把开始和结束时间作为参数写sql查询_聊一聊MyBatis 和 SQL 注入间的恩恩怨怨

    整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 引言 MyBatis 是一种持久层框架,介于 JDBC 和 Hi ...

  7. SQL Server应用程序中的高级SQL注入

    作者:不详 来源:techtarget http://www.csai.cn 2006年5月11日 摘要:这份文档是详细讨论SQL注入技术,它适应于比较流行的IIS+ASP+SQLSERVER平台.它 ...

  8. SQL Server应用程序中的高级SQL注入[转]

    SQL Server应用程序中的高级SQL注入[从A.Z的POST里转载,经过整理] 作者:Chris Anley[chris@ngssoftware.com] An NGSSoftware Insi ...

  9. ThinkPHP中的getLastSql函数---获取上次执行的SQL语句

    Thinkphp是我们经常用使用的一个php的MVC框架.通常我们把业务分类,分层,在不同的层处理不同的业务逻辑. 本文要讲的是model层,关于获取上次执行的SQL语句的问题.(用于日志记录,或者分 ...

最新文章

  1. MIT给人工智能“泼冷水”:AI创造性目前有限
  2. python 两个乘号是什么_(2)Python 变量和运算符
  3. android eclipse 按钮事件,android eclipse按钮的OnClick事件 - java
  4. spring学习(29):xml配置规范
  5. html如何设置滚动条居中,css3内容垂直居中及垂直滚动条例子
  6. matlab语言转化为python语言_matlab语言转译成python
  7. python-正则表达式1909
  8. django权限系统实现步骤_博主营地 | Unity红点系统如何实现?超全步骤分享
  9. CMake 手册详解(十八)
  10. 如何使用svconfigeditor.exe编辑WCF Service配置文件-配置一个基本的Endpoint(一)
  11. 变量的内部存储:引用和计数
  12. 【数学建模】五:MATLAB优化模型求解方法(1):标准模型
  13. win10快捷键及浏览器快捷键
  14. 微信公众号基本配置之服务器配置
  15. 此数据库处于单用户模式,当前某个用户已与其连接。 ALTER DATABASE 语句失败。 (Microsoft SQL Server,错误: 5064)...
  16. css实现方框内打勾
  17. sketch html尺寸,sketch教程 | 设置常用画板尺寸
  18. 小程序map组件一——使用腾讯地图个性化地图组件、腾讯云可视化大屏展示
  19. 一怒之下做了个基于微信公众平台结合百度地图的查公交应用!轻量!方便!快捷!
  20. OBB包围盒及其碰撞检测算法(一)

热门文章

  1. CSS高级技巧(七)
  2. 智云盾捕获多个僵尸网络利用最新ConfluenceRCE漏洞的活动
  3. 文档文档被设置了保护密码的处理办法
  4. golang基础之RPC的客户端和服务端
  5. 非常好用的5款电脑软件
  6. 创业做亚马逊测评到底可以吗?有市场吗?靠谱吗?
  7. Unity Foreach实现
  8. C,C++面试题之2
  9. jdk8.0 在线中文帮助文档地址(一步及达)
  10. 三维重建系列——坐标系从二维到三维