修复php输入过滤漏洞需全程管控用户输入:严格校验get/post/cookie等所有输入,用filter_var类型校验、正则限制字符串;动态包含走白名单;路径拼接前realpath规范化;html输出用htmlspecialchars全参数转义;数据库操作必须参数化预处理。

修复PHP输入过滤不严引发的漏洞,核心是把“用户能控制的数据”从进入系统那一刻起就管住——不信任任何外部输入,每一步都做验证、过滤或转义,而不是等到用的时候才补救。
所有输入必须先校验再使用
GET、POST、COOKIE、SERVER(如HTTP_REFERER)、甚至文件上传的字段名,都算输入。不能直接赋值给变量就往下传。
- 用 filter_var() 做类型强校验:比如邮箱用
filter_var($email, FILTER_VALIDATE_EMAIL),整数用filter_var($id, FILTER_VALIDATE_INT) - 对字符串做格式限制:用正则匹配安全字符集,例如只允许字母数字下划线:
preg_match('/^[a-zA-Z0-9_]+$/',$str) - 避免用
isset()或empty()当过滤手段——它们只判空,不防恶意内容
动态包含必须走白名单映射
像 include($_GET['page'].'.php') 这类写法极其危险,攻击者可传 ../../config.php 或 php://filter 等协议读取敏感文件。
- 硬编码允许加载的文件列表:
$pages = ['home', 'about', 'contact']; - 接收参数后严格比对:
$page = $_GET['page'] ?? 'home'; $page = in_array($page, $pages) ? $page : 'home'; - 拼路径前做规范化处理:
$file = realpath('pages/'.$page.'.php');再检查是否落在预期目录内
输出到HTML前必须转义
即使输入已过滤,只要最终要显示在网页上,就得防XSS——攻击者可能绕过前端校验,或数据来自被污染的数据库。
- 统一用 htmlspecialchars(),且带全参数:
htmlspecialchars($data, ENT_QUOTES, 'UTF-8') - 对URL属性(如 href、src)单独处理,用 filter_var($url, FILTER_SANITIZE_URL)
- 富文本场景不能只靠
strip_tags(),应引入 HTML Purifier 等专业库做上下文感知过滤
数据库操作禁用拼接,只用参数化
SQL注入根源几乎都来自字符串拼接。哪怕加了 mysqli_real_escape_string(),也挡不住多字节编码绕过或宽字节注入。
- PDO 预处理是首选:
$stmt = $pdo->prepare("SELECT * FROM user WHERE id = ?"); $stmt->execute([$id]); - MySQLi 同理:
$stmt = $mysqli->prepare("INSERT INTO log(msg) VALUES (?)"); $stmt->bind_param("s", $msg); - 绝对禁止
where('name', 'exp', $userInput)这类 ThinkPHP 旧式写法;改用闭包绑定或显式占位符
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











