PHP MySQL通配符拦截咨询:需补充的防数据泄露特殊字符列表
PHP-MySQL通配符拦截补充建议
一、字符串LIKE字段的额外拦截字符
MySQL的LIKE操作符仅识别两个核心通配符:%(匹配任意长度字符)和_(匹配单个字符),默认转义符为\。结合你现有拦截列表,需补充以下内容:
- 必须加入
\(反斜杠):用户可能通过输入\%或\_绕过现有拦截,若代码未正确处理转义,这类输入会被解析为普通通配符,引发全表匹配风险。 - 关于
*:它并非MySQL LIKE的原生通配符,除非你的业务逻辑会自动把*替换为%,否则无需额外拦截。
二、数字字段的拦截逻辑调整
数字字段使用=或BETWEEN时,风险核心不是通配符,而是SQL注入(比如输入1 OR 1=1)。建议直接限制输入为合法数字格式:
- 仅允许数字、正负号(若业务支持负数)、小数点(若涉及浮点数);
- 拦截所有字母、特殊符号(除上述允许的),确保输入为纯数字或符合业务要求的数字格式。
三、更安全的替代方案(推荐)
字符拦截属于“黑盒过滤”,存在被绕过的可能,更彻底的方案是使用预处理语句(PDO或mysqli),将用户输入作为参数而非直接拼接进SQL:
字符串LIKE场景示例:
$input = $_GET['search']; $stmt = $pdo->prepare("SELECT * FROM your_table WHERE field1 LIKE CONCAT('%', :input, '%')"); $stmt->bindParam(':input', $input); $stmt->execute();
此方式下,用户输入的%或_会被当作普通字符处理,不会触发通配匹配。
数字BETWEEN场景示例:
$low = $_GET['lowrange']; $high = $_GET['highrange']; $stmt = $pdo->prepare("SELECT * FROM your_table WHERE field3 BETWEEN :low AND :high"); $stmt->bindParam(':low', $low, PDO::PARAM_INT); $stmt->bindParam(':high', $high, PDO::PARAM_INT); $stmt->execute();
通过指定参数类型为PDO::PARAM_INT,自动过滤非数字输入,从根源避免注入和非法范围查询。
内容的提问来源于stack exchange,提问作者levent001
相关产品推荐
相关产品推荐

