YII2安全之SQL注入和XSS攻击

                                SQL注入

疑问:SQL语句拼接变量

//直接把获取的$id代入(有问题)

$sql    = “SELECT * FROM  tab WHERE id = {$id}”;

$db      = \Yii::$app->db;

$command = $db->createCommand($sql);//存在注入漏洞,方法内部并未对$id进行过滤或其它处理

$result  = $command->queryAll();

var_dump($result);

解决

//增加一个参数,Yii内部方法会将其参数化

$sql    = “SELECT * FROM  tab WHERE id = :id”;

$db      = \Yii::$app->db;

$command = $db->createCommand($sql, [‘:id’ => $id]);//方法内部对第二个参数进行PDO参数化,不会导致注入漏洞

$result  = $command->queryAll();

var_dump($result);

[‘:id’ => $id] 是数组的简写(php5.4+支持,Yii2也需要php5.4+才支持),等同于array(‘:id’ => $id)

疑问:参数为字符串

//Tab是Model,与数据库中的Tab表对应

$result = Tab::findAll(“id={$id}”);//参数为字符串,方法内部不会进行过滤,导致注入漏洞

var_dump($result);

解决

//参数为数组的写法,Yii内部方法会将其参数化

$result = Tab::findAll([‘id’ => $id]);//参数为数组,方法内部调用PDO进行参数化,不会导致注入漏洞

var_dump($result);

结论

自己写过滤方法防止sql注入早已过时,一般都采用参数化的方式,PDO((PHP Data Object)支持参数化,php5.1+就能支持PDO连接MySql。YII Active Record 已实现PDO参数化。

                                   

                              XSS攻击

疑问

输入:表单提交内容,想安全的存入数据库

输出:想安全的对数据进行输出

解决

//Yii里面提供了很好的工具. HtmlHelper 和 HtmlPurifier

<?=  \yii\helpers\Html::encode($title) //纯文本  ?>

<?= \yii\helpers\HtmlPurifier::process($content) //html显示的文本 ?>

//例如:

1.<?= Html::encode($this->title) ?>

2.先引用:use yii\helpers\Json;

echo Json::htmlEncode($users);

拓展阅读

参考:

http://www.cnblogs.com/ganiks/p/yii2-xss.html

http://www.yiichina.com/doc/guide/2.0/db-active-record

    原文作者:allin2
    原文地址: https://www.jianshu.com/p/904fc96d4ad1
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞