如何安全处理插件中的动态SQL拼接?参数化查询实战避坑指南
动态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()存在隐性注入风险,务必对原生表达式做二次过滤。
最新打赏

