PHP:保护数据库连接凭证

标签 php database security

只是为了确保每个人都在同一页面上,这些是我所说的凭据...

$user = 'user';// not actual user, not root either
$pass = 'pass';// not actual password
$server = 'localhost';
$database = mysqli_connect($server,$user,$pass,true|false);

所以我说的是用于连接到数据库的密码,而不是数据库中的密码(为了澄清起见,我已经用盐和胡椒进行了哈希处理)。

我没有读到任何我认为远程建议您可以拥有 100% 万无一失的安全性的内容,因为显然服务器需要连接到数据库并全天候 24/7 为访问者获取内容;如果我弄错了,我很想听听这是怎么可能的。

因此,让我们假设黑客拥有 root 访问权限(或者如果这并不意味着可以访问 PHP 代码,那么就可以访问所有 PHP 源代码)并且他们(在这种情况下)希望访问/修改/等等数据库。如果我们无法阻止他们访问 PHP 源代码,那么我们希望尽可能地减慢他们的速度。我可以将每个站点/数据库连接密码保存在每个站点的单独文件中(可以在几周内完成多域支持),而不是在 public_html 中(很明显)。我使用序列化和反序列化来存储某些变量,以确保当数据库在共享主机上变得不可用时具有一定程度的容错能力(防止站点 A 看起来像站点 B,反之亦然),因为数据库有时会多次变得不可用一天(当 SQL 服务再次可用并捕获这些“离开”错误时,我的数据库错误日志将被写入)。我想到的一个想法是确定一种方法,将密码存储在一个散列中,并将它们取消散列以用于通过 PHP 连接到数据库,尽管我也希望对此提出一些意见。

如果有人从数据库的角度提出建议(例如,能够限制用户使用 SELECT、INSERT、DELETE、UPDATE 等,并且不允许 DROP 和 TRUNCATE 作为示例),我主要关心的是确保我是 SQL 中立的,因为我计划最终从 MySQL 迁移到 PostgreSQL(这可能相关也可能不相关,但最好还是提一下)。我目前使用 phpMyAdmin 和 cPanel,phpMyAdmin 显示连接的用户与站点的数据库用户名不同,所以在这方面我仍然可以对该用户使用某些命令(再次以 DROP 和 TRUNCATE 为例)并限制 SITE 用户权限,除非我出于某种原因弄错了吗?

有没有办法配置接受连接凭证的上下文?为澄清起见,有权访问源代码的黑客不会像合法用户那样访问网站。

我想到的另一个想法是基于系统的加密,是否有一种近乎通用的(如在每个或几乎每个 LAMP 网络主机设置中)网络托管技术,系统可以通过 Apache 读取/写入文件引入一个黑客必须确定规避方法的新层?

当然,我为每个用户使用不同的密码。

我目前使用的是共享主机,但希望我的设置最终能够向上扩展到专用主机。

那么对我的安全概念有何想法?我可以尝试哪些其他概念来使我的数据库连接凭据更安全?

澄清:我正在寻找我可以追求的想法。如果对任何建议有不同意见,请要求澄清并解释您的担忧,而不是就我可能考虑过或可能没有考虑过的给定方法进行辩论,更不用说开始追求给定的概念了。谢谢!

最佳答案

试图减缓已经对您的系统具有 root 访问权限的入侵者的速度几乎无济于事。即使您设法将凭据隐藏得足够好以阻止他们,他们也已经可以访问您的系统并可以通过一百万种方式造成严重破坏,包括修改代码以执行他们想做的任何事情。

你最好的办法是专注于防止坏人突破你的外部防御,只有在你确定你已经尽了一切努力将他们留在大门后才担心其余的事情。

话虽如此,如果您的架构允许,将数据库用户帐户限制为仅具有特定权限子集绝对不是一件坏事。

关于PHP:保护数据库连接凭证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8744568/

相关文章:

php - 清理 PHP/SQL $_POST、$_GET 等...?

php - 为什么单击按钮时传递的值是错误的

php - Nginx 不显示 404 页面,而是在根目录中提供索引文件

security - ' self signed certificate' 是什么意思?

java - 如何在 Java 中限制 JPasswordField 中的位数?

security - 对 Alias 功能区菜单的可见性的 sitecore 权限

javascript - jQuery 意外 token 非法\n

mysql - 同步6个不同mysql数据库的用户表数据

java - 在Java中使用SQLite实现登录系统有很大困难

php - Mysql fetch() 返回 FALSE