将密码和其他敏感信息存储在缓存文件中是否安全?

时间:2012-06-17 14:12:39

标签: php security caching

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

缓存文件的示例:

cache_userID.php:

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

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

我不确定这是否真的安全。密码和其他敏感信息被加盐和散列。是否有人能够窃取这些数据?除了他们有FTP详细信息来访问源代码(不会是这种情况)。

3 个答案:

答案 0 :(得分:7)

不!

您存储密码的所有额外位置(或仍然敏感的密码哈希)是另一个可以泄露的地方。这是SSL页面未缓存的原因之一:因为不应缓存敏感信息。

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

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

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

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


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


P.S。

我很好奇为什么包含本地文件显着比从数据库中进行简单的键值查找更快。我的猜测是你的网络上有可怕的延迟或用户桌上的争用。任何一方都需要修复。

答案 1 :(得分:2)

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

但是,您应该保护缓存文件夹,方法是将其移动到文档根目录之外,或者通过网络服务器配置阻止对其的任何http访问(例如deny from all中的.htaccess)。

答案 2 :(得分:2)

只要您的缓存文件不在www可访问的位置,那么它应该足够安全(假设您的代码没有任何缺陷!)。不要依赖隐藏内容的PHP标签......引擎可能会失败并暴露这些数据(尽管很少见,但它确实会发生)。

但是......如果这是个好主意,那么每个人都不会这样做吗?每次你想知道任何事情时,你真的需要用户的所有数据吗?如果您认为这样更有效,它必须是一个非常简单的应用程序。我想知道为什么你的数据库会这么慢。你有没有设置适当的索引等?