一、错误信息屏蔽
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。
示例: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 所打开的进程信息 |
注:webshell 通常被称为网页后门,具有隐蔽性。
攻击者在入侵一个网站后,通常会将自己写的PHP后门文件与网站服务器Web目录下正常的网页文件混在一起,然后使用浏览器来访问,得到一个命令执行环境,从而达到控制网站服务器的目的。
三、PHP中的cookie安全
1、设置 httponly
httponly 让cookie在浏览器中不可见,开启httponly可以防止脚本通过document对象获取cookie。
session.cookie_httponly = 1
2、指定cookie的使用范围和有效期
setcookie(name, value, expire, path, domain, secure)
参数名称 | 参数含义 |
---|---|
name | cookie 名称 |
value | cookie 值 |
expire | cookie 有效期 |
path | cookie 生效路径 |
domain | cookie 作用域名范围 |
secure | 指定是否开启https 来传输cookie |
四、升级PHP版本
1、php7 中移除了一些不安全的函数。
比如移除了对于MySQL函数的支持,MySQL函数在许多情况下是不安全的,经常由于使用不当而造成SQL注入。
2、在PHP7中,password_hash()函数的盐被启用,因为其本身内部已经内置了salt功能。
3、PHP7添加了严格模式 declare(strict_types = 1);
,
4、PHP7中使用了更安全的随机数生成器,添加了更好的随机数 random_int()、random_bytes(),并用其替代了PHP5中的mt_rand()。
<?php
declare(strict_types = 1);
$randomNum = random_int(-100, 9999);
$randomStr = bin2hex(random_bytes(3));
echo $randomNum; // 6501
echo $randomStr; // 58b59e