只接受来自本地主机的get/post请求

20
因为我的Web应用需要加载的数据量很大,有时会变得非常缓慢,因此我决定添加一些jQuery Ajax功能来按需加载某些数据,然后将其保存在缓存中。
我想知道如何限制来自localhost /同一服务器/同一IP的任何GET或POST请求,以便避免外部对我的应用的调用?
也就是说,我的返回数据的PHP函数只应在从localhost请求时返回数据。
我的Web应用程序运行在CodeIgniter框架上,我的Web服务器配置是在Ubuntu上运行的LAMP。
有什么想法吗?
4个回答

29

你可以在构造函数中使用

if ($_SERVER['SERVER_ADDR'] != $_SERVER['REMOTE_ADDR']){
  $this->output->set_status_header(400, 'No Remote Access Allowed');
  exit; //just for good measure
}

如果这种方法不是您想要的,请使用.htaccess。您可以进行快速的谷歌搜索,返回一个特定的例子,拒绝所有的get/post请求,然后允许127.0.0.1/localhost。


1
当$_SERVER['SERVER_ADDR']返回::1时,您可能希望进行例外处理。 - TheRealChx101
4
注意:你可以伪造 remote_addr。https://dev59.com/3G445IYBdhLWcg3wAFcC - Sven van den Boogaart

10

使用 .htaccess 可能是最好的方法,只允许来自您本地地址和 127.0.0.1 的访问。 我在petergasser.com上找到了这个示例,并仅稍微更改了一下:

AuthName "bla"  
AuthType Basic  
<Limit GET POST>  
order deny,allow  
deny from all 
allow from 127.0.0.1
allow from <your-ip-here>
</Limit>  

很奇怪...我得到了禁止访问的错误,也许是Docker出了问题?IP地址不同了吗? - Marcelo Agimóvel
1
只要Apache和发出请求的应用程序在同一主机上,就不应该有任何区别。当然,您必须确保Apache正在侦听相关的IP地址。 - h00ligan
我相信Docker正在使用类似于172.18.0.3的其他IP地址,但它无法正常工作。但是,如果我在“允许来自”中使用我的LAN地址,它可以正常工作。 - Marcelo Agimóvel
1
在这种情况下,您实际上并没有从本地主机连接,因为Docker容器是自己的主机。 - h00ligan
谢谢,我相信我通过在CodeIgniter中使用CSRF令牌得到了解决方案,您认为我还需要我们正在讨论的这个改进吗? - Marcelo Agimóvel
1
不,如果您像slash197所建议的那样使用令牌或API密钥,则不需要此解决方案。实际上,我会说令牌或API密钥是更好的解决方案。 - h00ligan

3

使用密钥(类似于API密钥)将请求发送到服务器。然后在您的服务器上检查该密钥,如果是正确的,则返回数据。


为什么这会比Mike或h00ligan的解决方案更有优势? - Alex
只有在根据调用来源返回不同数据的情况下,才不能与其他解决方案相比获得优势。 - slash197
谢谢@slash197,但我现在打算坚持上面提到的解决方案。不过,你有什么好的文章可以让我了解一下你的解决方案吗? - Alex
在某些情况下,这可能是更好的解决方案,例如您不使用Apache(我的解决方案仅适用于Apache),或者您想要启用其他计算机的访问权限,但不想列出所有IP地址或地址是动态的。 - h00ligan

3
我使用的是这种方式,感谢 @gorelative
if( 
isset($_SERVER['REMOTE_ADDR']) AND ( $_SERVER['REMOTE_ADDR'] !== $_SERVER['SERVER_ADDR'] )
){
 die(' Access Denied, Your IP: ' . $_SERVER['REMOTE_ADDR'] );
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接