保护 PHP 应用程序安全的 10 个步骤 secureDevops <3

2025-06-04

确保 PHP 应用程序安全的 10 个步骤

安全 Devops <3

各位 PHP 开发者们,大家好!在这篇文章中,我将尝试提供一些具体的步骤来提升 PHP 应用的安全性。我主要关注 PHP 配置本身,因此我们不会讨论 SQL 注入、HTTPS 或其他与 PHP 无关的问题。

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

会议

使用更长的会话 ID 长度

增加会话 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会在这里,但肯定是有原因的。

禁用功能

小心操作,因为你很容易搞砸一个应用程序。但这绝对值得研究。假设攻击者设法上传了一个 webshel​​l,如果设置正确,这个 webshel​​l 将无法正常工作,好友将被禁用。我提供了一个适用于elabftwshell_exec的列表,但并非 100% 完整。

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

暂时就这些。希望这篇文章对你有帮助,并能帮助你改进配置 ;)

如果我遗漏了一些重要内容,请在评论中告诉我!

~尼科

文章来源:https://dev.to/elabftw/10-steps-for-secure-a-php-app-5fnp
PREV
最适合开发人员的博客平台
NEXT
作为一家初创公司的新任 CTO,我希望知道的四件事