Yii框架防止sql注入,xss攻击与csrf攻击的方法


Posted in PHP onOctober 18, 2016

本文实例讲述了Yii框架防止sql注入,xss攻击与csrf攻击的方法。分享给大家供大家参考,具体如下:

PHP中常用到的方法有:

/* 防sql注入,xss攻击 (1)*/
function actionClean($str)
{
    $str=trim($str);
    $str=strip_tags($str);
    $str=stripslashes($str);
    $str=addslashes($str);
    $str=rawurldecode($str);
    $str=quotemeta($str);
    $str=htmlspecialchars($str);
    //去除特殊字符
    $str=preg_replace("/\/|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\+|\{|\}|\:|\<|\>|\?|\[|\]|\,|\.|\/|\;|\'|\`|\-|\=|\\\|\|/", "" , $str);
    $str=preg_replace("/\s/", "", $str);//去除空格、换行符、制表符
    return $str;
}
//防止sql注入。xss攻击(1)
public function actionFilterArr($arr)
{
    if(is_array($arr)){
      foreach($arr as $k => $v){
        $arr[$k] = $this->actionFilterWords($v);
      }
    }else{
      $arr = $this->actionFilterWords($arr);
    }
    return $arr;
}
//防止xss攻击
public function actionFilterWords($str)
{
    $farr = array(
      "/<(\\/?)(script|i?frame|style|html|body|title|link|meta|object|\\?|\\%)([^>]*?)>/isU",
      "/(<[^>]*)on[a-zA-Z]+\s*=([^>]*>)/isU",
      "/select|insert|update|delete|drop|\'|\/\*|\*|\+|\-|\"|\.\.\/|\.\/|union|into|load_file|outfile|dump/is"
    );
    $str = preg_replace($farr,'',$str);
    return $str;
}
//防止sql注入,xss攻击(2)
public function post_check($post) {
   if(!get_magic_quotes_gpc()) {
     foreach($post as $key=>$val){
       $post[$key] = addslashes($val);
     }
    }
   foreach($post as $key=>$val){
    //把"_"过滤掉
    $post[$key] = str_replace("_", "\_", $val);
    //把"%"过滤掉
    $post[$key] = str_replace("%", "\%", $val); //sql注入
    $post[$key] = nl2br($val);
    //转换html
    $post[$key] = htmlspecialchars($val); //xss攻击
   }
   return $post;
}

调用:

//防止sql
$post=$this->post_check($_POST);
//var_dump($post);die;
$u_name=trim($post['u_name']);
$pwd=trim($post['pwd']);
if(empty($u_name)||empty($pwd))
{
  exit('字段不能非空');
}
$u_name=$this->actionFilterArr($u_name);
$pwd=$this->actionFilterArr($pwd);
//防止sql注入,xss攻击
$u_name=$this->actionClean(Yii::$app->request->post('u_name'));
$pwd=$this->actionClean(Yii::$app->request->post('pwd'));
$email=$this->actionClean(Yii::$app->request->post('email'));
//防止csrf攻击
$session=Yii::$app->session;
$csrf_token=md5(uniqid(rand(),TRUE));
$session->set('token',$csrf_token);
$session->set('token',time());
//接收数据
if($_POST)
{
  if(empty($session->get('token')) && $session->get('token')!=Yii::$app->request->post('token') && (time()-$session->get('token_time'))>30){
    exit('csrf攻击');
  }
  //防止sql
  .....

(必须放在接收数据之外)

注意:

表单提交值,为防止csrf攻击,控制器中需要加上:

//关闭csrf
piblic $enableCsrfValidation = false;

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
十天学会php之第五天
Oct 09 PHP
用PHP读取IMAP邮件
Oct 09 PHP
PHP 内存缓存加速功能memcached安装与用法
Sep 03 PHP
php去除HTML标签实例
Nov 06 PHP
浅谈PHP调用Webservice思路及源码分享
Jun 04 PHP
ThinkPHP单字母函数(快捷方法)使用总结
Jul 23 PHP
PHP中exec函数和shell_exec函数的区别
Aug 20 PHP
PHP遍历XML文档所有节点的方法
Mar 12 PHP
php通过array_unshift函数添加多个变量到数组前端的方法
Mar 18 PHP
php htmlentities()函数的定义和用法
May 13 PHP
php中使用websocket详解
Sep 23 PHP
php curl上传、下载、https登陆实现代码
Jul 23 PHP
php中array_slice和array_splice函数解析
Oct 18 #PHP
Yii框架中jquery表单验证插件用法示例
Oct 18 #PHP
Yii框架实现邮箱激活的方法【数字签名】
Oct 18 #PHP
PHP魔术方法以及关于独立实例与相连实例的全面讲解
Oct 18 #PHP
浅谈PHP拦截器之__set()与__get()的理解与使用方法
Oct 18 #PHP
利用PHP绘图函数实现简单验证码功能的方法
Oct 18 #PHP
Yii针对添加行的增删改查操作示例
Oct 18 #PHP
You might like
Ubuntu 16.04下安装PHP 7过程详解
2017/03/28 PHP
JavaScript 闭包在封装函数时的简单分析
2009/11/28 Javascript
JavaScript Event学习第八章 事件的顺序
2010/02/07 Javascript
JS setCapture 区域外事件捕捉
2010/03/18 Javascript
javascript 冒泡排序 正序和倒序实现代码
2010/12/14 Javascript
jQuery powerFloat万能浮动层下拉层插件使用介绍
2010/12/27 Javascript
基于jquery异步传输json数据格式实例代码
2013/11/23 Javascript
jQuery中[attribute*=value]选择器用法实例
2014/12/31 Javascript
Javascript获取图片原始宽度和高度的方法详解
2016/09/20 Javascript
js学习笔记之事件处理模型
2016/10/31 Javascript
vue-cli的webpack模板项目配置文件分析
2017/04/01 Javascript
JavaScript原生数组Array常用方法
2017/04/06 Javascript
js实现方块上下左右移动效果
2017/08/17 Javascript
React styled-components设置组件属性的方法
2018/08/07 Javascript
详解VScode编辑器vue环境搭建所遇问题解决方案
2019/04/26 Javascript
vue实现五子棋游戏
2020/05/28 Javascript
浅谈vue单页面中有多个echarts图表时的公用代码写法
2020/07/19 Javascript
javascript前端实现多视频上传
2020/12/13 Javascript
python同时给两个收件人发送邮件的方法
2015/04/30 Python
python绘图方法实例入门
2015/05/19 Python
Python中对象迭代与反迭代的技巧总结
2016/09/17 Python
Apache如何部署django项目
2017/05/21 Python
python opencv 直方图反向投影的方法
2018/02/24 Python
Python 限制线程的最大数量的方法(Semaphore)
2019/02/22 Python
pyqt5中动画的使用详解
2020/04/01 Python
Python使用Pygame绘制时钟
2020/11/29 Python
详解Python模块化编程与装饰器
2021/01/16 Python
详解Html5中video标签那些属性和方法
2019/07/01 HTML / CSS
C#面试题问题集
2016/04/02 面试题
餐厅总经理岗位职责
2013/12/31 职场文书
运动会宣传口号
2014/06/09 职场文书
护林员个人总结
2015/03/04 职场文书
2015年城市管理工作总结
2015/05/23 职场文书
2016年大学生社会实践心得体会
2015/10/09 职场文书
MySQL的存储过程和相关函数
2022/04/26 MySQL
Java+swing实现抖音上的表白程序详解
2022/06/25 Java/Android