直接拼接用户输入进SQL或HTML极危险,须按数据流向分层拦截:接收时用filter_input()一步完成取值+类型验证+范围限制;存库前用PDO预处理防注入(字段名须白名单校验);输出前依上下文调用htmlspecialchars()(HTML内容)、json_encode()(JS上下文)等专用函数,杜绝通用过滤。

直接拼接用户输入进 SQL 或 HTML,99% 会出事。安全处理不是选一个函数凑合用,而是按数据流向分层拦截:接收时验证类型、存库前分离逻辑、输出前转义字符。
filter_input() 取值 + 验证必须一步到位
直接读 $_POST['email'] 没做任何校验,等于把解析权交给攻击者。用 filter_input() 一步完成“取值 + 类型判断 + 范围限制”,避免后续流程误把字符串当整数或空值当有效数据。
-
filter_input(INPUT_POST, 'age', FILTER_VALIDATE_INT)返回整数或false,不会返回"18abc" - 带范围检查必须显式传选项:
filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]) -
filter_input()返回null表示键缺失,false才表示验证失败,两者要区分处理 -
FILTER_SANITIZE_STRING在 PHP 8.1+ 已废弃,改用filter_var($input, FILTER_SANITIZE_FULL_SPECIAL_CHARS)或组合trim()+htmlspecialchars()
PDO 预处理防注入但字段名不能参数化
预处理本身防注入,但绑定方式写错就等于没防——比如把变量名当字符串字面量传进去,或者在 SQL 字符串里拼接字段名。ORDER BY ? 是错的,这些必须走白名单校验后硬编码。
- 初始化 PDO 时必须设错误模式:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION),否则绑定失败可能静默忽略 -
bindValue()别漏掉第三个参数类型,比如整数不加PDO::PARAM_INT,PHP 可能传成字符串,触发隐式类型转换漏洞 - 别混用命名参数和问号参数:
prepare("WHERE id = :id AND status = ?")在部分 PDO 驱动下行为未定义 - 表名、字段名、排序方向(
ASC/DESC)必须来自白名单数组,用in_array($sort, ['name', 'created_at'], true)校验
htmlspecialchars() 输出前必须全参数调用
htmlspecialchars() 只对 HTML 文本内容有效,放错位置或缺参数等于白干。它不解决 JS 注入、属性闭合、CSV 导出等上下文问题,仅限 HTML 内容体。
- 必须显式传入第三个参数
'UTF-8',否则 PHP 5.4+ 默认用ini_get('default_charset'),若配置为空或错配,可能导致双字节截断绕过 - 在 HTML 属性里输出时,要用
ENT_QUOTES(如echo htmlspecialchars($val, ENT_QUOTES, 'UTF-8')),否则单引号属性(title='xxx')里的'不转义,可闭合标签注入 - JS 上下文不能用
htmlspecialchars(),应改用json_encode($val, JSON_UNESCAPED_UNICODE | JSON_HEX_TAG) - 哪怕输入已用
filter_var()验证过邮箱,只要它最终要echo到页面里,就必须过一遍htmlspecialchars()
proc_open 等系统调用必须双重隔离
proc_open 本身不提供输入过滤能力,所有外部参数必须先转义再校验,且不能依赖单一防护手段。绕过 escapeshellarg() 的案例持续出现,必须叠加白名单与路径约束。
- 每个参数必须单独套
escapeshellarg(),禁止拼接后统一转义:$cmd = '/usr/bin/convert ' . escapeshellarg($input) . ' ' . escapeshellarg($output) - 动作类型(如
resize、identify)必须查白名单:in_array($_POST['action'], $allowed_actions, true) - 程序路径必须绝对路径,禁用
PATH查找,防止符号链接或同名恶意二进制劫持 - 文件路径类参数需用
realpath()+strpos()检查是否落在安全目录内,如/var/www/uploads/
最容易被忽略的是上下文错配:同一段输入,在 HTML 内容、HTML 属性、JS 字符串、SQL 查询、shell 命令中,需要完全不同的处理方式。没有“通用安全函数”,只有“特定上下文专用处理”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











