PHP项目安全优化

错误信息屏蔽

1. 生产环境屏蔽PHP错误信息显示

系统正常运行且无漏洞时不会出现错误提示,但攻击者可能通过提交非法参数诱导服务器报错,进而泄露服务端信息、数据库详情、PHP代码结构等敏感内容。

解决方案:修改php.ini文件,将配置项display_errors设置为Off

2. 防止PHP版本号暴露

部分PHP版本存在已知漏洞,攻击者若获取到程序使用的PHP版本,可能利用对应漏洞发起攻击。

解决方案:在php.ini文件中,将expose_php配置项设为Off

PHP访问限制配置

1. 文件系统限制

通过配置open_basedir参数,限定PHP程序可访问的文件系统目录,有效防范文件包含、目录遍历等攻击。

示例:设置open_basedir = /data/后,程序尝试访问/etc/logs等未授权目录时,会触发访问拒绝错误。

2. 禁用危险函数

在PHP配置文件中禁用高风险函数,可显著降低webshell攻击风险(webshell即网页后门,攻击者入侵后会将后门文件混入网站正常文件,通过浏览器访问获取命令执行环境,进而控制服务器)。

配置示例

disable_functions = passthru,exec,system,chgrp,chown,shell_exec

常见危险函数及功能说明

函数名称 函数功能
chgrp() 改变文件或目录所属的用户组
chown() 改变文件或目录的所有者
exec() 允许执行一个外部程序
shell_exec() 通过shell执行命令,并将执行结果作为字符串返回
ini_set() 用于修改、设置PHP环境配置参数
ini_restore() 将PHP环境配置参数恢复为初始值
passthru() 允许执行一个外部程序并回显输出,与exec()类似
phpinfo() 打印PHP环境信息及相关模块
dl() 在PHP运行过程中加载一个PHP外部模块
system() 允许执行一个外部程序并回显输出,与passthru()类似
chroot() 可改变当前PHP进程的工作根目录
proc_open() 执行一个命令并打开文件指针用于读取及写入
proc_get_status() 获取使用proc_open所打开的进程信息

Cookie安全配置

1. 开启httponly属性

开启httponly后,Cookie在浏览器中不可见,能有效防止脚本通过document对象窃取Cookie信息。

配置示例session.cookie_httponly = 1

2. 合理设置Cookie使用范围与有效期

使用setcookie函数精细化配置Cookie参数,提升安全性:

函数格式setcookie(name, value, expire, path, domain, secure)

参数说明

参数名称 参数含义
name Cookie名称
value Cookie值
expire Cookie有效期
path Cookie生效路径
domain Cookie作用域名范围
secure 指定是否通过HTTPS传输Cookie

升级PHP版本(推荐升级至PHP7及以上)

1. 移除不安全函数

PHP7移除了MySQL相关函数支持,该类函数因使用不当易引发SQL注入漏洞。

2. 增强密码加密安全性

PHP7中password_hash()函数内置盐(salt)功能,无需手动配置,加密更安全。

3. 支持严格模式

可通过声明开启严格模式,规范代码类型使用,减少潜在安全风险:

declare(strict_types = 1);

4. 优化随机数生成

PHP7替换了PHP5中安全性较低的mt_rand()函数,新增random_int()random_bytes()等更安全的随机数生成方法。

使用示例

<?php
declare(strict_types = 1);

$randomNum = random_int(-100, 9999); // 生成指定范围的随机整数
$randomStr = bin2hex(random_bytes(3)); // 生成随机字节并转为十六进制字符串

echo $randomNum; // 输出示例:6501
echo $randomStr; // 输出示例:58b59e