读《PHP安全之道》提纲挈领笔记01

5 篇文章 0 订阅

在这里插入图片描述


说明:本系列文章基于《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

如有问题请在下方留言。

或关注我的公众号“孙三苗”,输入“联系方式”。获得进一步帮助。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值