PHP 安全的十个必备技巧

PHP

你好,PHP 开发人员。 在这篇文章中,我将尝试为你提供一些可以提高 PHP 应用程序安全性的具体步骤。我关注的是 PHP 配置本身,所以我们不会讨论 SQL 注入、HTTPS 或其他与 PHP 无关的问题。

我将使用我的docker-entrypoint.sh脚本中的 bash 行来说明示例,但当然你可以将其应用于非 docker 环境。

Sessions

使用较长的 Session ID 长度

增加会话 id 长度会使攻击者更难猜到(通过暴力或更有可能的侧通道攻击)。长度可以介于22 到 256 个字符之间。默认值为 32。

sed -i -e "s/session.sid_length = 26/session.sid_length = 42/" /etc/php7/php.ini

(别问我为什么在 Alpine Linux 上是26…)

你可能还想查看 session.sid_bits_per_character。

使用具有限制权限的自定义会话保存路径

只有 nginx/php 需要访问会话,所以让我们将它们放在一个具有受限权限的特殊文件夹中。

sed -i -e "s:;session.save_path = \"/tmp\":session.save_path = \"/sessions\":" /etc/php7/php.ini
mkdir -p /sessions
chown nginx:nginx /sessions
chmod 700 /sessions

当然,如果你使用 Redis 处理会话,你并不需要关心这一部分;)

安全会话 Cookie

session.cookie_httponly来阻止 javascript 访问它们。更多信息

sed -i -e "s/session.cookie_httponly.*/session.cookie_httponly = true/" /etc/php7/php.ini
sed -i -e "s/;session.cookie_secure.*/session.cookie_secure = true/" /etc/php7/php.ini

session.cookie_secure 防止你的 cookie 在明文 HTTP 上传输。

session.cookie_samesite 以防止跨站点攻击。仅适用于最新的 PHP/浏览器。

使用严格模式

由于 Cookie 规范,攻击者能够通过本地设置 Cookie 数据库或 JavaScript 注入来放置不可移除的会话 ID Cookie。session.use_strict_mode 可以防止使用攻击者初始化的会话 ID。

限制生存期

会话应与浏览器一起关闭。因此设置 session.cookie_lifetime 为0。

Open_basedir

open_basedir 是一个php.ini配置选项,允许你限制 PHP 可以访问的文件/目录。

sed -i -e "s#;open_basedir =#open_basedir = /elabftw/:/tmp/:/usr/bin/unzip#" /etc/php7/php.ini

这里我添加了 unzip,因为它是由 Composer 使用的。 /elabftw是所有源 php 文件所在的位置。我不记得为什么/tmp会在这里,但肯定有原因。

禁用功能

这一点要小心,因为你很容易搞砸一个应用程序。但这绝对值得调查。假设攻击者以某种方式上传了一个 webshell,如果正确禁用了,webshell 将不会真正工作,因为shell_exec将被禁用,同类也将被禁用。我提供了一个适用于elabftw 的列表,但并不是百分之百完成。

sed -i -e "s/disable_functions =/disable_functions = php_uname, getmyuid, getmypid, passthru, leak, listen, diskfreespace, tmpfile, link, ignore_user_abort, shell_exec, dl, system, highlight_file, source, show_source, fpaththru, virtual, posix_ctermid, posix_getcwd, posix_getegid, posix_geteuid, posix_getgid, posix_getgrgid, posix_getgrnam, posix_getgroups, posix_getlogin, posix_getpgid, posix_getpgrp, posix_getpid, posix_getppid, posix_getpwnam, posix_getpwuid, posix_getrlimit, posix_getsid, posix_getuid, posix_isatty, posix_kill, posix_mkfifo, posix_setegid, posix_seteuid, posix_setgid, posix_setpgid, posix_setsid, posix_setuid, posix_times, posix_ttyname, posix_uname, phpinfo/" /etc/php7/php.ini

禁用 url_fopen

allow_url_fopen 这个选项很危险的。禁用它。更多信息在此处

sed -i -e "s/allow_url_fopen = On/allow_url_fopen = Off/" /etc/php7/php.ini

禁用 cgi.fix_pathinfo

你不想让非 PHP 文件作为 PHP 文件执行,对吗?那就禁用此功能。更多信息

sed -i -e "s/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g" /etc/php7/php.ini

隐藏 PHP 版本

最后,不假思索地说:

sed -i -e "s/expose_php = On/expose_php = Off/g" /etc/php7/php.ini

现在就这样。我希望你会发现这篇文章很有用,并改进你的配置;)

如果我错过了什么重要的东西,请在评论中告诉我!

~Nico

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://dev.to/elabftw/10-steps-for-secu...

译文地址:https://learnku.com/php/t/50851

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!