Intereting Posts
Функция SetInterval не работает с файлом PHP Создать список с запятыми из массива в laravel / blade? Где я могу найти модульные тесты для регулярных выражений на нескольких языках? Безопасность массива $ _SESSION Можно ли доверять $ _SERVER ? Отображение цены только при выборе варианта и скидки в процентах относительно обычной цены Как показать большие числа на К (означает килограмм)? Как получить реальный URL-адрес после file_get_contents, если произойдет перенаправление? Добавление собственной суммы на кнопку оплаты Laravel как добавить новое поле в результат запроса Что случилось с моей контактной формой AJAX? (php mail ()) Что было бы хорошим образцовым проектом, чтобы попросить потенциального программиста кодировать во время процесса найма? Как я могу усечь строку до первых 20 слов в PHP? Контроллер Symfony2 не будет исключать исключение Регулярное выражение для соответствия датам в формате ГГГГ-ММ-ДД

Динамичная генерация кнопки 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://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"> 

Эти ссылки должны помочь вам с кнопками:

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

Вы правы – динамические кнопки 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#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.