php参数传递安全核心是全程设防:命令行用getopt()+白名单校验;url/表单参数须首层filter_var过滤;禁用extract();shell调用必用escapeshellarg();数据库操作强制参数化查询。

PHP参数传递安全性保障的关键,在于不信任任何外部输入,从接收、解析、校验到使用全程设防。重点不是“能不能传”,而是“传进来后怎么安全地用”。
命令行参数:优先用getopt(),别裸用$argv
直接遍历$argv并用explode('=', $arg)动态赋值(如$$key = $value)极危险——可能覆盖关键变量或执行任意键名。应改用getopt()解析标准格式,例如:
-
php script.php -u john -p 8080 --env=prod→getopt("u:p:", ["env:"])返回关联数组,键名受控 - 未声明的选项会被忽略,避免未知参数被误处理
- 配合
in_array($key, ['user', 'port', 'env'], true)做白名单校验,拒绝非法键
URL与表单参数:过滤必须在第一层完成
所有$_GET、$_POST、$_REQUEST数据,应在进入业务逻辑前完成类型和范围验证:
- 数值型用
filter_var($val, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1, 'max_range' => 100]]) - 邮箱用
filter_var($email, FILTER_VALIDATE_EMAIL),非空再处理 - 字符串长度超限、含控制字符、路径遍历符号(
../)需直接拦截 - 禁用
extract($_GET)等批量导入函数,防止变量污染
拼接系统命令时:escapeshellarg()是底线
当参数需用于exec()、shell_exec()等函数时,绝不能拼接字符串:
- 错误:
exec("convert {$filename} output.jpg")→ 若$filename为photo.jpg; rm -rf /即遭注入 - 正确:
exec("convert " . escapeshellarg($filename) . " output.jpg")→ 单引号包裹并转义 - 更优:改用PHP原生图像处理扩展(如GD、Imagick),绕过shell调用
数据库操作:参数化查询不可替代
SQL注入防护不靠addslashes()或mysql_real_escape_string()(已废弃),而靠机制隔离:
- PDO预处理:
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?"); $stmt->execute([$id]); - 命名参数更清晰:
$stmt = $pdo->prepare("UPDATE logs SET status = :status WHERE id = :id"); $stmt->execute(['status' => $status, 'id' => $id]); - 禁止任何形式的字符串拼接SQL,哪怕“只是查个ID”
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











