0

我有一个缓存库,它将缓存数据存储在普通的 php 文件中,数据存储在数组中。

缓存文件示例:

缓存用户ID.php:

$userCache['userID']=2354654654;
$userCache['userName']=foo;
$userCache['userPass']=salted-and-hashed-pass;

它就像一个魅力。所以我正在考虑使用它来存储用户数据(如上面的示例)以保存数据库查询。我已经对其进行了测试,它确实导致页面加载时间明显更快,然后从数据库中获取(这就是我想要这样做的原因)。

我不确定这是否真的安全。密码和其他敏感信息被加盐和散列。任何人都可以窃取这些数据吗?除了他们是否拥有访问源代码的 FTP 详细信息(情况并非如此)。

4

3 回答 3

7

不!

您存储密码(或仍然敏感的密码哈希)的每个额外位置都是他们可以泄漏的另一个位置。这也是 SSL 页面不被缓存的原因之一:因为敏感信息不应该被缓存。

良好的身份验证代码(如您在 SSH 中找到的那种)甚至会努力将存储密码的内存区域标记为不可交换,因此操作系统无法将其写入磁盘。

敏感数据从该缓存中泄漏的风险可能很低,但这样做会增加风险。通过将此数据放在本地 PHP 文件中,任何本地文件包含漏洞现在都可以访问它。将密码实际回显到屏幕上可能需要的不仅仅是本地文件包含。在此缓存存在之前,甚至可能需要 SQL 注入漏洞或完整的服务器入侵才能访问密码哈希,现在这些本地文件包含可以访问哈希。

可以将其他不太敏感的数据存储在多个位置以提高页面加载速度,但密码和密码哈希应该是禁止的。

通过存储身份验证令牌,您可以避免在每个页面加载时为经过身份验证的用户计算和查找密码哈希。这应该在登录时随机生成(因此很难预测)并且应该是短暂的。这正是 PHP 会话 ID 的含义,在第一次检查您比较密码的位置后验证您的用户是否已正确验证是完全足够的。


我突然想到,如果您在每次页面加载时查询数据库并计算密码哈希,您必须将密码(或可能的密码哈希)与客户端一起存储在某个地方,可能在 cookie 中,并且正在发送这些敏感数据在互联网上为每个页面请求。这通常是不好的做法,并且会导致密码(或密码哈希)保存在用户的硬盘驱动器和潜在的中间代理上,除非您对每个页面都使用 SSL。


附言

我很好奇为什么包含本地文件比从数据库中进行简单的键值查找要快得多我的猜测是,您的网络要么存在可怕的延迟,要么存在用户表上的争用。任何一个都需要修复。

于 2012-06-17T14:44:40.917 回答
2

只要文件包含<?php数据,用户就无法看到 PHP 源代码,除非他们具有 FTP 访问权限或存在允许他们读取任意文件的安全漏洞。

然而,你应该保护你的缓存文件夹,要么将它移到文档根目录之外,要么阻止任何通过网络服务器配置(例如deny from all.htaccess的 .

于 2012-06-17T14:17:31.240 回答
2

As long as your cache files aren't in a www-accessible location then it should be secure enough (assuming your code doesn't have any flaws!). Don't rely on PHP tags hiding your content... the engine can fail and expose this data (although it is rare, it DOES happen).

But... if this was a good idea, wouldn't everyone be doing it? Do you really need ALL the data of a user, every time you want to know ANYTHING at all? It must be a very simple application if you think this is more efficient. I wonder why your database would be so slow. Have you set up proper indexes etc.?

于 2012-06-17T14:20:54.410 回答