【问题标题】:Paypal - Securing non-encrypted buttonsPaypal - 保护非加密按钮
【发布时间】:2012-09-04 12:12:36
【问题描述】:

我使用 IPN 实现了一个动态按钮“立即购买”(未保存在我的 PayPal 帐户中),它运行良好(是的!)。

现在我怀疑他的安全性,因为如果有人用萤火虫(例如)更改金额值,那么如果我的 IPN 监听器说金额有问题,该交易对 paypal 也是有效的。

我的问题是“我可以使用 php / codeigniter 库加密表单吗?”

因为我尝试在 IPN 侦听器中检查金额,但 paypal 上的交易继续正确,并且没有被 IPN 阻止。

在这里,您可以找到我的侦听器代码的一部分:

private function isVerifiedIPN(){

    $req = 'cmd=_notify-validate';
    $posts = $this->input->post();
    foreach ($posts as $key => $value){
        $value = urlencode(stripslashes($value));
        $req .= "&$key=$value";
    }

    if($this->config->item('SIMULATION'))
        $url = $this->config->item('SIMULATION_URL');
    else
        $url = $this->config->item('PRODUCTION_URL');


    if(!$this->isVerifiedAmmount() ||
    !$this->isPrimaryPayPalEmail() ||
    !$this->isNotProcessed()){
        $req = '';
    }

    $header = "POST /cgi-bin/webscr HTTP/1.0\r\n";
    $header .= "Host: $url\r\n"; //443
    $header .= "Content-type: application/x-www-form-urlencoded\r\n";
    $header .= "Content-length: " . strlen($req) . "\r\n\r\n";

    $fp = fsockopen ("ssl://$url", 443, $errno, $errstr, 30);

    if (!$fp)
    {
        $this->sendReport("Errore connessione socket");
        return FALSE;
    }
    else
    {
        fputs ($fp, $header . $req);
        while (!feof($fp))
        {
            $res = fgets ($fp, 1024);
            if (strcmp($res, "VERIFIED") == 0)
            {
                // transizione valida
                fclose ($fp);
                return TRUE;
            }
            else if (strcmp ($res, "INVALID") == 0)
            {
                $this->sendReport('Transizione non valida');
                fclose ($fp);
                return FALSE;
            }
        }
    }

}

【问题讨论】:

    标签: php security codeigniter paypal paypal-ipn


    【解决方案1】:

    您可以动态加密按钮,以便使用 Firebug(或类似软件)的人无法编辑它们。 PayPal API 库有一个您可以使用的示例,但我现在找不到了。

    This PayPal help file 解释了如何使用服务器命令行获取所需的各种密钥。

    我还找到了a tutoriala certificate builder(我没用过,所以无法确认它有多安全……)

    一旦您生成了您的密钥和证书,您需要将它们放在您的服务器上并将DEFAULT_EWP_PRIVATE_KEY_PATHDEFAULT_EWP_CERT_PATH 设置为相关文件。

    将公共证书上传到 PayPal(链接教程中的说明),并将 DEFAULT_CERT_ID 设置为它为该文件提供的证书 ID。它还会为您提供一个可以下载的文件 - 将其添加到您的服务器并将 PAYPAL_CERT_PATH 设置为该文件的路径。

    【讨论】:

    • 谢谢尤达!但是你忘记了链接! :P 谢谢 :)
    • 这对我来说很特别。他们现在在那里。
    【解决方案2】:

    对于那些发现使用库进行加密太难,或者在进行加密时存在托管要求问题的人,另一个技巧是不加密,而是创建一个您传递的哈希值,以便您可以检测到篡改,然后在 IPN 进入处理时验证此哈希。我在这里解释一下:

    How do I make a PayPal encrypted buy now button with custom fields?

    【讨论】:

      猜你喜欢
      • 2014-01-03
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 2011-04-13
      • 2015-09-22
      • 1970-01-01
      • 2011-09-02
      相关资源
      最近更新 更多