Защитите php-скрипт, который получает уведомления IPN PayPal. - PullRequest
6 голосов
/ 14 июля 2009

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

order allow,deny
deny from all

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

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

Ответы [ 7 ]

7 голосов
/ 14 июля 2009

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

3 голосов
/ 25 марта 2010

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

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

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

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

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

3 голосов
/ 14 июля 2009

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

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

Ознакомьтесь с контрольным списком для запуска в прямом эфире:

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

(Домой разработчика> Как> API> Перейти к контрольному списку)

для списка IP-адресов, чтобы разрешить

2 голосов
/ 14 июля 2009

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

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

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

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

2 голосов
/ 14 июля 2009

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

order deny, allow
deny from all
allow from [Paypal-IP]
1 голос
/ 14 июля 2009

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

в папке, где хранится сценарий 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.

...