PayPal IPN Security.
-
27-09-2019 - |
Вопрос
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, чтобы пройти вашу проверку:
- Он подключается с собственной машины с IP-адресом XYZT
- Ваш сервер вызывает GetHostbyAddr («XYZT»), который отправляет запрос DNS для имени tzyxin-addr.arpa.
- Если XYZT относится к злоумышленнику, вероятно, что он контролирует (по крайней мере) доменом DNS Zyxin-addr.Arpa, а также содержит свой собственный IP). Таким образом, он может вернуть «PayPal.com» в ответ на этот запрос.
- Ваш сервер получает «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 может потребоваться проверить, откуда приходит звонок)