Мне просто интересно здесь. Не являются ли кнопки 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="me@mybusiness.com"> <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://img.ruphp.com/php/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>
Изменение цены продукта прямо, если вы можете изменить код, скажем, FireBug.
Причина, по которой я спрашиваю, заключается в том, что я могу / начню разработку системы электронной коммерции, где продукты могут быть добавлены в эту систему, не делая этого в PayPal.
Вы должны использовать API-интерфейс PayPal, например, ниже:
$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" );
Затем вы можете отправить это с помощью cURL в свой 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="http://img.ruphp.com/php/btn_paynow_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online."> <img alt="" border="0" src="http://img.ruphp.com/php/pixel.gif" width="1" height="1">
Эти ссылки должны помочь вам с кнопками:
Вы правы – динамические кнопки PayPal легко «взламываются», если вы передаете, например, цену продукта в ясном тексте.
Однако PayPal поддерживает шифрование кнопок с открытым ключом, так что соответствующие детали не могут быть легко изменены. Так оно и работает:
Таким образом, до тех пор, пока ваш закрытый ключ бескомпромиссен, никто не сможет изменить детали транзакции.
Более подробную информацию и подробные инструкции можно найти на странице https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_html_encryptedwebpayments#id08A3I0P017Q . (Хотя PayPal предоставляет свое программное обеспечение для генерации зашифрованных кнопок, я думаю, что их можно создавать «на лету» с использованием соответствующих функций, таких как openssl_*()
в PHP, я лично их не тестировал).
Альтернативой будет внедрение Instant Payment Notification ( https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_admin_IPNIntro ); вы можете проверить, что сумма транзакции, выполняемой пользователем, равна общей сумме заказа.
Я думаю, вы также можете использовать хешированный подход, где все важные значения хэшируются, поэтому они не могут быть изменены.
Нынешний подход действительно взломан, но как только вы попадете на сайт PayPal, вы все равно увидите сумму, которую собираетесь заплатить. Это зависит от пользователя, чтобы проверить сумму на самом деле.
Ты прав. <input type="hidden" name="amount" value="24.99">
можно легко манипулировать на стороне клиента. В примере, который вы указали, это может быть форма, где на самом деле предполагается, что клиент может установить сумму, например. кнопка пожертвования PayPal. В противном случае после отправки этой формы вам понадобятся проверки на стороне сервера, чтобы убедиться, что нет смешного дела.
Вы можете зашифровать зашифрованные кнопки на лету, для получения дополнительной информации вы можете проверить шифрование кнопок Dynamic Paypal
Я думаю, что у меня есть решение этой проблемы:
Сначала отправьте на PayPal с защищенной страницы – Public SSL.
Во-вторых, вы можете использовать Ajax, чтобы пользователи не могли просматривать ваш HTML-код через «Right Click – View Source» или в браузерах, таких как Fire-Bug.
Вот пример в 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.