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。

示例: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