2011-06-12 103 views
25

我只是想知道这里..是不是动态创建,非常不安全,易于“破解”的PayPal按钮?动态PayPal按钮生成 - 是不是非常不安全?

像这样:

<form name="_xclick" target="paypal" action="https://www.paypal.com" method="post"> 
<input type="hidden" name="cmd" value="_cart"> 
<input type="hidden" name="business" value="[email protected]"> 
<input type="hidden" name="currency_code" value="USD"> 
<input type="hidden" name="item_name" value="HTML book"> 
<input type="hidden" name="amount" value="24.99"> 
<input type="image" src="http://www.paypal.com/en_US/i/btn/btn_cart_LG.gif" border="0" name="submit" alt="Make payments with PayPal - it's fast, free and secure!"> 
<input type="hidden" name="add" value="1"> 
</form> 

改变产品的价格是直线前进时,你可以修改与,比如说,萤火代码。

我问的原因是因为我可能会/会开始开发一个电子商务系统,其中产品可以添加到该系统中,而无需在PayPal中进行。

+0

您需要验证服务器上的价格。我不知道你会怎样用Paypal来做到这一点。 – SLaks 2011-06-12 13:42:25

+0

您能否提供一个参考资料,您可以在PayPal开发人员网站上看到该技术的位置? – Kev 2011-06-12 13:44:34

+0

当然,他们会在服务器上验证它,在这种情况下它很好。 – Flash 2011-06-12 13:47:03

回答

47

您应该使用PayPal按钮的API,如下面:

$sendPayData = array(
    "METHOD" => "BMCreateButton", 
    "VERSION" => "65.2", 
    "USER" => "username", 
    "PWD" => "password", 
    "SIGNATURE" => "abcdefg", 
    "BUTTONCODE" => "ENCRYPTED", 
    "BUTTONTYPE" => "BUYNOW", 
    "BUTTONSUBTYPE" => "SERVICES", 
    "BUTTONCOUNTRY" => "GB", 
    "BUTTONIMAGE" => "reg", 
    "BUYNOWTEXT" => "BUYNOW", 
    "L_BUTTONVAR1" => "item_number=$invoiceNumber", 
    "L_BUTTONVAR2" => "item_name=$invoiceType", 
    "L_BUTTONVAR3" => "amount=$invoiceTotal", 
    "L_BUTTONVAR4" => "currency_code=GBP", 
    "L_BUTTONVAR5" => "no_shipping=1", 
    "L_BUTTONVAR6" => "no_note=1", 
    "L_BUTTONVAR7" => "notify_url=http://www.abc.co.uk/paypal/ipn.php", 
    "L_BUTTONVAR8" => "cancel_return=http://www.abc.co.uk/paypal/thanks", 
    "L_BUTTONVAR9" => "return=http://www.abc.co.uk/paypal/return.php" 
); 

你就可以发送与卷曲自己的API

$curl = curl_init(); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($curl, CURLOPT_URL, 'https://api-3t.paypal.com/nvp?'.http_build_query($sendPayData)); 
$nvpPayReturn = curl_exec($curl); 
curl_close($curl); 

为了然后生成一个加密的HTML按钮不能编辑

<form action="https://www.paypal.com/cgi-bin/webscr" method="post"> 
<input type="hidden" name="cmd" value="_s-xclick"> 
<input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----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-----END PKCS7----- 
"> 
<input type="image" src="https://www.paypal.com/en_US/i/btn/btn_paynow_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online."> 
<img alt="" border="0" src="https://www.paypal.com/en_GB/i/scr/pixel.gif" width="1" height="1"> 

这些链接可以帮助您使用按钮选项:

https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_nvp_BMCreateButton

https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_ButtonMgrAPIIntro

+0

太棒了!这是否需要任何API密钥? – Jeff 2011-06-12 15:04:02

+0

那么SSL呢? – Jeff 2011-06-12 15:06:18

+0

SSL通过将数据传递到安全位置('https:// api-3t.paypal.com')来处理。所有你需要做的设置是登录到你的PayPal帐户,去配置文件,请求一个API签名(而不是其他选项 - 我不记得它叫什么),然后你不在。 – lethalMango 2011-06-12 16:47:13

3

我想你也可以使用散列法,所有重要值都被散列,所以它们不能被修改。

目前的方法确实可以破解,但一旦您在PayPal网站上,您仍然可以看到您要支付的金额。用户可以仔细检查金额。

1

你是对的。 <input type="hidden" name="amount" value="24.99">可以在客户端轻松操作。在你给的例子中,这可能是客户实际上应该能够设置金额的一种形式,例如。一个PayPal捐赠按钮。否则,在提交此表单后需要进行服务器端检查,以确保没有有趣的业务正在进行。

7

您是对的 - 如果您通过明文形式传递产品的价格,则动态PayPal按钮很容易被“破解”。

但是,贝宝支持公钥按键加密,所以相关细节不容易改变。这是它的工作方式:

  • 您使用适当的程序(如OpenSSL)生成公钥/私钥对。
  • 您登录到您的PayPal帐户并将公钥提交给PayPal,然后将私钥安全地存储在您的Web服务器上。您还需要下载PayPal的证书并将其存储在您的服务器上。强烈建议告诉PayPal不要接受未签名/未加密的交易(详情请参阅底部的链接)。
  • 每次您需要生成PayPal按钮时,都需要使用PayPal的公钥对数据进行加密,并使用私钥对其进行签名,然后将结果显示在网页上。当用户点击该按钮时,PayPal将解密详细信息,并检查自您服务器生成以来它们是否被篡改。

这样,只要你的私钥没有妥协,没有人能够改变交易的细节。

更多信息和详细说明请见https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_html_encryptedwebpayments#id08A3I0P017Q。 (虽然PayPal提供了它的软件来生成加密按钮,但我认为可以使用适当的功能“在运行中”创建它们,例如PHP中的openssl_*();我没有亲自测试过它们)。

另一种方法是实施即时付款通知(https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_admin_IPNIntro);您可以检查用户执行的交易金额等于总订单金额。

-9

我想我对这个问题的解决方案:
首先,从安全页面提交给贝宝 - 公共SSL。

其次,您可以使用Ajax,以防止用户通过“右键单击 - 查看源代码”或浏览器工具(如Fire-Bug)浏览您的HTML代码。

这里是jQuery的一个例子:
我通常使用C#.NET程序,所以这就是为什么我用.ashx的通用处理器通信,(但它可以用PHP工作以及)

$(函数(){

$.ajax({ 
      type: "POST", 
      url: "myPage.ashx", 
      data: { 
       theProductsIdAndAmountsString: yourValue 
      }, 
      success: function (allHtmlCode) { 
       $("body").append(allHtmlCode); 
       $("form").submit(); 
      } 
     }); 
    }); 

在服务器端,您可以通过汇集数据库中的数据来生成所有HTML表单,然后将其发送回页面。
之后,将其附加到正文并将表单提交给PayPal。

现在没有人可以使用Fire-Bug等浏览器工具来更改HTML值。

+0

我确实想过做表单提交的事情,但不是用Ajax,所以+1。我不认为有可能用FireBug这样的工具编辑Javascript,呵呵? :) – Jeff 2011-06-13 11:04:49

+0

您可以使用FireBug编辑Javascript,但发送给PayPal的变量将在服务器中生成,您无法编辑,而且您无法看到源代码屁股,我试过..这是不可能的。
但有些工具允许您解码对服务器的请求,编辑变量值并用新值向服务器重新请求。这就是为什么你应该使用SSL(https://)来加密对服务器的请求并防止这种情况发生。 – 2011-06-13 22:06:48

+0

@Shavit - 是否可以使用SSL而不付钱? (我是否需要购买任何证书,或者它是如何工作的?) – Jeff 2011-06-14 10:09:17