发布于2026-07-11 阅读(0)
扫一扫,手机访问
Yii2 ActiveRecord 的 where 数组语法天然防 SQL 注入,没毛病,因为底层强制走 PDO 预处理加参数绑定。但要注意,字符串拼接、动态排序字段、手写原生 SQL 这些场景,风险依然存在,还得靠白名单或参数化来兜底。

Yii2 并不是装完就能高枕无忧的框架,它给了一整套工具,但前提是你得用对地方。如果绕开关键步骤,或者在边界场景上掉以轻心,该中招还是会中招。
根本原因在于底层强制走的是 PDO 预处理,用户输入始终作为参数绑定,永远不会被拼进 SQL 字符串里。
User::findOne(['username' => $input]) 是安全的,但 User::findOne("username = '$input'") 就危险了。where()、andFilterWhere()、orFilterWhere() 这些方法,只要传数组进去,就会自动参数化;但一旦你传了字符串,防护就失效了。orderBy($userSort) 是没法参数绑定的,必须用白名单校验,比如 in_array($userSort, ['created_at', 'price'], true)。createCommand() 时,必须用 bindValue(),千万别用字符串拼接,bindParam() 也得小心,有引用陷阱。它只适合纯文本输出。一旦内容里掺了富文本——比如商品描述、用户评论、后台编辑器——硬编码会直接破坏结构,但放任不管又等于开门揖盗。
HtmlPurifier::process($html) 来净化,配置白名单,只允许 、、![]()
这些标签,把 、onerror=、ja vascript: 这些统统剔除。HtmlPurifier 性能开销不小,别在商品列表页每条记录都跑一遍。建议缓存净化结果,或者用 Redis 存一份 purified_html_{$id}。$_POST['content'] 必须先净化再入库,否则存储型 XSS 随时可能爆发。enableCsrfValidation = true 只是起点,不是终点。只要漏掉任何一环,整个防护就形同虚设。
cookieValidationKey 必须在 config/web.php 里显式设置并保密,不能留空,也不能用默认值。Html::csrfInput(),其实就是 。fetch 或 XMLHttpRequest,必须手动把 YII_CSRF_TOKEN 放进请求体或 header,不然 $request->validateCsrfToken() 会直接返回 400。$request->validateCsrfToken()。最容易被忽视的地方是:动态字段(orderBy、groupBy)、富文本净化缓存,还有 JS 请求里的 CSRF 令牌传递。这三个点,几乎包揽了线上 Yii2 项目 80% 的真实漏洞来源。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8