Защитите php-скрипт, который получает уведомления об IP-адресе PayPal


На моем веб-сайте я интегрировал php-скрипт, который получает уведомление IPN и отправляет лицензионный ключ клиенту. Этот скрипт находится в папке с другими 2 php-файлами, необходимыми для php-скрипта... Как я могу защитить эту папку? Если я помещу в него .htaccess с:

order allow,deny
deny from all

Я также блокирую уведомления PayPal.

Как я могу защитить его? Нужно ли мне это?

Author: Tunaki, 2009-07-14

7 answers

Вы можете безопасно ограничить доступ к вашему сценарию IPN только следующим списком IP-адресов:

216.113.188.202
216.113.188.203
216.113.188.204
66.211.170.66

Это можно сделать следующим образом:

if (!in_array($_SERVER['REMOTE_ADDR'],array('216.113.188.202','216.113.188.203','216.113.188.204','66.211.170.66')) {
header("HTTP/1.0 404 Not Found");
exit();
}

Таким образом, ТОЛЬКО Paypal сможет получить доступ к сценарию IPN.

Этот список IP-адресов был довольно стабильным в течение многих лет. В случае, если Paypal добавит новый адрес, вы можете добавить отчеты по электронной почте и просмотреть такие случаи вручную.

 7
Author: Andriy B, 2009-07-14 12:53:25

Есть много вещей, которые вы можете сделать:

  1. Дайте вашему сценарию неясное имя, чтобы его было нелегко угадать.
  2. Отключить списки каталогов в папке
  3. Проверьте, является ли вызывающий сайт paypal.com (или соответствующий IP-адрес и т.д.)
 3
Author: Alec Smart, 2009-07-14 07:27:13

Почему вы пытаетесь это сделать?

В системе IPN вы сначала просто возвращаете переменные, переданные вашему сценарию ipn, обратно в PayPal, используя CURL или fshock или что-либо еще... изучив ответ, вы можете сказать, является ли это действительной транзакцией или нет... кто-то не может подделать переменную транзакции, которой не существует в самой paypal... все, что они могут сделать, это повторно использовать старую информацию о транзакции, чтобы обмануть ваш скрипт.. поскольку он существует в paypal, ваш скрипт будет предполагать, что это успешная оплата...

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

Поскольку вы выполняете эти проверки, кого волнуют те, которые вызывают этот сценарий ipn... это не будет работать для них, так как вы проверяете переменные по PayPal и своей базе данных...

В любых исключениях распечатайте хорошее предложение, чтобы сказать им "Это сценарий надежен! Не пытайтесь обмануть нас!"

 3
Author: Yasin Ergul, 2010-03-25 15:27:18

Если вы знаете IP-адрес, с которого PayPal будет использовать скрипт, попробуйте:

order deny, allow
deny from all
allow from [Paypal-IP]
 2
Author: gernberg, 2009-07-14 07:28:01

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

Я думаю, что сценарий, обрабатывающий запрос Paypal, является подходящим местом для обработки этого - в этом сценарии вам нужно убедиться, что запрос действительно поступает от Paypal. Вы можете сделать это, используя какой-нибудь непонятный URL-адрес, который нелегко догадался, как и было предложено.

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

Надеюсь, это поможет!

 2
Author: ylebre, 2009-07-14 07:37:32

Ознакомьтесь с контрольным списком go live:

Https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/howto_api_golivechecklist

(Главная страница разработчика > Как работать > API > Контрольный список перехода к работе)

Для списка IP-адресов, разрешающих

 2
Author: nickwshaw, 2011-05-22 09:38:34

Теперь я сделал это:

В папке, где хранится php-скрипт и 2 файла конфигурации, я создал другую папку, в которую я переместил 2 файла конфигурации и где я разместил .htaccess со следующим кодом:

order allow,deny
deny from all

Теперь 2 конфигурационных файла имеют хорошую защиту! ... но не тот скрипт, который получает уведомления! Если я попытаюсь заблокировать список каталогов (для папки, содержащей php-скрипт и папку конфигурации) с помощью:

IndexIgnore *

В песочница paypal выдает мне ошибку 500!

Поэтому единственное, что я могу сделать для защиты сценария, - это поместить в его начало условие, подтверждающее, что уведомления поступают от paypal.com ?

Наконец, я добавил в начало php-скрипта оператор if, основанный на имени удаленного хоста:

 $remote_host = gethostbyaddr($_SERVER['REMOTE_ADDR']);

Если кому-то интересно, также можно запросить $_SERVER['REMOTE_HOST'], но необходимо настроить файл httpd.conf на сервере.

 1
Author: BitDrink, 2013-04-04 21:45:16