LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 894|回复: 0

如何在 Linux 下通过 WEB 认证方式上网(草稿)

[复制链接]
发表于 2003-5-19 22:41:02 | 显示全部楼层 |阅读模式
如何在 Linux 下通过 WEB 认证方式上网(草稿)

作者:zest zhousun@hotmail.com
  v0.1  2003年05月19日

摘要
在 Linux 下通过 WEB 认证方式上网的实现方法

问题由来
    近来,随着宽带入户,越来越多的 ISP 采用 WEB 认证这种接入认证技术。Web 认证是指通过 Web 页面输入用户名和密码的认证过程(Web 认证方式的一些解释见 http://www.huawei.com.cn/news/tech/169/1209.shtml)。多数 ISP 号称无需客户端软件,实际情况却是:Window$ 下用户可以顺利通过 Web 认证上网,但 Linux 用户却没有这么幸运。

分析原因
    什么原因呢?解决问题还需从分析认证页面入手,下面的分析主要针对我这里的情况,(希望大家多多提供自己的情况,共同充实本文档)。在 Mozilla 中打开认证页面后,没有显示任何内容。仔细分析认证页面,发现认证页面采用 JavaScripts 编写,并且是针对 IE 编制的。IE 并未完全按照标准使用 JavaScripts。IE 对 JavaScripts 做了一些扩充,主要有以下几项:
* .cab files for download of binaries;
* document.all;
* element.innerHTML;
...
详情请参阅 http://www.stopbadtherapy.com/standards.shtml
    IE 对 JavaScripts 的这些扩充,Mozilla 是不支持的,所以,这些有 IE 特点的认证页面 Mozilla 等浏览器自然无法通过了。实际上 Mozilla 对标准 JavaScripts 的支持比 IE 好。
    从用户浏览器这个角度看,Web 认证除了通过 Web 页面输入用户名和密码外,还需要通过 http 协议传送客户由 DHCP 获得的 IP。有些 ISP 在用户登录到认证页面时,由浏览器自动下载 .cab 文件,然后执行该文件获得用户的 IP,再传给 Web Server。当然,Web 认证是一个比较新的方式,还没有形成标准,所以各提供商的方法也不尽相同,所谓各村有各村的高招,你那里的方法就很有可能与我的不同,但道理应该是一样的。根据以上的分析,可以看出 Linux 用户不可能用非 IE 兼容的浏览器直接通过登录 Web 认证界面上网。

解决方法
    好了,问题就在这些 Web 页面使用 IE 方言的 JavaScripts 上,有几种解决方法:
1。使用 Linux 下 IE 兼容的浏览器,有吗?谁知道请告诉我。
2。使用 wine + IE 的方法,有成功的吗?Show 给大家共同分享嘛。
3。如果将这些鸟语改为普通话,我们就可以用 Mozilla 等非 IE 浏览器通过 Web 认证方式上网了。
4。要求 ISP 提供支持 W3C 标准的认证页面。
    最理想的是方法四,可是我等不急,也不一定能等到,也许你比我幸运。我采取第三种方法,对于方法三,你一定会问:认证页面在 Web Server 上,我无权修改,行不通。确实如此,这里有个变通的办法:下载认证页面,按照 JavaScripts 标准修改并保存在本地,每次上网前用本地经过修改的 Web 认证页面而非 Web Server 的认证页面就可以了。具体修改方法,参照 http://www.stopbadtherapy.com/standards.shtml 中的对照表,找出认证页面使用 IE 方言的 JavaScritps,根据对照表提供的修改建议对你的认证页面作出相应修改。对于使用.cab 的认证页面,情况就比较复杂。需要分析这个.cab 在你的 JavaScripts 中的用法,判断它的功能,我这里是用它获得本地 IP。所以,我在本地执行脚本获得 IP 来模拟这个功能。似乎.cab 多与 IP 地址有关。

一个例子
* 以我这里为例,我的使用环境:
ISP:西安铁通 ADSL
认证方式:Web 认证
ISP 的接入服务器:华为 Quidway MA5200E/F (具体型号不能完全确定)
Linux:GENTOO 1.4 rc-3
Browser: Mozilla 1.4a/Phoenix 0.5

* 在 Linux 下用 mozilla (一定要用非 IE 浏览器获得认证页面,这话有点多余,但有的用户是在 Window$ 下调试的),访问 ISP 的 WEB 认证页面时,浏览器中没有显示任何内容,根本无法输入帐号和密码,更谈不上通过认证。这难不倒咱 linuxer, 查看认证页面(/index.jsp)源码,发现这两段 javascript:

  id="ortalClient"
  codebase=http://61.61.61.61:80/PortalAX.cab#version=1,0,1,8
...
  var clientIp = PortalClient.localIP;
  var languagetype = 0;
  if ((clientIp=="")||(clientIp==null))  {
       window.parent.location.href="/ipError.jsp";
  } else {
       window.parent.location.href="/queryPort.jsp?ip="+clientIp+"&newbl="+languagetype;
  }

  可以看出它用 PortalClient 获得本地的 IP,如果成功,转到 http://你的WEB认证页面/queryPort.jsp?ip=你当前的IP 。而 Mozilla 不支持它获取 IP (PortalClient,是针对IE的,唉,这个程序编得太短视),看来问题出在这里。既然如此,我们可以手工加上自己的 IP(这个 IP 是与 ADSL 相联的网卡从 ISP 的 DHCP 服务器获得的地址)。在 Mozilla 地址栏中输入:

  http://61.61.61.61/queryPort.jsp?ip=192.168.0.2
--------^^^^^^^^^^^------------------^^^^^^^^^^^
--------你的ISP认证服务器 ------------- 你当前的IP

  嗒嗒,登录页面出来啦!
  赶快输入帐号,密码,按登录按钮(期待中。。。)。
  viva!!!
  ISP 的首页终于被揪出来啦,在终端中 ping www.gnu.org ,ping 通,没问题。

* 至此,在 Linux 下 web 认证方式已经完成。方法很简单,每次上网时,在 mozilla 的地址栏中输入:
  http://你的ISP认证服务器 ... p?ip=你当前的IP
  登录页面出来后,和 IE 中的操作过程完全一样。

* 当然你可以把这些步骤写成一个脚本,以后简单执行脚本就可以了。这是脚本内容:
#!/bin/bash
dhcpcd eth1
phoenix http://61.61.61.61/queryPort.jsp?ip=`ifconfig eth1|grep inet|sed 's/^ *//'|sed 's/ /:/g'|cut -f3 -d:` &

说明:
eth1 是与 ADSL 联的网卡名,根据你的实际情况填写。
61.61.61.61 是我这 ISP 的认证地址。
后面一段是获得 eth1 的 ip 地址。
注意!一定要用非 IE 浏览器获得调试认证页面,因为 IE 可以执行认证页面的 JavaScripts,有些认证过程实际上是执行多个页面完成的,IE 最后停留的页面不一定是起始的认证页面,你有可能漏掉前面的重要信息,我这里就是这种情况。

更多成功的例子:
* whz81 朋友
  南京电信
  http://linuxsir.cn/forum.php?mod=viewthread&tid=39727
* zest 就是我
  西安铁通
  http://linuxsir.cn/forum.php?mod=viewthread&tid=36142
* 你的位置
  欢迎你与大家共同分享你的成功经验

相关的链接:
* Web 认证方式的一些解释 http://www.huawei.com.cn/news/tech/169/1209.shtml
* 从特有的 DOMs 和 Markup 转移到 W3C 标准。http://www.stopbadtherapy.com/standards.shtml

后记
    这篇小文是我在解决 Linux 下 Web 认证方式上网问题时的一些文字总结。由于本人的能力有限以及环境的限制,文中的内容肯定相当粗浅,会存在一些错误,希望各位批评指正;同时,也热切希望你的积极参与,分享你在这方面的成功经验,共同充实这篇文字,为中文自由软件世界尽一份力。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表