错误信息屏蔽
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