商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > 如何用Yii2防止SQL注入和XSS跨站攻击?【安全】

如何用Yii2防止SQL注入和XSS跨站攻击?【安全】

  发布于2026-07-11 阅读(0)

扫一扫,手机访问

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

如何用Yii2防止SQL注入和XSS跨站攻击?【安全】

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) 来净化,配置白名单,只允许

    这些标签,把