PHP IP检查作为安全性?

信息安全 验证 php 攻击
2021-09-06 18:43:06

只是想对我正在编写的 PHP 脚本进行一些输入。这只是一个只有我自己才能访问的简单脚本。我没有动态 IP 地址,所以这对我来说不是问题,但我想知道我的“安全”措施是否存在任何潜在问题。

目前我的脚本是这样设置的:

$uip = $_SERVER['REMOTE_ADDR'];
if ($uip == "my personal ip here")
 {
   echo "access granted";
 }

else
 {
   echo "access denied";
 }

这“安全”吗?或者知道我的 IP 的人是否很容易能够使用我的 IP 欺骗他们对 PHP 脚本的访问并欺骗脚本认为它是我的 IP?

有什么建议?我不想让事情过于复杂(例如登录页面),只想知道我的 KISS 解决方案是否可行或可能存在问题。

3个回答

这种设置的最大风险是跨站点请求伪造(CSRF)。例如,成像一个站点有一个 URL,如http://mysite.com/setTitle?title=Hello,它设置了站点的标题。您只希望管理员访问它,而不是其他任何人,并且您使用 IP 地址控制来强制执行此操作。现在想象一下,如果管理员正在浏览一些不相关的站点,并且其中包含一个链接到该 URL 的图像标签,例如http://mysite.com/setTitle?title=Evil管理员浏览器会尝试加载该链接。Web 服务器将看到来自授权 IP 地址的请求,并允许更改标题。不好!CSRF 的通常解决方法是向用户发出一个随机令牌,该令牌必须包含在请求中。

还有谁使用您的 IP 地址?大多数家庭设置都有许多人通过同一路由器访问互联网,因此使用相同的 IP 地址。您可能不希望这些其他人有权访问。

IP 地址欺骗的风险不是问题。TCP对此有合理的保护,可以阻止许多攻击。在某些情况下它仍然是可能的,但如果你只是追求简单的东西,我不会太担心。

不幸的是,我认为这不是一个非常安全的方法。原因有很多:

  1. 本地网络中的 NAT
  2. ISP 的 NAT(运营商级 NAT)
  3. 浏览器和 Web 服务器之间的任何位置的代理
  4. Web 服务器前面的负载均衡器

其中任何一种都可能导致多个设备访问您的页面以共享相同的 IP 地址。

如果您不熟悉:网络地址转换 (NAT)允许网络上的多个系统从同一个公共 IP 地址访问 Internet。这是必要的,因为访问 Internet 的系统远远多于可用的公共 IPv4 地址。

大多数家庭都运行一个为他们执行 NAT 的路由器,这意味着任何连接到 Internet 的系统(例如您的台式机、笔记本电脑、平板电脑、电话、电视)都将来自同一个 IP 地址。这也意味着这些系统中的任何一个都可以访问您的网页,并将通过身份验证。

它变得比那更糟。您的 ISP 可能正在运行运营商级 NAT (CGN) - 这意味着一大群家庭将与您共享 IP 地址。这意味着他们中的任何一个都可以访问您的网页,并将通过身份验证。

然后是代理。如果您的浏览器通过代理(例如由您的 ISP 托管的代理)发送流量,或者您的网站位于内容分发网络 (CDN)前面,那么您很可能会获得代理或 CDN 边缘节点的 IP 地址,而不是您计算机的 IP 地址。

最后,如果您的 Web 主机在您的 Web 服务器前面有一个负载均衡器,那么您最终可能会得到负载均衡器的 IP 地址。

出于所有这些原因,我绝对不会推荐一种仅依赖于访问您网页的用户的 IP 地址的登录机制。

如果您不想自己编写用于身份验证的代码,那么我建议您查看一些第三方库来执行此操作 - 但请确保在将代码实施到您的网页之前查看代码。

关于 IP 欺骗

其他人提到了 IP 欺骗的风险,这在理论上听起来很容易,但(即使是简化的形式)也需要两个不同的步骤:

  1. 更改 IP 数据报头中的 IP 地址
  2. 拦截来自服务器的响应以读取结果

第一点本身并不难。难点在于服务器会将响应发送到被欺骗的 IP,而不是攻击者的 IP。为了读取响应,攻击者因此需要拦截对用户的响应。这通常会非常困难。

你基本上回答了你自己的问题。不,如果它被用作唯一的安全措施是不安全的。

IP 是公共的,IP 可以被欺骗,因此人们可以通过欺骗您的 IP 轻松访问材料。

我确实建议将登录页面作为主要安全层。是一个网站,其中包含有关如何制作登录脚本的简单有效的教程。知道或至少理解这件事真的很好。