这个 Paypal 设置安全吗?

Posted

技术标签:

【中文标题】这个 Paypal 设置安全吗?【英文标题】:Is this Paypal setup secure? 【发布时间】:2011-04-16 14:08:04 【问题描述】:

我只是想由其他负责人运行它,以确保我没有遗漏一些明显的东西。我正在使用 Payflow Link,它可以处理电子商务交易的所有信用卡问题。但是,您通过 POST 变量将交易总额传递给 PayPal - 这似乎是一个潜在的安全漏洞:

    恶意用户可以加载他的购物车并继续结帐 通过读取隐藏的输入字段,他可以将 POST 欺骗到 PayPal,总金额为 1 美分。 Paypal 将执行交易,调用我的订单记录脚本,该脚本将记录交易并标记他的物品以便发货。

我可以通过访问数据库、拉出他的购物车物品并重新计算它们的价格以及运费和税金来检查他的购物车的总金额。但这只是为了检查篡改(多个数据库查询,加上每个项目 2 次 Web 服务调用以获取运费和税金)的大量繁重工作。

我的想法:

    向 PayPal 发送金额的正常 POST 变量 然后,在用户定义的变量(转发到我的日志记录脚本)中,存储总量的 sha1 哈希,加上一些私钥 另一方面,日志记录脚本重新散列美元金额,加上相同的私钥,并与发送的散列值进行比较。 发送的哈希值和计算的哈希值之间的差异表明存在篡改,订单将被标记为红色,以供人工审核。

这有意义吗?我错过了什么吗?

编辑(澄清):

显然,根据前几个回复,我并没有明确表达我的观点。我意识到这不是一个理想的设置。我知道其他公司提供类似甚至更好的服务。我知道我必须检查变量,我不能简单地信任它们。请,如果您要回复,我在答案中寻找的只是:

谁能证明我的提案中存在一个漏洞,该漏洞允许恶意用户更改 PayPal 变量并且未被检测到?

这是一个非常直接的问题。这就是我正在寻找的一切。对于任何可以回答的人,提前感谢您的时间和帮助!

【问题讨论】:

在查看了您的 cmets 并重新检查了 Paypal Pro 和 Paypro Link 之间的链接后,我撤回了我的答案。它对我来说也看起来不可靠。我对 Alec Smart 的回答表示支持,但实际上,如果是我,我会花更多的钱来使用 Paypal Pro 或寻找替代方案。我们对 Cyber​​source 非常满意。 @David - 感谢您的 cmets 和坦率。我意识到这可能不是完美的设置;然而,这就是客户正在使用的东西,所以我必须把它当作一个给定的。 @ all - 我感谢到目前为止提供的帮助,但还没有人真正回答我的问题。我不明白似乎假设的设置的漏洞;到目前为止,没有人向我展示过一个缺陷。如果这显然是一个糟糕的设置,那么我所要求的只是一个说明原因的例子。 【参考方案1】:

我晚了两年,但我可以同意作者的原始方法。我最近不得不对 PayFlow Link 做同样的事情。我所做的是根据用户的 ID、订单总额和他们购买的商品(购物车)生成一个哈希,并将其传递到 PayFlow Link User 字段之一。我还在另一个字段中传递了用于创建此哈希的随机盐。在后端是用户永远不会看到的代码中的另一个共享密钥。所以总结一下……

hash = (user ID) + (order total) + (cart details) + (random salt) + (shared key)

另一方面,我使用从 Paypal 收集并处理过的相同输入再次生成哈希。如果没有被篡改,哈希值应该匹配。

如果设置正确,这种方法可以完美运行。这里的密钥是用户永远不会看到的代码中的共享密钥,并且使用随机盐,因此即使购买相同,哈希值也不同,即使购买相同。

希望这对将来的某人有所帮助!

【讨论】:

【参考方案2】:

我可以看到的一个潜在问题是每次生成 SHA-1 哈希时都使用相同的盐。如果您每次都使用相同的盐,攻击者可以很容易地确定 0.99 美元(或其他低金额)的哈希值,然后将其替换为他们想要支付 0.99 美元的任何交易。

编辑:如果你想出一些确定盐的算法,这个问题显然成立。如果该算法以某种方式被破坏,您的攻击者也可以利用它。

【讨论】:

谢谢!我意识到这可能是个问题。我的散列知识有限,但你不需要一个非常大的数据集来破解它吗?此外,算法产生的盐不会以指数方式难以破解(即攻击者可能会确定盐,但随后还必须破解算法来产生盐?)。再次感谢第一个有用的答案! 使用可变(且不可猜测)的盐,是的,您需要一个大型数据集来破解它。麻烦出现在验证中,因为您需要以某种方式复制盐两次。如果您使用一些时变盐,那么您在进行验证时无法真正计算它,因为它会改变并且您会得到不同的哈希值。我想您可以将盐与交易的一些唯一标识符一起存储在数据库中,然后在执行验证步骤时将其取出...但这也可能不安全,具体取决于您的存储方式... 换句话说,在线商务充满了困难,当其他解决方案(如 PayPal Pro 或 Cyber​​source)已经过广泛测试并且运行良好时,推出自己的解决方案通常不是一个好主意。【参考方案3】:

您需要在 IPN 之后使用您的 DB 详细信息对计算出的金额进行手动检查,然后使用 PayPal 支付的金额进行验证。确实没有其他选择,我强烈建议您这样做,否则用户会尝试与系统博弈。

您可以使用本指南来加密您的 PayPal 变量:

http://dev.juokaz.com/php/paypal-payment-with-encryption

【讨论】:

你能提供任何具体的例子来说明我的系统是如何被“玩弄”的吗?您还没有真正解释为什么没有其他选择。此外,您链接到的指南适用于 PayPal 网站付款标准。我正在使用 Payflow Link,据我所知,它不提供您链接中讨论的加密选项。【参考方案4】:

我亲眼目睹了这种黑客行为。一些家伙以 1 美元的价格购买了 500 美元的礼品卡。我们快速添加了代码,将 IPN 的订单总数与我们自己的数据进行比较,并在不匹配时将订单标记为可疑。

Payflow Link 描述说:“您决定是否结算交易”。所以每次都要检查金额是否正确。

【讨论】:

这个答案根本没有帮助。我要问的是我建议的设置是否会阻止篡改收费金额的尝试,或者我的安全逻辑是否存在漏洞。我认为您建议我需要返回并查询数据库以检查值。如果是这样,为什么我的建议不起作用?谁能给我一个黑客的例子?我真的不明白为什么我的问题如此难以理解。 对不起。我想传达的是,在向 PayPal 发送任何内容之前,您必须以某种方式将订单金额保存在自己的数据库中。当 PayPal 向您发送 IPN 时,其中包含实际处理的订单金额。然后你的脚本必须比较这两个值。 最好的保护当然是通过 Website Payments Pro 在后台处理所有付款。 再一次,就像我在最初的评论中所说的那样:你没有提供一种可能让我的设置容易受到攻击的方法。简单地说“你的脚本必须比较这两个值”并不是一个可靠的论据,说明为什么我的不太密集的方法不安全。是的,我意识到有更安全的方法,正如我在对原始问题的编辑和其他答案中所说的那样。但这是我必须使用的设置,所以我需要找出解决这个问题的方法。【参考方案5】:

有一个关于这个主题的研究。 http://www.utdallas.edu/~zhiqiang.lin/spring2012/lec11.pdf。基本上你是对的,这些收银员服务很脆弱,可能会导致你失去电子商务商店的收入。

您的哈希想法会起作用,但是我会在其中放置一些时间戳,以便它更改并且您可以验证超时没有过期。例如,如果不进行任何更改,用户可以在他们的购物车中放置一个非常便宜的商品,获取 sha1 哈希并在他们将昂贵的商品放入购物车后重放它。

【讨论】:

以上是关于这个 Paypal 设置安全吗?的主要内容,如果未能解决你的问题,请参考以下文章

设置 PayPal 即时付款通知后,我可以追溯重新发送历史交易的 IPN 吗?

Paypal Express Checkout:可以使用 ActiveMerchant 设置收件人吗?

如何设置多种货币的捐赠paypal按钮?

如果我在 paypal 定期付款中将 TOTALBILLINGCYCLES 设置为零,该付款资料会永远存在吗?

用于测试的 PayPal 沙箱 - 安全吗?

Paypal 安全升级会影响订阅按钮吗?