PHP源码安全加固需建立可信数据流闭环:输入即设防、输出前校验、全程不信任外部数据;强制分层验证、预处理SQL、最小权限隔离、敏感文件移出Web根目录、禁用危险函数、上传目录禁解析、会话加密与HTML输出转义。

PHP源码安全加固不是堆砌工具,而是建立一套可信的数据流闭环:从输入进来那一刻起就设防,到输出前最后一刻再校验,中间所有环节不信任任何外部数据。
输入验证必须前置且分层
用户提交的任何内容——URL参数、表单字段、HTTP头、上传文件名——都默认是恶意的。不能只靠前端限制或JS校验。
- 用
filter_input()做第一道过滤:整数用FILTER_VALIDATE_INT,邮箱用FILTER_VALIDATE_EMAIL,URL用FILTER_VALIDATE_URL - 字符串类输入先
FILTER_SANITIZE_STRING(PHP 8.1+已弃用,改用FILTER_SANITIZE_SPECIAL_CHARS),再结合htmlspecialchars()输出时二次转义 - 对关键操作(如删除、支付、权限变更)强制要求二次确认或Token验证,避免CSRF绕过
数据库交互只走预处理通道
拼接SQL等于给攻击者递刀。哪怕只是查一个ID,也绝不用"SELECT * FROM user WHERE id = ".$_GET['id']这种写法。
- PDO方式:用命名占位符
:id或问号?,绑定变量类型(如PDO::PARAM_INT) - MySQLi方式:用
prepare()+bind_param(),确保类型与长度严格匹配 - 数据库连接账号仅授予最小必要权限——读写指定表,禁用
FILE、EXECUTE、PROCESS等高危权限
文件与执行权限必须物理隔离
PHP脚本不该有“什么都能干”的自由。把能力锁死在业务边界内,是最有效的减灾手段。
立即学习“PHP免费学习笔记(深入)”;
- 敏感逻辑文件(如配置、核心类库)全部移出Web根目录,比如放到
/var/www/app/,而Web入口只保留/var/www/html/index.php - php.ini中关闭危险函数:
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,pcntl_exec,eval,assert - 上传目录禁止PHP解析:Apache加
<Files "*.php">Deny from all</Files>;Nginx用location ~ ^/upload/.*\.php$ { return 403; }
会话与输出必须全程加密防护
Session不是保险箱,而是需要层层加锁的信封;HTML输出不是“显示内容”,而是“安全地渲染内容”。
- 登录后立即调用
session_regenerate_id(true),销毁旧ID;设置session.cookie_httponly=1、session.cookie_secure=1(HTTPS环境)、session.use_only_cookies=1 - 所有动态输出到HTML的地方,统一用
htmlspecialchars($data, ENT_QUOTES, 'UTF-8'),特别注意<input value="...">和<script>var x = "...";</script>这类上下文 - 关键页面加CSP头:
header("Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline';"),根据实际放宽策略,但绝不留'unsafe-eval'



















