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


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

  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 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 на сервер.