我正在为我的学校开发一个网络系统(它使用 PHP,但这并不重要)。
系统需要根据用户是否在学校网络上做出不同的行为(具体来说,如果他们不是在校内网络上,他们需要登录。
所以我需要一种可靠的、理想的万无一失的(这可能要求太多了……)方法来检查客户端是否在本地网络上。
似乎通常的做法是将用户的子网与服务器的子网进行比较。但是,我们学校有多个子网(包括多个校区,每个校区都有多个子网以及 VPN),其中只有一个是服务器的子网。所以这种方法行不通
我读RFC1918,为私有网络保留了以下IP空间:
10.*.*.*
172.16.*.* - 172.31.*.*
192.168.*.*
那么我是否可以只检查客户端 IP 是否在这些私有子网中?网络外的用户是否有可能拥有这样的 IP?或者连接到学校网络的用户不会拥有这些范围内的 IP?
答案1
如果您的学校在入口处过滤传入地址,那么使用 RFC 1918 地址空间作为“在 LAN 上”的标志可能没问题。坦率地说,使用 IP 地址作为某种隐式身份验证对我来说似乎有点不靠谱,但它会起作用。
如果您的学校没有在入口处过滤 RFC 1918 地址空间,那么理论上外部攻击者可能会将来自学校未使用的 RFC 1918 地址空间的数据包发送到您的服务器。这取决于学校的上游 ISP 如何过滤流量。
当有人从使用 RFC 1918 地址空间的 LAN 访问您的应用程序时,远程用户的边缘设备将把他们的源地址 NAT 为公共 IP,因此您将看不到来自互联网的 RFC 1918 流量(除非有人试图做一些狡猾的事情)。
答案2
这绝对行不通。当用户使用不同的私有网络时,他们很有可能会发现他们正在使用 RFC1918 范围。RFC 并没有说这些地址仅供您的学校私用。基本上每个没有公共 IP 可丢弃的组织(几乎所有组织)都在使用 RFC1918 地址作为端点。
最好的,也可能是唯一可靠的方法是拥有一个主机名,该主机名可以是以下任一或两者:
- 仅可由客户端正在使用的大学的 DNS 服务器解析。
- 仅可从您的网络内部访问。
这就是 Direct Access 中的 Microsoft NLA(网络位置感知)等功能的工作原理。如果您无法访问 privateserver.myuni.edu,则说明您处于公共网络中,需要通过大厅进入。
/edit Bah。我误解了这个问题。我没注意到这是一个 Web 系统,我以为请求者正在开发客户端软件组件。Evan 的回答是正确的答案。