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 相关文章推荐
Search Engine Friendly的URL设计
Oct 09 PHP
PHP 文章中的远程图片采集到本地的代码
Jul 30 PHP
PHP跳转页面的几种实现方法详解
Jun 08 PHP
PHP删除HTMl标签的三种解决方法
Jun 30 PHP
php 字符串压缩方法比较示例
Jan 23 PHP
php修改指定文件后缀的方法
Sep 11 PHP
php中__destruct与register_shutdown_function执行的先后顺序问题
Oct 17 PHP
php检测apache mod_rewrite模块是否安装的方法
Mar 14 PHP
PHP中字符串长度的截取用法示例
Jan 12 PHP
php获取excel文件数据
Apr 21 PHP
Laravel框架中自定义模板指令总结
Dec 17 PHP
PHP中的访问修饰符简单比较
Feb 02 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
php REMOTE_ADDR之获取访客IP的代码
2008/04/22 PHP
php调整服务器时间的方法
2015/04/03 PHP
四个常见html网页乱码问题及解决办法
2015/09/08 PHP
PHP获取用户访问IP地址的5种方法
2016/05/16 PHP
CI框架源码解读之利用Hook.php文件完成功能扩展的方法
2016/05/18 PHP
Laravel框架实现发送短信验证功能代码
2016/06/06 PHP
ThinkPHP简单使用memcache缓存的方法
2016/11/15 PHP
php二维码生成以及下载实现
2017/09/28 PHP
用javascript获取textarea中的光标位置
2008/05/06 Javascript
javascript form 验证函数 弹出对话框形式
2009/06/23 Javascript
javascript 关于# 和 void的区别分析
2009/10/26 Javascript
基于jquery自定义图片热区效果
2012/07/21 Javascript
javascript中this做事件参数相关问题解答
2013/03/17 Javascript
简单的代码实现jquery定时器
2013/11/17 Javascript
js二维数组排序的简单示例代码
2014/01/24 Javascript
JS实现新浪博客左侧的Blog管理菜单效果代码
2015/10/22 Javascript
jQuery+jsp实现省市县三级联动效果(附源码)
2015/12/03 Javascript
JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】
2016/05/10 Javascript
动态设置form表单的action属性的值的简单方法
2016/05/25 Javascript
Angular.js实现多个checkbox只能选择一个的方法示例
2017/02/24 Javascript
js中变量的连续赋值(实例讲解)
2017/07/08 Javascript
详解JavaScript中的Object.is()与&quot;===&quot;运算符总结
2020/06/17 Javascript
vue-cli3项目打包后自动化部署到服务器的方法
2020/09/16 Javascript
[39:53]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.19
2020/11/19 DOTA
python多线程抓取天涯帖子内容示例
2014/04/03 Python
利用Python如何生成随机密码
2016/04/20 Python
Python学习小技巧之列表项的排序
2017/05/20 Python
Django跨域请求问题的解决方法示例
2018/06/16 Python
python实现自动登录后台管理系统
2018/10/18 Python
Python常见数据类型转换操作示例
2019/05/08 Python
关于不懂Chromedriver如何配置环境变量问题解决方法
2019/06/12 Python
新西兰最大的品牌运动鞋购物网站:Platypus NZ
2017/10/27 全球购物
2014年庆元旦活动方案
2014/02/15 职场文书
公司办公室岗位职责
2014/03/19 职场文书
农村老人去世追悼词
2015/06/23 职场文书
vue实现水波涟漪效果的点击反馈指令
2021/05/31 Vue.js