2015-06-16 10:49:42 12244次浏览 2条回答 0 悬赏 3 金钱

如果不采用类似 $model->find('id=:id', [':id'=>1]),而是直接采用 $model->find('id=1') 的写法可以防止注入攻击吗?

最佳答案

  • qq3737002 发布于 2015-06-16 12:10 举报

    访问地址

    http://cms/frontend/web/index.php?r=admin/main&id=2%20or%201=1
    

    代码如下

    namespace frontend\controllers\admin;
    
    use yii;
    use yii\web\Controller;
    use backend\models\Nav;
    
    class MainController extends Controller
    {
    
        public function actionIndex()
        {
            var_dump(yii::$app->request->get());
            $model = Nav::find();
            $model->andWhere([
                'nav_id' => yii::$app->request->get('id')
            ]);
            echo $model->createCommand()->getSql();
            echo "\n";
            $data = $model->asArray()->all();
            var_dump($data);
        }
    }
    

    结果返回

    array(2) {
      ["r"]=>
      string(10) "admin/main"
      ["id"]=>
      string(8) "2 or 1=1"
    }
    SELECT * FROM `mxq_nav` WHERE `nav_id`=:qp0
    array(1) {
      [0]=>
      array(12) {
        ["nav_id"]=>
        string(1) "2"
        ["nav_pid"]=>
        string(1) "0"
        ["nav_type"]=>
        string(1) "1"
        ["nav_icon"]=>
        string(8) "nav-user"
        ["nav_sort"]=>
        string(1) "0"
        ["homePage"]=>
        string(0) ""
        ["collapsed"]=>
        string(1) "0"
        ["closeable"]=>
        string(1) "0"
        ["id"]=>
        string(4) "user"
        ["text"]=>
        string(6) "用户"
        ["href"]=>
        NULL
        ["status"]=>
        string(1) "1"
      }
    }
    
    

    可以看到YII自动进行了SQL防注入,所以是安全的

    2 条回复
    回复于 2015-06-16 12:54 回复

    真棒真棒真棒真棒

    回复于 2015-06-16 13:59 回复

    不错,我在YII1里也试了一下,确实不会被注入了

    觉得很赞
  • 回答于 2015-06-16 11:42 举报

    如果id是在程序里写死的,不是外部传递来的,那么$model->find('id=1')这么写是可以的;
    但是id一般都是从外部传递的,所以model->find('id=1')是有风险的

您需要登录后才可以回答。登录 | 立即注册
yiissy001
总监

yiissy001

注册时间:2013-12-04
最后登录:2017-09-25
在线时长:24小时55分
  • 粉丝7
  • 金钱2529
  • 威望90
  • 积分3669

热门问题