PayPal IPN Security - PullRequest
       9

PayPal IPN Security

7 голосов
/ 18 мая 2010

PayPal IPN отправляет запрос POST с переменным количеством полей на URL-адрес уведомления, чтобы подтвердить, что запрос POST является законным, и нам нужно повторно отправить тот же запрос вместе с дополнительным полем cmd=_notify-validate в PayPal, которое ответы VERIFIED или INVALID.

Мой вопрос: зачем нам отправлять запрос в PayPal? Разве этого не достаточно?

if (preg_match('~^(?:.+[.])?paypal[.]com$~i', gethostbyaddr($_SERVER['REMOTE_ADDR'])) > 0)
{
    // request came from PayPal, it's legit.
}

Если мы можем доверять серверу для правильного разрешения IP-адресов, я полагаю, что мы можем доверять всем запросам от PayPal, нет?

Ответы [ 6 ]

6 голосов
/ 15 июля 2011

Это самый простой способ сделать это, как я полагаю, согласно PayPal.Я использую http_build_query () для создания URL-адреса из сообщения, отправленного на сайт из PayPal.Paypal docs заявляет, что вы должны отправить это обратно для проверки, и это то, что мы делаем с file_get_contents.вы заметите, что я использую strstr, чтобы проверить, присутствует ли слово «VERIFIED», и поэтому мы продолжим работу, если нет, мы вернем false…

$verify_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_notify-validate&' . http_build_query( $_POST );   

if( !strstr( file_get_contents( $verify_url ), 'VERIFIED' ) ) return false;
5 голосов
/ 18 мая 2010

PayPal просто обеспечивает более высокий стандарт безопасности для выгоды вашего собственного сайта / приложения.

IP-спуфинг может легко обмануть вашу примерную функцию, так как использование только REMOTE_ADDRESS весьма подвержено атаке.

Когда вы работаете с финансовыми транзакциями, безопасность имеет большое значение. Если я смогу подделать запрос IPN, я смогу обмануть ваш сайт / приложение для выполнения ложных транзакций. Отправляя дополнительный запрос в известное и доверенное местоположение, мы получаем гораздо более высокий стандарт учетных данных, по которым необходимо действовать. Весь исходный запрос IPN отправляется в этом подтверждении, так что PayPal может проверить, что все детали транзакции действительно действительны, тем самым предотвращая атаку «человек посередине», когда злоумышленник изменяет детали (например, изменяя цену или количество ) другого действительного запроса, отправленного из PayPal на ваш сервер.

4 голосов
/ 03 января 2013

Я знаю, что этот вопрос довольно старый, но:

Злоумышленнику даже не нужно подделывать свой ip или выполнять какие-либо MITM, чтобы пройти проверку:

  1. Он подключается со своей машины с IP-адресом x.y.z.t.
  2. Ваш сервер вызывает gethostbyaddr ("x.y.z.t"), который отправляет DNS-запрос для имени t.z.y.x.in-addr.arpa.
  3. Если x.y.z.t принадлежит атакующему, скорее всего, он контролирует (как минимум) домен dns z.y.x.in-addr.arpa (поскольку он содержит свой собственный ip). Поэтому он может вернуть «paypal.com» в ответ на этот запрос.
  4. Ваш сервер получает "paypal.com" от DNS-сервера злоумышленника, и ваша проверка правильности прошла успешно.

Эта атака побеждена отправкой запроса в PayPal в соответствии с рекомендациями Лобоса.

2 голосов
/ 28 сентября 2010

все развалится, если кому-то удастся изменить файл hosts на машине, на которой работает ваш ipn listener;

  • плохой человек отправляет ложное уведомление о платеже

  • ваш скомпрометированный сервер отправляет дубликат на «paypal.com», который фактически указывает на машину злоумышленников

  • Плохой человек отвечает ПРОВЕРЕНО, получает товар, как если бы он заплатил.

это не такая большая проблема, как если бы у человека есть доступ к вашему хост-файлу, он может просто поместить запись о платеже в вашу базу данных вручную или нанести много других повреждений.

просто мысль.

1 голос
/ 18 мая 2010

Вот причина, чтобы ответить на POST, из IPN Guide :

Ваш слушатель должен ответить каждому сообщение, собираетесь ли вы сделать что-нибудь с этим. Если вы этого не сделаете ответить, PayPal предполагает, что сообщение не было получено и пересылается сообщение. PayPal продолжает периодически отправлять сообщение до ваш слушатель отправляет правильный сообщение обратно, хотя интервал между повторными сообщениями увеличивается каждый время.

ВАЖНО : PayPal ожидает получить ответ на сообщение IPN в течение 30 сек.

0 голосов
/ 08 апреля 2014

Вот еще одно решение - https://stackoverflow.com/a/4988281/2165415

(поскольку вашей странице IPN может потребоваться проверить, откуда поступил звонок)

...