2015-09-17 02:43:55 3565次浏览 1条回答 2 悬赏 100 金钱

刚刚看完了慕课的关于yii2的安全教程。
最后一张有说 设置emulateprepare = false
然后使用占位符的方式进行方式sql注入。

我的问题是

  1. 请问这样就肯定能够避免sql注入了吗?
  2. 如果我依然设置 emulateprepare = true, 那么 我在使用ar或者query build 的时候 所有的数组方式赋值 是不是根本就不能做到防范sql注入的效果? 如 $model->find()->where(['id'=>$id])... 如果使用数组赋值方式不能起到防范sql注入,那么像我这样的小白,yii是否有什么可以依托的相对安全的方式,让我们去操作数据库呢?

当然个人没有测试,对于第二个问题其实可以自己模拟一下的。但是因为水平有限对于各种sql或者url的转码肯定不能做到全面,所以想上来问问各位朋友,请大家分享下经验。谢谢大家~~~

最佳答案

  • 500miles 发布于 2015-09-17 10:20 举报

    $model->find()->where(['id'=>$id]) 这样当然不能做到防止sql inject..

    第一: 一定要使用占位符, $model->find()->where( 'id' = :id, [':id' => $id] )

    第二: 如果追求更安全, 不要让php帮你自动绑定参数, 而是发送到mysql, 让mysql自己完成参数解析绑定.

    也就是你说的 emulateprepare = false 其实就是 PDOPDO::ATTR_EMULATE_PREPARES 这个参数.

    经过这两步, 就可以完全避免 sql inject

    1 条回复
    回复于 2015-09-17 14:05 回复

    追问: 之前的$model->find()->where( ['>','id', $id] ) 如果使用占位符的方式来写呢? 谢谢。

    觉得很赞
    没有找到数据。
您需要登录后才可以回答。登录 | 立即注册
xjdata
CEO

xjdata

注册时间:2011-12-07
最后登录:2021-07-09
在线时长:112小时28分
  • 粉丝23
  • 金钱14169
  • 威望75
  • 积分16039

热门问题