📄 95.html
字号:
<form action="http://www.linuxhero.com/docs/search.html" method=get>
<table
style="BORDER-RIGHT: #c4c4c4 1px solid; BORDER-TOP: #c4c4c4 1px solid; BORDER-LEFT: #c4c4c4 1px solid; BORDER-BOTTOM: #c4c4c4 1px solid"
cellspacing=0 cellpadding=3 width="95%" border=0 align="center">
<tbody>
<tr>
<td noWrap background="images/bgline.gif" tppabs="http://www.linuxhero.com/docs/images/bgline.gif">
<div align=center><font class=normalfont>搜索文章:
<input type=hidden value=result name=action2>
<input type=radio checked value=title name=type>标题
<input type=radio value=content name=type>内容
<input type=image src="images/button_go.gif" tppabs="http://www.linuxhero.com/docs/images/button_go.gif" border=0 name=image2>
</font></div>
</td>
</tr>
<tr>
<td noWrap>
<div align="center">
<input maxlength=100 size=30 name=keyword2>
</div>
</td>
</tr></tbody>
</table>
</form>
</TD>
<TD rowSpan=2><IMG src="images/header_r1_c7.gif" tppabs="http://www.linuxhero.com/docs/images/header_r1_c7.gif" width=26 border=0 name=header_r1_c7></TD>
<TD><IMG height=83 src="images/spacer.gif" tppabs="http://www.linuxhero.com/docs/images/spacer.gif" width=1 border=0></TD></TR>
<TR>
<TD background="images/bgline.gif" tppabs="http://www.linuxhero.com/docs/images/bgline.gif"><IMG height=22
src="images/header_r2_c1.gif" tppabs="http://www.linuxhero.com/docs/images/header_r2_c1.gif" width=296 border=0
name=header_r2_c1></TD>
<TD background="images/bgline.gif" tppabs="http://www.linuxhero.com/docs/images/bgline.gif" colSpan=5>
<DIV align=right><FONT class=normalfont>当前位置:
<A href="index.html" tppabs="http://www.linuxhero.com/docs/index.html">本站首页</A>
<font color="#FF6699">>></font>
<A href="type2.html" tppabs="http://www.linuxhero.com/docs/type2.html">基础知识</A> | <A href="copyright.html" tppabs="http://www.linuxhero.com/docs/copyright.html">版权说明</A></font></DIV>
</TD>
<TD><IMG height=22 src="images/spacer.gif" tppabs="http://www.linuxhero.com/docs/images/spacer.gif" width=1
border=0></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=10 cellPadding=0 width="100%" bgColor=#ffffff
border=0>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=3 width="100%" border=0>
<TR>
<TD vAlign=top align=middle width="60%">
<TABLE cellSpacing=0 cellPadding=0 width="100%"
background="images/back.gif" tppabs="http://www.linuxhero.com/docs/images/back.gif" border=0>
<TBODY>
<TR>
<TD vAlign=top width="80%">
<DIV align=center>
<FORM action="search.html" tppabs="http://www.linuxhero.com/docs/search.html" method=get>
</FORM>
<TABLE cellSpacing=0 cellPadding=0 width="95%"
border=0><TBODY>
<TR>
<TD background="images/bgi.gif" tppabs="http://www.linuxhero.com/docs/images/bgi.gif"
height=30></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=3 width="95%"
align=center border=0>
<TBODY>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=3 width="100%"
border=0>
<TBODY>
<TR>
<TD vAlign=top>
<p><FONT class=normalfont><B><font color=blue>如何在Linux下通过WEB认证方式上网</font></B></FONT><BR><FONT class=smallfont color=#ff9900>2004-04-23 15:18 pm</FONT><BR><FONT class=normalfont>作者:zest<br>来自:Linux知识宝库<br>联系方式:无名<br><br>通过分析 windoze 下 Web 认证过程,提出在 Linux 中用*脚本*实现通过 Web 认证方式上网的方法<br>
<br>
问题由来<br>
<br>
近来,随着宽带入户,越来越多的 ISP 采用 Web 认证这种接入认证技术。Web 认证从用户的角度看,是指用户在浏览器中通过 Web 页面输入用户名和密码的认证过程。多数 ISP 号称无需客户端软件,实际情况却是:Windoze 下用户可以顺利通过 Web 认证上网,但 Linux 用户却没有这么幸运。<br>
<br>
分析原因<br>
什么原因呢?解决问题还需从分析认证页面入手,下面的分析主要针对我这里的情况。在 Mozilla 中打开认证页面后,没有显示任何内容。仔细分析认证页面,发现认证页面采用 JavaScripts 编写,并且是针对 IE 编制的。IE 并未完全按照标准使用 JavaScripts。IE 对 JavaScripts 做了一些扩充,主要有以下几项:<br>
<br>
* .cab files for download of binaries;<br>
* document.all;<br>
* element.innerHTML;<br>
...<br>
详情请参阅 http://www.stopbadtherapy.com/standards.shtml<br /> IE 对 JavaScripts 的这些扩充,Mozilla 是不支持的,实际上 Mozilla 对标准 JavaScripts 的支持比 IE 好。所以,这些有 IE 特点的认证页面 Mozilla 等浏览器自然无法通过了。<br>
<br>
从用户浏览器的角度看,Web 认证除了通过 Web 页面输入用户名和密码外,还需要通过 http 协议传送客户由 DHCP 获得的 IP。有些 ISP 在用户登录到认证页面时,由浏览器自动下载 .cab 文件,然后执行该文件获得用户的 IP,再传给 Web Server。还有些 ISP 在用户通过认证后,会在客户端弹出一个计时窗,定时向 ISP 发送 keep-alive 包。当然,Web 认证是一个比较新的方式,还没有形成标准,所以各提供商的方法也不尽相同,所谓各村有各村的高招,你那里的方法就很有可能与我的不同,但道理应该是一样的。根据以上的分析,可以看出 Linux 用户自然不可能用非 IE 兼容的浏览器直接通过登录 Web 认证界面上网啦。<br>
<br>
解决方法<br>
好了,问题就在这些 Web 页面使用 IE 方言的 JavaScripts 上,有几种解决方法:<br>
1。使用 Linux 下 IE 兼容的浏览器,有吗?谁知道请告诉我。<br>
2。使用 wine + IE 的方法,有成功的吗?大家共同分享。<br>
3。如果将这些鸟语改为普通话,我们就可以用 Mozilla 等非 IE 浏览器通过 Web 认证方式上网了。<br>
4。要求 ISP 提供支持 W3C 标准的认证页面。<br>
5。分析 web 认证的原理,编写认证程序。<br>
<br>
最理想的方法四,可是我等不急,也不一定能等到,也许你比我幸运。我采取第三种方法,对于方法三,你一定会问:认证页面在 Web Server 上,我无权修改,行不通。确实如此,这里有个变通的办法:下载认证页面,按照 JavaScripts 标准修改并保存在本地,每次上网前用本地经过修改的 Web 认证页面而非 Web Server 的认证页面就可以了。具体修改方法,参照 http://www.stopbadtherapy.com/standards.shtml 中的对照表,找出认证页面使用 IE 方言的 JavaScritps,根据对照表提供的修改建议对你的认证页面作出相应修改。对于使用.cab 的认证页面,情况就比较复杂。需要分析这个.cab 在你的 JavaScripts 中的用法,判断它的功能,我这里是用它获得本地 IP。所以,我在本地执行脚本获得 IP 来模拟这个功能。似乎.cab 多与 IP 有关。<br>
<br>
一个例子<br>
* 以我这里为例,我的使用环境:<br>
ISP:铁通 ADSL<br>
认证方式:Web 认证<br>
ISP 的接入服务器:华为 Quidway MA5200E/F (具体型号不能完全确定)<br>
Linux:GENTOO 1.4 rc-3<br>
Browser: Mozilla 1.4a/Phoenix 0.5<br>
<br>
* 在 Linux 下用 mozilla (一定要用非 IE 浏览器获得认证页面,这话有点多余,但有的用户是在 Window$ 下调试的),访问 ISP 的 WEB 认证页面时,浏览器中没有显示任何内容,根本无法输入帐号和密码,更谈不上通过认证。这难不倒咱 linuxer, 查看认证页面(/index.jsp)源码,发现这两段 javascript:<br>
<br>
id="PortalClient"<br>
codebase=http://61.61.61.61:80/PortalAX.cab#version=1,0,1,8<br>
...<br>
var clientIp = PortalClient.localIP;<br>
var languagetype = 0;<br>
if ((clientIp=="")||(clientIp==null)) {<br>
window.parent.location.href="/ipError.jsp";<br>
} else {<br>
window.parent.location.href="/queryPort.jsp?ip="+clientIp+"&newbl="+languagetype;<br>
}<br>
<br>
可以看出它用 PortalClient 获得本地的 IP,如果成功,转到 http://你的WEB认证页面/queryPort.jsp?ip=你当前的IP 。而 Mozilla 不支持它获取 IP (PortalClient,是针对IE的,唉,这个程序编得太短视),看来问题出在这里。既然如此,我们可以手工加上自己的 IP(这个 IP 是与 ADSL 相联的网卡从 ISP 的 DHCP 服务器获得的地址)。在 Mozilla 地址栏中输入:<br>
<br>
http://61.61.61.61/queryPort.jsp?ip=192.168.0.2<br>
--------^^^^^^^^^^^------------------^^^^^^^^^^^<br>
--------你的ISP认证服务器 ------------- 你当前的IP<br>
<br>
嗒嗒,登录页面出来啦!<br>
赶快输入帐号,密码,按登录按钮(期待中。。。)。<br>
viva!!!<br>
ISP 的首页终于被揪出来啦,在终端中 ping www.gnu.org ,ping 通,没问题。<br>
<br>
* 至此,在 Linux 下 web 认证方式已经完成。方法很简单,每次上网时,在 mozilla 的地址栏中输入:<br>
http://你的ISP认证服务器地址/queryPort.jsp?ip=你当前的IP<br /> 登录页面出来后,和 IE 中的操作过程完全一样。<br>
<br>
* 当然你可以把这些步骤写成一个脚本,以后简单执行脚本就可以了。<br>
#!/bin/bash<br>
dhcpcd eth1<br>
phoenix http://61.61.61.61/queryPort.jsp?ip=`ifconfig eth1|grep inet|sed 's/^ *//'|sed 's/ /:/g'|cut -f3 -d:` &<br>
<br>
说明:<br>
eth1 是与 ADSL 联的网卡名,根据你的实际情况填写。<br>
61.61.61.61 是我这 ISP 的认证地址。<br>
后面一段是获得 eth1 的 ip 地址。<br>
注意!一定要用非 IE 浏览器获得调试认证页面,因为 IE 可以执行认证页面的 JavaScripts,有些认证过程实际上是执行多个页面完成的,IE 最后停留的页面不一定是起始的认证页面,你有可能漏掉前面的重要信息,我这里就是这种情况。<br>
<br>
另外一种方法<br>
如果你对方法 3 不满意,可以用方法 5,继续分析 web 认证的原理,编写自己的认证程序。其实搞清原理后,实现的方法更简单,更灵活,而且在 ISP 要求客户端定时发送 keep-alive 包的情况下,也只能采取这种方法。我是这样做的:<br>
<br>
1。用网络分析软件(如:ethereal),抓取正常认证过程的通讯包;<br>
在 windoze 下,用 ethereal 抓包。注意抓包时,除了 IE 不要启动其它产生网络通讯的程序,以免产生干扰数据;保存这些通讯包。<br>
<br>
2。分析所抓包的内容;<br>
只要看一眼 web 认证过程产生的通讯包,你就明白我为什么说这种方法更简单了。简单讲,web 认证方式实际是客户端用 http 协议向 ISP 发送用户名、密码和 IP 等内容的过程。客户端读取认证页面;将填写好认证页面表格发送到 ISP 的认证服务器。过程就这么简单。<br>
<br>
3。编写生成这些包的程序;<br>
用任意一个支持 http 协议的语言或工具,编写向认证服务器 POST 认证页面中 form 的程序即可,甚至读取认证页面都不需要。我用 curl 和 python 各做了一个。如果你略微了解 http 协议,只要找到认证页面中向服务器 POST 用户名、密码等数据的 form,然后转换为你采用语言的语法格式就可以了,根本不需要分析认证页面中繁杂的 Javascripts。对计时窗发出的 keep-alive 包也采用同样的方法。<br>
<br>
例子:<br>
* 认证页面中的 form<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -