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

5年以前  |  阅读数:1133 次  |  编程语言:PHP 

本文实例讲述了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相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总

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

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例