2011-09-28 110 views
4

我想将用Perl编写的服务公开给本地主机HTTP请求。我不想修改Apache配置。如何检查Perl CGI HTTP请求是否源自本地主机?如何检查perl cgi请求是否来自本地主机

即使通过虚拟主机进行此调用,我也希望此检查成功,例如, https://www.myserivce.com/hidden/service.pl由于该电话是从www.myserivce.com内部进行的。

+0

您尚未解释尝试完成此操作时遇到的问题。特别是,我不明白现在是什么阻止你的Perl脚本执行此操作。 –

+0

问题是,remote_addr()有时会返回“127.0.0.1”,有时还会返回其他一些地址。 – agsamek

+0

我们来看看这些结果的一些例子以及获取它们的代码。 –

回答

0

我用下面的代码:

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; 

我不认为这涵盖所有情况,但似乎与我的设置一起工作。如果有人知道一个通​​用的解决方案,那么请在这里提交。

10

REMOTE_ADDR,但这是一种愚蠢的做法,因为您将验证逻辑放在应用程序中。

而是bind a stand-alone Web server to local interface only,因此操作系统的IP /网络堆栈保证没有来自外部的请求可以到达服务器。

+0

我应该用REMOTE_ADDR检查什么?它返回127.0.0.1,但有时它返回接口的IP地址(我无法控制计算机启动Web服务器) – agsamek

+1

根据本地主机IP地址(127.0.0.0/8和:: 1/128中的let [ Net :: CIDR :: Lite](http://p3rl.org/Net::CIDR::Lite)帮助你)或接口的地址。如果测试失败,请拒绝该请求。 – daxim

+0

不起作用 - 即使请求来自localhost,我也会获得公共的194.xx.xx.xx地址。 – agsamek

1

我认为,如果你在/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

相关问题