#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;
Я не думаю, что он охватывает все случаи, но, похоже, работает с моей настройкой. Если кто-нибудь знает общее решение, пожалуйста, отправьте его здесь.