如何用Yii2防止SQL注入和XSS跨站攻击?【安全】
作者:OpenWorld
时间:2026-07-11
浏览:0
Yii2的ActiveRecord数组语法通过PDO预处理防SQL注入,但字符串拼接、动态排序等仍需白名单或参数化兜底。富文本输出需用HtmlPurifier净化并缓存,避免存储型XSS。CSRF防护需显式设置cookieValidationKey,表单及JS请求均需传递令牌。动态字段、富文本缓存和CSRF令牌传递是主要漏洞来源。
Yii2 ActiveRecord 的 where 数组语法天然防 SQL 注入,没毛病,因为底层强制走 PDO 预处理加参数绑定。但要注意,字符串拼接、动态排序字段、手写原生 SQL 这些场景,风险依然存在,还得靠白名单或参数化来兜底。

Yii2 并不是装完就能高枕无忧的框架,它给了一整套工具,但前提是你得用对地方。如果绕开关键步骤,或者在边界场景上掉以轻心,该中招还是会中招。
ActiveRecord 的 where 数组语法为什么能防 SQL 注入
根本原因在于底层强制走的是 PDO 预处理,用户输入始终作为参数绑定,永远不会被拼进 SQL 字符串里。
- 比如
User::findOne(['username' => $input])是安全的,但User::findOne("username = '$input'")就危险了。 where()、andFilterWhere()、orFilterWhere()这些方法,只要传数组进去,就会自动参数化;但一旦你传了字符串,防护就失效了。- 动态字段名比如
orderBy($userSort)是没法参数绑定的,必须用白名单校验,比如in_array($userSort, ['created_at', 'price'], true)。 - 手写原生 SQL 用
createCommand()时,必须用bindValue(),千万别用字符串拼接,bindParam()也得小心,有引用陷阱。
Html::encode() 不是万能的 XSS 防护
它只适合纯文本输出。一旦内容里掺了富文本——比如商品描述、用户评论、后台编辑器——硬编码会直接破坏结构,但放任不管又等于开门揖盗。
- 像电商详情页、CMS 文章页这些场景,必须用
HtmlPurifier::process($html)来净化,配置白名单,只允许、、这些标签,把、onerror=、ja vascript:这些统统剔除。 HtmlPurifier性能开销不小,别在商品列表页每条记录都跑一遍。建议缓存净化结果,或者用 Redis 存一份purified_html_{$id}。- 前端 JS 过滤靠不住,攻击者完全可以绕过浏览器直接 POST 原始恶意 HTML,所以后端必须再净化一遍。
- 表单提交的
$_POST['content']必须先净化再入库,否则存储型 XSS 随时可能爆发。
CSRF 防护不是配个开关就完事
enableCsrfValidation = true 只是起点,不是终点。只要漏掉任何一环,整个防护就形同虚设。
cookieValidationKey必须在config/web.php里显式设置并保密,不能留空,也不能用默认值。- 所有 POST 表单都必须包含
Html::csrfInput(),其实就是。 - JS 发起的
fetch或XMLHttpRequest,必须手动把YII_CSRF_TOKEN放进请求体或 header,不然$request->validateCsrfToken()会直接返回 400。 - GET 请求默认不校验 CSRF,但如果用 GET 提交敏感操作,比如删除,那就得手动加
$request->validateCsrfToken()。
最容易被忽视的地方是:动态字段(orderBy、groupBy)、富文本净化缓存,还有 JS 请求里的 CSRF 令牌传递。这三个点,几乎包揽了线上 Yii2 项目 80% 的真实漏洞来源。
作者最新文章
三星 Galaxy A08 渲染图曝光:Helio G99 芯片与 6000mAh 电池配置解析
2026-09-08 17:14
OPPO Find X10 Pro Max 影像规格详解:三颗2亿像素镜头与全焦段8K视频能力
2026-09-08 16:41
PDF转HTML在线转换器怎么选?转换后网页排版怎么查?
2026-09-04 11:02
AE教程书籍挑选指南:零基础、动效与合成方向实战标准
2026-09-02 13:31
教程书籍使用SAI软件Logo要单独授权吗:商标引用与出版合规要点
2026-09-02 11:50
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多


































