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

StackOverflow https://stackoverflow.com/questions/1123933

  •  13-09-2019
  •  | 
  •  

Вопрос

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

order allow,deny
deny from all

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

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

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

Решение

Вы можете безопасно ограничить доступ к вашему 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 добавит новый адрес, вы можете добавлять отчеты по электронной почте и просматривать такие случаи вручную.

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

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

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

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

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

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

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

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

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

order deny, allow
deny from all
allow from [Paypal-IP]

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

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

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

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

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

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

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

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

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

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

order allow,deny
deny from all

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

IndexIgnore *

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

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

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

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

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

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