【问题标题】:Is it safe to store passwords and other sensitive info in cache files?在缓存文件中存储密码和其他敏感信息是否安全?
【发布时间】:2012-06-19 18:40:46
【问题描述】:

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

缓存文件示例:

cache_userID.php:

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

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

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

【问题讨论】:

  • 不缓存密码;缓存(窗口)身份验证令牌...
  • 使用memcache 模块(如果可用)

标签: php security caching


【解决方案1】:

不!

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

良好的身份验证代码(就像您在 SSH 中找到的那种)甚至会努力将存储密码的内存区域标记为 不可交换,这样它就不能通过以下方式写入磁盘操作系统。

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

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

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


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


附言

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 虽然很少见,但确实会发生 - 有什么来源吗?从来没有听说过这样的问题,除非它是由于网络服务器配置错误而发生的。
      • 配置错误是最大的问题。此外,如果他没有正确命名它们(例如 user.cache、user.inc 等),那么它们很容易受到攻击。旧版本的 php-cgi 和 mod_php 有很多漏洞会导致它们失败。您应该确保在 apache 配置中防止这种情况发生,例如 stackoverflow.com/a/3703496/1301076
      • 你的回答似乎是从“应该没问题”开始的,然后继续解释为什么它一点都不好。
      • @Ladadadada,我不确定我是否明白你的意思。第一部分讨论安全性(这就是问题所在)。第二部分是关于效率的,这也是必须考虑的。
      • 我说的是第一段,不是第二段。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-01
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 2022-12-07
      • 2012-04-04
      相关资源
      最近更新 更多