yii2安全需开发者规范使用:sql注入须全程参数化并白名单校验动态字段;xss防护坚持输出编码与富文本净化;csrf默认开启且不可绕过;配合输入校验、最小权限、csp及文件上传三重校验实现纵深防御。

Yii2本身具备良好的安全基础,但真正起作用的是开发者是否用对了方式。防SQL注入和XSS不是加个插件就完事,而是贯穿输入、存储、输出全流程的规范动作。
SQL注入:只用参数化,别拼字符串
ActiveRecord和DAO都默认支持PDO参数化,只要不手动拼接SQL,就能挡住绝大多数注入风险。
- ✅ 正确写法:使用数组条件或命名占位符
$user = User::findOne(['username' => $input]);$cmd = $db->createCommand('SELECT * FROM order WHERE id = :id', [':id' => $id]); - ❌ 危险写法:字符串拼接或传入原始字符串条件
$user = User::findAll("username = '$input'");$sql = "SELECT * FROM user WHERE id = $id"; // 直接代入变量 - 动态字段(如排序、搜索字段名)无法参数化,必须走白名单校验,比如:
$allowedFields = ['name', 'email', 'created_at'];<br>if (!in_array($sortField, $allowedFields)) { throw new BadRequestHttpException(); }
XSS防护:输出端编码是底线,富文本需净化
用户输入的数据,在展示时才真正构成XSS风险。不能依赖“入库前过滤”,而要按场景选择合适处理方式。
- 纯文本输出一律用
Html::encode():= Html::encode($model->bio) ?> - 允许部分HTML(如文章正文、评论)必须用
HtmlPurifier::process(),配置白名单标签和属性,避免JS执行;
推荐配合PurifyBehavior自动处理模型字段 - JSON输出用
Json::encode(),防止<script></script>被解析;
前端JS中渲染用户数据时,禁用innerHTML,优先用textContent或框架的自动转义机制
CSRF与会话安全:默认开启,但别绕过
Yii2表单默认带CSRF token,但开发者有时为图方便关掉它,或手写form标签漏掉token字段,等于主动拆墙。
- 确保
'enableCsrfValidation' => true(新版默认开启,老项目需检查) - 所有POST表单必须用
ActiveForm或手动添加= Html::csrfMetaTags() ?>和隐藏字段 - API接口若禁用CSRF(如前后端分离),应改用token鉴权(如Bearer JWT),而非简单关闭验证
- Cookie设为
httpOnly+secure(HTTPS环境),防止JS读取session ID
纵深防御:不止靠框架,还要补位
单一措施总有盲区,组合使用才能形成有效防线。
- 输入层做基础校验:模型
rules()中定义类型、长度、正则等,提前拦截明显非法值 - 数据库账号最小权限:应用连接账号仅授予CRUD必要权限,禁用
DROP、FILE、LOAD DATA等高危操作 - 启用Content-Security-Policy响应头,限制脚本来源,大幅降低XSS利用成功率
- 上传文件严格校验:后缀、MIME、内容头三重检查,存放在Web目录外,访问走控制器代理











