如何用Yii2防止SQL注入和XSS跨站攻击?【安全】
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% 的真实漏洞来源。
Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。
Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。
Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。
PixPix 是面向品牌、卖家和内容团队的在线 AI 图片视频创作平台,提供图视频 Agent、无限画布、图片生成、视频生成、自然语言编辑及商品套图、产品精修和带货视频等电商工具。
Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等
Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。





