You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 21:25:43