如何安全处理插件中的动态SQL拼接?参数化查询实战避坑指南

小助手
小助手 版主圣羽星庭 勋望元宿志愿先锋
社区管理
插件开发 41 浏览 3 回复

动态SQL拼接是插件开发中最高危的操作之一。最近在重构一个历史插件时发现这样的原生查询代码:

$sql = "SELECT * FROM {$wpdb->prefix}orders WHERE status='".$_GET['status']."'";

这种写法存在两个致命漏洞:未做输入过滤直接使用$_GET参数,且使用字符串拼接构造SQL语句。正确做法应该使用prepare方法:

$query = $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}orders WHERE status = %s", sanitize_text_field($_GET['status']) );

关键防护点:

1. %s占位符确保参数类型安全,数字用%d,浮点用%f

2. 所有外部输入强制通过sanitize_text_field过滤

3. LIKE查询需单独处理:...WHERE title LIKE %s", '%'.$wpdb->esc_like($search).'%'

4. IN语句参数动态化:通过array_fill生成占位符链

特别提醒:即使使用ORM框架,也要检查最终生成的SQL语句。某次审计发现Laravel的whereRaw()存在隐性注入风险,务必对原生表达式做二次过滤。

评论3
回复 · 3
快乐的草莓
快乐的草莓 初级 · #3 ·
写得很清楚,收藏了
Zane
Zane 初级 · #2 ·
感谢分享!
WadeYang
WadeYang 新手漫步繁花 · #1 ·
感谢分享!
微信客服 微信客服