2023-10-29 00:32:53
PHP中过滤SQL注释的核心目的是提升安全性与代码整洁性,推荐优先使用预处理语句(Prepared Statements)作为根本解决方案,正则表达式可作为辅助手段但需谨慎处理边界情况。
一、为什么需要过滤SQL注释?安全隐患
攻击者可能利用注释绕过WAF或关键词过滤,例如通过插入/*或--分割恶意代码与合法查询,导致SQL注入。
示例:用户输入' OR 1=1 /*,未过滤的注释可能使后续查询被截断,执行意外逻辑。
解析一致性问题
不同数据库版本或解析器对注释的处理可能存在差异,过滤注释可确保SQL语句在不同环境下的行为一致。
代码整洁与维护
移除用户输入的冗余注释能提升SQL可读性,便于调试和日志分析。
通过正则匹配并移除三种常见注释类型:
预处理语句通过分离SQL结构与数据,彻底防止注释被解析为代码,是抵御SQL注入的根本方案。
1. PDO示例:try { $pdo = new PDO("mysql:host=localhost;dbname=testdb", "username", "password"); $stmt = $pdo->prepare("SELECT * FROM users WHERE id = ? AND name = ?"); $stmt->execute([1, "John Doe' OR 1=1 --"]); // 恶意输入被当作数据 $user = $stmt->fetch();} catch (PDOException $e) { echo "Error: " . $e->getMessage();}2. MySQLi示例:$mysqli = new mysqli("localhost", "username", "password", "testdb");$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ? AND name = ?");$stmt->bind_param("is", 1, "John Doe' OR 1=1 --"); // "is"表示整数和字符串$stmt->execute();$result = $stmt->get_result();优势:最终建议:始终优先使用预处理语句处理SQL查询,正则表达式仅作为非结构化输入的额外防护层。