PHP应用常因疏忽暴露SQL注入、XSS、文件上传等风险,站长需构建纵深防御体系。核心在于输入过滤、输出编码、权限隔离三者协同。

AI设计,仅供参考
严格校验所有用户输入:GET、POST、COOKIE、HTTP头均不可信。使用filter_var()配合FILTER_VALIDATE_EMAIL、FILTER_SANITIZE_NUMBER_INT等预设规则,避免手写正则误判。对ID类参数,优先用is_numeric()或ctype_digit()二次确认,禁止直接拼接SQL语句。
数据库交互必须使用PDO预处理语句。示例:$stmt = $pdo->prepare(\”SELECT FROM users WHERE username = ? AND status = ?\”); $stmt->execute([$user, 1]); 即便变量含恶意单引号或union关键字,也会被安全转义,彻底阻断SQL注入。
输出到HTML前强制进行上下文感知编码。PHP内置htmlspecialchars($str, ENT_QUOTES | ENT_HTML5, ‘UTF-8’)可防XSS;若输出到JavaScript字符串,则需json_encode($data, JSON_HEX_TAG | JSON_HEX_AMP)并包裹在引号内;输出到URL参数则用urlencode()。
文件上传须三重检查:检查$_FILES[‘file’][‘type’]仅作参考,重点验证文件扩展名白名单(如[‘png’,’jpg’])与通过fileinfo扩展获取真实MIME类型;重命名文件为随机字符串+白名单后缀;存储路径禁止位于Web可访问目录,建议移至public_html外,并通过中间PHP脚本控制下载权限。
部署层面禁用危险函数:在php.ini中设置disable_functions = exec,passthru,shell_exec,system,proc_open,popen,parse_ini_file,show_source;同时开启open_basedir限制脚本只能访问指定目录,防止路径遍历。
会话安全不可忽视:设置session.cookie_httponly = 1、session.cookie_secure = 1(HTTPS环境)、session.cookie_samesite = \”Lax\”;登录后调用session_regenerate_id(true)更新SID,防止会话固定攻击。
定期扫描与更新是底线保障。使用Composer安装的第三方包应通过composer audit检查已知漏洞;PHP版本至少保持7.4以上(推荐8.1+),及时打补丁。安全不是功能,而是贯穿开发、部署、运维每一环节的持续实践。