当我们在连接一些公共场所的Wifi时,会发现这些Wifi都是不需要密码的,秒连接,但是网络一般不可用,需要二次弹出页面然后进行连接!
一般是接入公共网络,弹出认证页面,根据规则认证,最后连通网络。
其实原理非常简单,这个是手机支持的,就拿Iphone来说,在Iphone接入Wifi时会自动访问网站,来确认当前网络是否通顺,iphone会随机访问下列网站:
不过最优先的访问网站是: http://www.apple.com/library/test/success.html
当访问网站时,网站返回:Success字段
完整Html内容如下:
Success
Success
标题以及body体都是Success 经过测试,只要Title标签内容为Success 那么Iphone就会自动觉得网络是通顺的!
注意大小写是要区分的!
其次访问时第一次使用的是http1.0协议,短连接的形式,连接一次后断开,得到想要的内容。如果返回的不是想要的内容,不是Success则会弹出一个类似浏览器页面的窗口去显示返回的内容,其后端连接指向访问的地址!
其除此之外响应码不可以是200 必须是非200的响应码,可以使用302这样的重定向响应码!
当收到非200的响应码时ios会认为存在Captive Portal(无线认证)状态!
Captive Portal则为
如Iphone在接入免费WIFI时,访问的是http://www.apple.com/library/test/success.html 这个网站,这个网站的后台服务器地址是192.0.0.1 但是你本地拦截了这个访问,让它转向了你的本地服务器上去了,那么Iphone在与这个网站访问的所有过程都由你的服务器支配,进行交互,所以你需要一个支持Http1.0 和1.1协议的服务器。
因为iphone接入wifi测试wifi是否通顺的时,使用的是你的路由器访问的这个网站,当你在后台配置路由web重定向后,虽然iphone发送出去的包访问的是这个网站,但是路由器拦截后会转入你重定向的网站中。
那么在这个网站里,你可以编写一系列认证流程的前端代码,当认证成功后,给iphone返回一个http 200的响应码内容是success那么iphone就会认为网络连接通顺,则正常使用wifi连接,就不会在访问http://www.apple.com/library/test/success.html 这个网站了。
但是这就遇到了一个问题,那就是接入免费wifi后,我们后台只重定向了上面的这些网站,其它网站没有重定向,用户要是趁机访问起它网站怎么办?
答: 其实这个完全不用担心,因为这和ios内核有关,ios在做校验的时候,如果在还没有收到success这个http 200 响应码时是绝对不会让用户使用无线网络的,因为在收到success之前,ios除了不会让用户去主动使用wifi资源外,也不会在右上角弹出wifi图标。
如果用户在还未完成认证时退出,ios会自动断开与wifi的隐式连接,也就是断开连接!
这个和ios机制有关,所以我们只需要知道,ios在收到success之前绝对不会让用户使用wifi功能的,更别说访问其他网站了!
同时ios把这种机制叫做:Captive Network Assistant(CNA)
GET /library/test/success.html HTTP/1.0
Host: www.apple.com
User-Agent:CaptiveNetworkSupport/1.0 wispr
Connection: close
这个是路由抓包获取到的,其实可以从Host或User-Agent来判断是ios还是安卓,因为安卓的校验方式和ios不同的!
当收到Http 1.0 200 或Http 1.1 200的响应状态码时且titile标签里的字段为Success则判定网络通顺,允许用户使用Wifi模块!
如何设置Wifi重定向呢?
你需要一个支持URL重定向的路由器:
一般情况下路由器的后台里有高级设置,高级设置里有URL重定向,或转发等功能,想要具体了解可以去WEB搜索一下!
安卓认证:
安卓其实和IOS认证流程一样,但是由于安卓是开源的,国内厂商太多了,而且默认的内核里使用的是:http://connectivitycheck.gstatic.com/generate_204 或:https://www.google.com/generate_204
这样的网站是国外的dns受到限制无法访问,国内的其他使用安卓内核的手机没有去了解,有兴趣可以去抓包看看,路由器抓包博主会在后面写教程出来!
其返回需要HTTP 204响应码,内容给空就行了!
否则则认为需要登录
系统支持:ios3.0以上 安卓4.0以上!
而且安卓内核被修改的严重,安卓认证时返回的可能不是success也可能需要的是其它字段!
但是国内厂商较为好沟通,可以联系开发商协调,或者到开发者论坛询问流程即可!
打开网站认证:
还有一种方式,就是打开网站才能认证,默认是不弹出来的。
其原理是把路由全部转发到本地的一个web服务器上,然后在web服务器上写过滤代码,但是非常复杂,且效率低下,因为每一次的访问都要经过web服务器校验,然后转发给真正的访问地址!
其也有开源项目如:wifi dog ,但是这些项目只包含认证,不包括路由转发,如果想实现路由转发还是需要路由器支持,但是也可以刷固件,但是这样的方法就较为复杂了,如果有兴趣可以web搜索一下!