【问题标题】:Post-Redirect-Get Model - Data Storage Methods & PCI Compliance重定向后获取模型 - 数据存储方法和 PCI 合规性
【发布时间】:2010-07-12 13:12:35
【问题描述】:

我的问题是在我的表单上使用 PRG 模式时如何在重定向期间保留数据。具体来说,我想在电子商务应用程序中使用它。我有三个通过重定向存储数据的选项,每个选项我都有顾虑。我希望你们能帮助我解决这个问题:

1.) 将数据存储在 URL 字符串中

我可以将数据存储为 URL 中传递的加密字符串。这很好,因为我不必存储信用卡信息,但我担心(也许我错了)Google Analytics 可能会导致信用卡信息(虽然已加密)被编入索引并显示在搜索结果中.希望我在这个问题上是错误的并且可以使用这种方法,因为它是最简单的。

2.) 在会话中存储数据

我可以将数据存储在会话中,但我担心某些用户将无法使用会话,因为 cookie 被禁用,这会限制应用程序的实用性。此外,我将在会话中存储加密的信用卡信息,并且 PCI 合规部表示在任何情况下都不允许我存储 CVV。

3.) 在数据库中存储数据

我可以将数据存储在数据库中,这将解决我对会话的兼容性问题——但我仍然存在在任何情况下都不允许存储 CVV 编号的问题。

似乎在使用 PRG 模式时,通过 URL 传递信息是最好的方法。我只是担心页面中的 Google Analytics 可能会将 URL 中的查询字符串编入索引。即使查询是信用卡信息的加密和不可读形式,我仍然不希望它出现在任何东西上。希望我认为 Analytics 会存储和索引这些信息是不正确的。

请指教,谢谢您的帮助。

【问题讨论】:

    标签: php pci-dss post-redirect-get


    【解决方案1】:

    Ley 说您通过 URL 传递信用卡信息。

    爬虫可以使用 CVV 索引页面的唯一方法是用户在提交后被重定向到的 URL 以某种方式泄露。您说您对 URL 中传递的信用卡信息进行了加密,但如何完成的细节至关重要。

    如果您只是使用相同的密钥加密所有内容,并在请求页面时解密 URL 信息并将其显示给用户进行确认,那肯定是不够的。仍然不够,例如允许该确认页面只显示一次——因为没有那么多 CVV 号码,任何用户都可以轻松地尝试所有组合并查看它们加密的内容。所以我什至没有考虑复杂的密码系统解决方案。

    我认为可以做到这一点的一种可能方法是生成一个长随机密钥(或者只要您正在加密的信息;因为它不是那么多数据,在这种情况下您可以使用对称加密),加密使用该密钥的数据,并将该密钥设置为客户端上的安全且短暂的 cookie(当然,在整个 https 上)。这样,即使 URL 泄露,也只有该用户能够解密信用卡信息。

    这也解决了您可能在 Web 服务器中记录请求的问题;由于很少记录 cookie,因此对日志的检查也不足以检索信用卡信息。

    【讨论】:

    • 艺术,谢谢你——很好的建议。我正在使用加密,这样相同的帖子数据每次看起来都不同,具有相同的密钥,但每次加密都有一个唯一的 iv。我已经使用会话添加了同步令牌模式,因此任何出现格式良好的 URL 的人都会被拒绝,因为他们缺少正确的会话。仍然担心 Google Analytics 会自动索引我的页面,而不是爬虫(不确定 Analytics 是否会这样做)。再次感谢。
    【解决方案2】:

    为您将传递此信息的页面禁用 Google Analytics,并确保您在所有包含该信息的页面上都有证书。使用一些基本加密可能也值得您使用。

    如果您要发送 URL,您可以执行以下操作,这将为您提供额外的安全保护:

    $text   =   '464945645667567564564';
    $key    =   'highlysecurkeyhere';
    
    // step 1: encrypt (you can then send this through _GET as urlencoded)
    $iv         =   mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB), MCRYPT_RAND);
    $encrypted  =   mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CFB, $iv);
    $encrypted  =   urlencode($encrypted);
    
    // Recieving end, decoe then decrypt.
    $output = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, urldecode($encrypted), MCRYPT_MODE_CFB, $iv);
    echo $output;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-19
      • 2011-05-12
      • 2018-09-11
      • 1970-01-01
      • 2013-10-13
      • 1970-01-01
      • 2016-05-18
      相关资源
      最近更新 更多