刚刚看完了慕课的关于yii2的安全教程。
最后一张有说 设置emulateprepare = false
然后使用占位符的方式进行方式sql注入。
我的问题是
- 请问这样就
肯定
能够避免sql注入了吗? - 如果我依然设置
emulateprepare = true
, 那么 我在使用ar
或者query build
的时候 所有的数组方式赋值 是不是根本就不能做到防范sql注入的效果? 如$model->find()->where(['id'=>$id])...
如果使用数组赋值方式不能起到防范sql注入,那么像我这样的小白,yii是否有什么可以依托的相对安全的方式,让我们去操作数据库呢?
当然个人没有测试,对于第二个问题其实可以自己模拟一下的。但是因为水平有限对于各种sql或者url的转码肯定不能做到全面,所以想上来问问各位朋友,请大家分享下经验。谢谢大家~~~
$model->find()->where(['id'=>$id])
这样当然不能做到防止sql inject
..
第一: 一定要使用占位符, $model->find()->where( 'id' = :id, [':id' => $id] )
第二: 如果追求更安全, 不要让php帮你自动绑定参数, 而是发送到mysql
, 让mysql
自己完成参数解析绑定.
也就是你说的 emulateprepare = false
其实就是 PDO
的PDO::ATTR_EMULATE_PREPARES
这个参数.
经过这两步, 就可以完全避免 sql inject