Защитите php-скрипт, который получает уведомления об IP-адресе PayPal
На моем веб-сайте я интегрировал php-скрипт, который получает уведомление IPN и отправляет лицензионный ключ клиенту. Этот скрипт находится в папке с другими 2 php-файлами, необходимыми для php-скрипта... Как я могу защитить эту папку? Если я помещу в него .htaccess
с:
order allow,deny
deny from all
Я также блокирую уведомления PayPal.
Как я могу защитить его? Нужно ли мне это?
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 добавит новый адрес, вы можете добавить отчеты по электронной почте и просмотреть такие случаи вручную.
Есть много вещей, которые вы можете сделать:
- Дайте вашему сценарию неясное имя, чтобы его было нелегко угадать.
- Отключить списки каталогов в папке
- Проверьте, является ли вызывающий сайт 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 > Контрольный список перехода к работе)
Для списка IP-адресов, разрешающих
Теперь я сделал это:
В папке, где хранится 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 на сервере.