这个Paypal设置安全吗?

时间:2010-09-24 03:26:54

标签: security encryption paypal e-commerce

我只是想通过其他人来管理这个,以确保我没有遗漏任何明显的东西。我正在使用Payflow Link,它处理电子商务交易的所有信用卡肮脏。但是,您通过POST变量将事务的总金额传递给PayPal - 这似乎是一个潜在的安全漏洞:

  1. 恶意用户可以加载购物车并继续结帐
  2. 通过阅读隐藏的输入字段,他可以将POST欺骗到PayPal,总金额为1美分。
  3. Paypal将执行交易,调用我的订单记录脚本,该脚本将记录交易并标记其物品以便装运。
  4. 我可以通过访问数据库,拉动购物车商品,重新计算价格加运费和税金来检查购物车的总金额。但是,为了检查篡改(多个数据库查询,每个项目加上2个Web服务调用以获得运费和税收),这是一个繁重的工作。

    我的想法:

    1. 向PayPal发送金额正常的POST变量
    2. 但是,在用户定义的变量(转发到我的日志记录脚本)中,存储总金额的sha1哈希加上一些私钥
    3. 另一方面,日志记录脚本会重新计算美元金额,加上相同的私钥,并与发送的哈希值进行比较。
    4. 发送的散列和计算的散列之间的差异将表明篡改,并且订单将被红色标记以供人工审核。
    5. 这有意义吗?我错过了什么吗?

      编辑(澄清):

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

      任何人都可以使用我的提案演示单个漏洞,该漏洞允许恶意用户更改PayPal变量并且未被检测到吗?

      这是一个非常直截了当的问题。这就是我要找的全部。对于任何能够回答这个问题的人,请提前感谢您的时间和帮助!

5 个答案:

答案 0 :(得分:3)

我迟到了两年,但我同意作者的原创方法。我最近不得不对PayFlow Link做同样的事情。我所做的是根据用户的ID,订单总数以及他们购买的东西(购物车)生成一个哈希值,并在其中一个PayFlow链接用户字段中传递。我还在另一个字段中传递了一个用于创建此哈希的随机盐。在后端是用户永远不会看到的代码中的另一个共享密钥。总结一下......

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

另一方面,我使用从Paypal收集的相同输入再次生成哈希,他们处理了这些输入。如果没有任何东西被篡改,散列应该匹配。

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

希望这可以帮助将来的某个人!

答案 1 :(得分:2)

您需要在IPN后使用您的数据库详细信息对计算出的金额进行人工检查,然后使用PayPal中支付的金额进行验证。实际上没有其他选择,我强烈建议您这样做,否则用户将尝试游戏系统。

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

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

Payflow Link说明:“您决定是否结算交易”。所以你必须每次检查金额是否正确。

答案 4 :(得分:0)

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

你的哈希想法会起作用,但是我会在那里放一些时间戳,以便它改变,你可以验证超时是否已经过期。如果没有任何改变的东西,用户可以例如在他们的购物车中放置一个非常便宜的物品,获得sha1哈希并在他们将昂贵的物品放入购物车后重播它。