как проверить, происходит ли запрос perl cgi с локального хоста

#perl #http #cgi

#perl #http #cgi

Вопрос:

Я хотел бы предоставить службу, написанную на Perl, HTTP-запросам localhost. Я не хочу изменять конфигурацию Apache. Как проверить, исходит ли HTTP-запрос Perl CGI от localhost?

Я хочу, чтобы эта проверка прошла успешно, даже если этот вызов выполняется, например, через виртуальный хост. https://www.myserivce.com/hidden/service .pl учитывая, что вызов выполняется изнутри www.myserivce.com .

Комментарии:

1. Вы не объяснили, с какими проблемами вы столкнулись при попытке выполнить это. В частности, я не понимаю, что на данный момент мешает вашему скрипту Perl делать это.

2. Проблема в том, что remote_addr() иногда возвращает «127.0.0.1», а иногда и некоторые другие адреса.

3. Давайте рассмотрим некоторые примеры этих результатов и код, который их получает.

Ответ №1:

REMOTE_ADDR, но это глупый способ сделать это, потому что вы помещаете логику аутентификации в приложение.

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

Комментарии:

1. И что я должен проверить с помощью REMOTE_ADDR ? Он возвращает 127.0.0.1, но иногда возвращает IP-адрес интерфейса (у меня нет контроля над машиной для запуска веб-сервера)

2. Проверьте его по IP-адресам локального хоста (в 127.0.0.0 / 8 и :: 1/128, пусть Net::CIDR::Lite поможет вам) или по адресу интерфейса. Если тест завершается неудачно, отклоните запрос.

3. Не работает — я получаю общедоступный адрес 194.xx.xx.xx, даже если запрос поступает с локального хоста.

4. Да, я это понял; кроме того, когда вы используете имя хоста, которое преобразуется в IP-адрес общедоступного интерфейса, это на самом деле не localhost — это слово имеет особое значение. В любом случае, слово or в моем предыдущем комментарии действительно является логическим логическим or . Примените эту информацию.

5. @agsamek: Ваше требование кода оскорбительно. Пожалуйста, продемонстрируйте готовность учиться и получать понимание.

Ответ №2:

Я думаю, что если вы поместите в /etc/hosts файл запись с myservice.com и ip 127.0.0.1, то все запросы с локального хоста на ваш сайт будут иметь REMOTE_ADDR значение 127.0.0.1 .

Я боюсь, что это единственный способ сделать это, если только вы не отправляете запросы 127.0.0.1/hidden/service.pl вместо myservice.com/hidden/service.pl

Ответ №3:

Я использовал следующий код:

 my $server_addr = inet_ntoa(scalar gethostbyname(hostname() || 'localhost'));
my $call_addr = $query->remote_addr();
die unless $call_addr eq "127.0.0.1" || $call_addr eq $server_addr;
  

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