Динамическое создание кнопок 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="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://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>
Изменить цену продукта просто, если вы можете изменить код, скажем, с помощью FireBug.
Причина, по которой я спрашиваю, заключается в том, что я мог бы начать разработку системы электронной коммерции, в которой продукты можно добавлять в эту систему, не делая этого в PayPal.
6 ответов
Вы должны использовать PayPal Button 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"
);
Затем вы можете отправить это с помощью 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="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">
Эти ссылки должны помочь вам с параметрами кнопки:
Вы правы - динамические кнопки PayPal легко "взломать", если вы передаете, например, цену продукта в открытом тексте.
Однако PayPal поддерживает шифрование с помощью кнопок с открытым ключом, поэтому соответствующие детали не могут быть легко изменены. Вот как это работает:
- Вы генерируете пару открытый / закрытый ключ с соответствующей программой, такой как OpenSSL.
- Вы входите в свою учетную запись PayPal и отправляете открытый ключ в PayPal, а затем надежно сохраняете закрытый ключ на своем веб-сервере. Вам также необходимо скачать сертификат PayPal и сохранить его на своем сервере. Также настоятельно рекомендуется, чтобы PayPal не принимал неподписанные / незашифрованные транзакции (подробности см. По ссылке внизу).
- Каждый раз, когда вам нужно сгенерировать кнопку PayPal, вы шифруете данные с помощью открытого ключа PayPal и подписываете его своим закрытым ключом, а затем отображаете результат на своей веб-странице. Когда пользователь нажимает кнопку, PayPal расшифровывает данные и проверяет, не были ли они подделаны с момента их создания на вашем сервере.
Таким образом, пока ваш закрытый ключ не будет взломан, никто не сможет изменить детали транзакции.
Дополнительная информация и подробные инструкции доступны по адресу https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_html_encryptedwebpayments. (Хотя PayPal предоставляет свое программное обеспечение для генерации зашифрованных кнопок, я думаю, что их можно создавать "на лету", используя соответствующие функции, такие как openssl_*()
в PHP; Я не проверял их лично).
Альтернативой может быть внедрение мгновенного уведомления о платеже ( 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. В противном случае после отправки формы необходимо будет выполнить проверку на стороне сервера, чтобы убедиться, что в этом нет ничего смешного.
Вы можете создавать зашифрованные кнопки на лету, для получения дополнительной информации вы можете проверить динамическое шифрование кнопки Paypal
Я думаю, что у меня есть решение этой проблемы:
Сначала отправьте в PayPal с защищенной страницы - общедоступного SSL.
Во-вторых, вы можете использовать Ajax, чтобы пользователи не могли просматривать ваш HTML-код с помощью "Правого клика - Просмотр исходного кода" или инструментов браузера, таких как Fire-Bug.
Вот пример в jQuery:
Я обычно программирую на C#.NET, поэтому я общаюсь с универсальным обработчиком .ashx (но он может работать и с PHP)
$ (function () {
$.ajax({ type: "POST", url: "myPage.ashx", data: { theProductsIdAndAmountsString: yourValue }, success: function (allHtmlCode) { $("body").append(allHtmlCode); $("form").submit(); } }); });
На стороне сервера вы можете сгенерировать всю HTML-форму путем объединения данных из вашей базы данных, а затем отправить ее обратно на страницу.
После этого добавьте его в тело и отправьте форму в PayPal.
Теперь никто не может использовать инструменты браузера, такие как Fire-Bug, чтобы изменить ваши значения HTML.