在Linux环境下部署PHP应用,安全配置永远是绕不开的话题。PHP本身功能强大,但如果你不加以约束,它也可能成为攻击者最趁手的工具。下面这些配置思路,是经过实战检验的,能有效帮你加固防线。

1. 禁用不必要的PHP模块与扩展
你可能会问,为什么非要禁用呢?其实,这就像给房子少开几扇门,攻击者自然就少了几条路可走。在php.ini中,把那些用不上的扩展(比如mysqli、pdo_mysql、curl等)直接注释掉就行。举个例子,如果你的应用只需要本地文件操作,那就把extension=curl.so这类网络相关扩展统统干掉。改完之后,别忘了重启PHP服务(sudo systemctl restart php-fpm),让配置生效。
2. 严格限制文件上传功能
- 大小限制必须到位:在
php.ini里,把upload_max_filesize(单个文件最大大小,比如10M)和post_max_size(POST数据总大小,记得要比前面那个大,比如12M)设置好。别小看这一步,它能有效防止大文件上传导致的拒绝服务攻击。 - 文件类型得卡死:光靠代码里判个扩展名还不够,得双管齐下。既要验证扩展名(比如只允许
.jpg、.png),也要检查MIME类型(比如image/jpeg)。这样一来,恶意文件(比如.php后门)想混进来就难了。 - 上传目录权限要收紧:把上传目录(比如
/var/www/html/uploads)的权限设为755,所有者指定为Web服务器用户(比如www-data)。最关键的是,要禁止执行权限,chmod -R 755 uploads走一波,确保上传的文件不能被执行。
3. 配置open_basedir限制脚本访问范围
这一招很关键,相当于给PHP脚本画了个圈,避免它乱跑乱逛。在php.ini里设置open_basedir参数,把脚本限制在指定目录(比如/var/www/html),防止它访问系统敏感文件(比如/etc/passwd)。配置示例:
open_basedir = "/var/www/html:/tmp"
多个目录用冒号隔开,应用目录和临时目录(比如/tmp)都得包含进去。
4. 禁用危险函数与错误显示
- 危险函数,一刀切:在
php.ini里设置disable_functions,把那些能执行系统命令、操作文件的函数(比如system、exec、passthru、shell_exec、file_put_contents)统统禁掉。示例:disable_functions = system,exec,passthru,shell_exec,file_put_contents - 错误显示,关掉它:生产环境里,把
display_errors设为Off,别让错误堆栈信息暴露在攻击者面前。同时开启日志记录(log_errors = On),把错误信息写入安全目录(比如/var/log/php_errors.log),方便事后排查。
5. 强化会话安全管理
- 会话Cookie,属性要锁死:在
php.ini里配置下面这些参数,防止会话劫持和CSRF攻击:session.cookie_secure = 1 # 仅通过HTTPS传输会话Cookie session.cookie_httponly = 1 # 禁止Ja vaScript访问会话Cookie session.cookie_samesite = Strict # 防止跨站请求伪造(CSRF) - 会话ID,定期换:在代码里用
session_regenerate_id(true)(比如用户登录成功后),主动更换会话ID,防止会话固定攻击。
6. 禁止远程资源访问
这个比较简单粗暴,但很有效。在php.ini里把allow_url_fopen和allow_url_include都设为Off,禁止PHP通过URL访问远程文件(比如include 'http://example.com/config.php';),从根源上防止远程代码执行攻击。
7. 使用安全模块增强防护
- 安装Suhosin扩展:Suhosin是个不错的PHP安全扩展,提供缓冲区溢出保护、SQL注入防御、Cookie加密等功能。安装步骤(以Ubuntu为例):
装好后自动启用,你还可以通过sudo apt install php-suhosinphp.ini调整配置(比如suhosin.session.encrypt = On加密会话数据)。 - 配置ModSecurity:ModSecurity是一个Web应用防火墙(WAF),能拦截SQL注入、XSS等攻击。以CentOS为例,安装步骤:
记得根据应用场景调整规则集(比如OWASP Core Rule Set)。sudo yum install mod_security sudo systemctl enable mod_security sudo systemctl start mod_security
8. 更新PHP至最新版本
这一条没什么好说的,保持更新就是最好的防御。定期通过包管理器更新PHP(比如Ubuntu用sudo apt update && sudo apt upgrade php,CentOS用sudo yum update php),获取最新的安全补丁,修复已知漏洞(比如PHP 8.1.x修复的远程代码执行漏洞)。
9. 配置合理的文件与目录权限
- 应用目录权限:把Web应用目录(比如
/var/www/html)的所有者设为Web服务器用户(比如www-data),权限设为755(目录)和644(文件),避免其他用户修改文件。示例:sudo chown -R www-data:www-data /var/www/html sudo find /var/www/html -type d -exec chmod 755 {} \; sudo find /var/www/html -type f -exec chmod 644 {} \; - 敏感文件权限:数据库配置文件(比如
/var/www/html/config.php)、.env文件,权限要设为600,防止未授权读取。