Вопрос

PayPal IPN отправляет запрос на почту с переменным количество полей в URL-адрес уведомления, чтобы подтвердить, что почтовый запрос является законным, нам нужно повторно отправить тот же запрос вместе с дополнительным 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.
}

IFF. Мы можем доверять серверу правильно разрешать IPS, я предполагаю, что мы можем доверять всем запросам от PayPal, нет?

Это было полезно?

Решение

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

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

  1. Он подключается с собственной машины с IP-адресом XYZT
  2. Ваш сервер вызывает GetHostbyAddr («XYZT»), который отправляет запрос DNS для имени tzyxin-addr.arpa.
  3. Если XYZT относится к злоумышленнику, вероятно, что он контролирует (по крайней мере) доменом DNS Zyxin-addr.Arpa, а также содержит свой собственный IP). Таким образом, он может вернуть «PayPal.com» в ответ на этот запрос.
  4. Ваш сервер получает «PayPal.com» на DNS-сервере злоумышленника, и ваш проверка проверки добивается успеха.

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

Другие советы

Это самый простой способ, которым я обнаружил это, также согласно PayPal предлагает. Я использую http_build_query (), чтобы построить URL-адрес от поста, который был отправлен на сайт из PayPal. PayPal Docs заявляет, что вы должны отправить это обратно для проверки, и это то, что мы делаем с file_get_contents. Вы отметите, что я использую Strstr, чтобы проверить, присутствует ли слово «Verified» и поэтому мы продолжаем функцию, если не вернем ложь ...

$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;

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

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

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

Вся вещь разваливается, если кто-то удается изменить файл Hosts на машине, запустив ваш IPN-прослушиватель;

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

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

  • Плохое лицо отвечает проверено, получает товары, как будто они заплатили.

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

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

Вот причина ответить на пост, от Руководство по IPN:

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top