Защитите php-скрипт, который получает уведомления paypal по IPN
-
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 добавит новый адрес, вы можете добавлять отчеты по электронной почте и просматривать такие случаи вручную.
Другие советы
Есть много вещей, которые вы можете сделать:
- Дайте вашему скрипту непонятное имя, чтобы его было нелегко угадать.
- Отключить списки каталогов в папке
- Проверьте, является ли вызывающий сайт 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:
(Главная страница разработчика> Как> 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 на сервере.