读《PHP安全之道》提纲挈领笔记
说明:本系列文章基于《PHP安全之道》整理的主要内容提点。通过通读该书可以更好的在PHP编码过程中注意编码安全,提高编码质量。如果你需要更直接的学习建议通过其他正规渠道购买该书。
一、PHP项目安全概述
1、PHP项目安全形势不容乐观
通过W3Techs是提供各种技术在Web上使用信息统计数据,截止到 2020年07月11日14:39:36,下图是Web服务端使用动态开发语言的统计数据。从统计结果可以看出,PHP占比达到79%。其次是ASP.NET和Ruby。
通过exploit-db 统计,90%的web平台漏洞所使用的开发语言是PHP。可见:PHP应用得多,由其导致的漏洞也最多。
2、PHP项目安全产生的原因
(1)研发人员大都关注业务,不太关注漏洞和安全。
(2)研发人员多,业务复杂,程序代码量大,难免疏漏。
(3)用户也不关注安全问题。
(4)恶意攻击者关注系统的弱点。
以上导致攻防人员对比悬殊很大。
3、PHP项目安全原则
(1)不可信原则
输入:访问的用户都不被信任,前后端参数检验,规范用户输入;输出:防止篡改,防止输出内容夹杂用户可控的HTML,JS数据,防止窃取数据。
(2)最小化原则
权限最小化:控制访问权限,避免过度授权,包括服务器目录权限。
数据暴露最小化:防止数据窃取,降低敏感数据暴露,比如银行卡号,手机号。
(3)简单化
项目易读易维护是第一位。代码流程清晰,逻辑清晰;功能正常前提下,加固系统;项目良好的扩展性。
(4)组件安全性
对第三方组件(包括框架),明确来源,检测是否存在后门。关注第三方官方发布的最新补丁,即使修补和升级。
二、PHP项目安全基础
优化PHP的配置,增强性能的同时,避免一些安全问题。
1、信息屏蔽
服务器信息,软件信息,PHP版本信息等。
(1)屏蔽PHP的错误信息:防止泄露服务器系统信息。
1⃣️参数 display_errors
: 是否开启PHP错误显示;如果开启,错误信息会打印到页面,如下图:
; Default Value: On
; Development Value: On
; Production Value: Off
生产环境设定成Off。
2⃣️参数error_log
:指定日志写入错误路径
(2)防止版本号暴露
攻击者会通过版本漏洞发起攻击。
3⃣️参数:expose_php
默认是开启的 on ,默认会将PHP版本号返回到http 请求的头部信息中。
建议在生产环境隐藏PHP版本号。将 参数 expose_php 设置成 Off ,然后重启服务。
如图:
)
2、防止全局变量覆盖
4⃣️ 参数 register_globals
: 全局变量是否开启,默认 On
全局变量功能在开启情况下,传递过来的数据(如:参数:name)会直接注册为全局变量。会覆盖代码中的变量($name),引发安全隐患。
在关闭的情况下,PHP会把接收的数据存到规定好的全局数组中,只能使用 $_GET[‘name’]或 $_REQUEST[‘name’],来接受传递过来的值。
建议设置 register_globals =Off,不过在PHP5.4 中已移除该参数,防止全局变量的产生。
3、PHP 访问限制
(1)访问文件限制
5⃣️ 参数 open_basedir
:PHP访问文件系统位置,访问设置路径外的其他文件,PHP 将拒绝访问。开启之后可以有效的对抗文件包含、目录遍历的攻击。
需要注意的是:设置的值 需要在目录最后加一“/”,否则会被认为是目录的前缀。
(2)远程访问限制
6⃣️ 参数 allow_url_fopen
:是否允许PHP有远程检索数据的功能。默认 On
通过 file_get_contents() 访问远程 FTP或 Web。在获取数据的时候没有对用户提交的数据进行过滤或转码。
(3)开启安全模式
为试图解决共享服务器的安全问题而设立。
7️⃣ 参数 safe_mode
:是否开启安全模式 默认 Off 。 PHP7.2之后已移除。
启动 safe_mode 时,会对很多PHP函数进行限制,特别是一些与系统相关的文件打开、执行的函数。所有执行的函数将被限制只能执行在 8⃣️ 参数 safe_mode_exec_dir
指定的目录里的函数。比如,要使用 exec() ,需要设置 safe_mode_exec_dir = /usr/local/php/exec,如果目录最后不加“/”,指定的限制是一个目录前缀。
启动安全模式时,所有操作文件的函数只能操作与脚本 UID 相同的文件。如果放宽到文件GID 比较,则设置 9⃣️ 参数 safe_mode_gid
= On
启动安全模式时,可以通过 🔟 参数 safe_mode_allowed_env_vars
来设置 哪些系统环境变量可以被修改,用户只能改变在这里提供的前缀的环境变量。如果为空不设置则用户可以修改任何环境变量,设置的环境变量是一个用逗号分隔的环境变量列表。
(4)禁用危险函数
1⃣️1⃣️ 参数 disable_functions
:指定PHP禁用的函数。
添加多个常用的禁用函数:
disable_functions=phpinfo,eval,passthru,exec,system,chroot,scandir,chgrp,chown,shell exec,proc_ open,proc_ get_ status,ini_ alter,ini_ alter,ini_ restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_ socket_ server,fsocket, fsockopen
4、PHP中 Cookie的安全
(1)HttpOnly
可以让Cookie 在浏览器中不可见,开启可防止脚本通过document对象获取Cookie。对应一些敏感的 Cookie 可以采用HttpOnly,可以预防XSS和CSRF攻击。1⃣️2⃣️ 参数 session.cookie_httponly
设置为 1 时,表示开启。
(2)secure
如果使用的是HTTPS 协议,则应开启 1⃣️3⃣️ 参数 session.cookie_secure
,开启设置为 1。开启时,Cookie 只有在HTTPS 下才能上传到服务器。
(3)指定Cookie 的范围。
Cookie一定要设置超时和Domain。敏感信息不要保存到Cookie里。Cookie里的数据尽量加密。
5、PHP版本升级
每个版本的PHP都存在漏洞,关注官网,对PHP及时升级。
PHP7 的对提高安全性的改动:
①移除不安全的函数,如对MySQL 函数的支持。
②password_hash()函数的盐 弃用。
③capture_session_meta 函数中的SSL上下文选项弃用,改用 stream_get_meta_data()函数使用SSL元数据。
④增加标量类型说明:1 强制模式(默认);2 严格模式(必须明确标明)declare(strict_type=1)。
⑤更安全的随机数生成 random_int()、 random_bytes()。
(1)减少非必要的模块加载
php -m 命令查看当前PHP加载的模块。禁用用不到的模块。
(2)使用第三方安全扩展
Suhosin PHP项目的一个保护系统。包括:PHP核心补丁,强大的PHP扩展。
Taint 可检测 xss、sqli、shell注入的PHP扩展模块。服务器使用没有过滤转义的数据,Taint会抛出安全提示信息。
END
如有问题请在下方留言。
或关注我的公众号“孙三苗”,输入“联系方式”。获得进一步帮助。