代码功能分析

该PHP函数injCheck()用于检测字符串中是否包含潜在的SQL注入危险字符或模式。通过正则表达式匹配常见的SQL关键词和特殊符号,实现基础的安全过滤。

正则表达式解析

$pattern包含以下匹配规则(不区分大小写):

  • \b(select|insert...)\b:匹配SQL关键词(如select/insert/update等)
  • [';]:匹配单引号或分号
  • (\/\*|\*\/|\.\.\/|\.\/):匹配注释符(/* */)或路径跳转符(…/ ./)

建议

提升过滤精确性

$pattern = "/\b(select\s.+from|insert\s.+into|update\s.+set|delete\s.+from|union\s.+select|into\s+outfile|load_file\s*\()/i";

该优化要求关键词必须与语法结构组合出现,减少误判。

支持参数化过滤

function injCheck(array $params) {
    foreach ($params as $value) {
        if (preg_match($pattern, $value)) {
            throw new InvalidArgumentException('参数包含SQL危险字符');
        }
    }
}

防御深度建议

  • 结合预处理语句(PDO/MySQLi)
  • 对数字类型强制类型转换
  • 关键操作使用存储过程
  • 记录过滤日志便于审计

注意事项

  • 该函数不能替代参数化查询
  • 可能误判合法内容(如包含敏感单词的普通文本)
  • 需要根据业务场景调整正则规则

典型应用场景

$userInput = $_POST['search'];
try {
    $filtered = injCheck($userInput);
    // 继续处理安全内容
} catch (InvalidArgumentException $e) {
    die('输入包含非法字符');
}
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐