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