這篇文章主要介紹“在Linux下怎么通過WEB認證方式上網”,在日常操作中,相信很多人在在Linux下怎么通過WEB認證方式上網問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”在Linux下怎么通過WEB認證方式上網”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
成都做網站、成都網站建設、成都外貿網站建設服務團隊是一支充滿著熱情的團隊,執(zhí)著、敏銳、追求更好,是創(chuàng)新互聯的標準與要求,同時竭誠為客戶提供服務是我們的理念。創(chuàng)新互聯建站把每個網站當做一個產品來開發(fā),精雕細琢,追求一名工匠心中的細致,我們更用心!
摘要
通過分析 windoze 下 Web 認證過程,提出在 Linux 中用*腳本*實現通過 Web 認證方式上網的方法
問題由來
近來,隨著寬帶入戶,越來越多的 ISP 采用 Web 認證這種接入認證技術。Web 認證從用戶的角度看,是指用戶在瀏覽器中通過 Web 頁面輸入用戶名和密碼的認證過程。多數 ISP 號稱無需客戶端軟件,實際情況卻是:Windoze 下用戶可以順利通過 Web 認證上網,但 Linux 用戶卻沒有這么幸運。
分析原因
什么原因呢?解決問題還需從分析認證頁面入手,下面的分析主要針對我這里的情況。在 Mozilla 中打開認證頁面后,沒有顯示任何內容。仔細分析認證頁面,發(fā)現認證頁面采用 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 是不支持的,實際上 Mozilla 對標準 JavaScripts 的支持比 IE 好。所以,這些有 IE 特點的認證頁面 Mozilla 等瀏覽器自然無法通過了。
從用戶瀏覽器的角度看,Web 認證除了通過 Web 頁面輸入用戶名和密碼外,還需要通過 http 協(xié)議傳送客戶由 DHCP 獲得的 IP。有些 ISP 在用戶登錄到認證頁面時,由瀏覽器自動下載 .cab 文件,然后執(zhí)行該文件獲得用戶的 IP,再傳給 Web Server。還有些 ISP 在用戶通過認證后,會在客戶端彈出一個計時窗,定時向 ISP 發(fā)送 keep-alive 包。當然,Web 認證是一個比較新的方式,還沒有形成標準,所以各提供商的方法也不盡相同,所謂各村有各村的高招,你那里的方法就很有可能與我的不同,但道理應該是一樣的。根據以上的分析,可以看出 Linux 用戶自然不可能用非 IE 兼容的瀏覽器直接通過登錄 Web 認證界面上網啦。
解決方法
好了,問題就在這些 Web 頁面使用 IE 方言的 JavaScripts 上,有幾種解決方法:
1。使用 Linux 下 IE 兼容的瀏覽器,有嗎?誰知道請告訴我。
2。使用 wine + IE 的方法,有成功的嗎?大家共同分享。
3。如果將這些鳥語改為普通話,我們就可以用 Mozilla 等非 IE 瀏覽器通過 Web 認證方式上網了。
4。要求 ISP 提供支持 W3C 標準的認證頁面。
5。分析 web 認證的原理,編寫認證程序。
最理想的方法四,可是我等不急,也不一定能等到,也許你比我幸運。我采取第三種方法,對于方法三,你一定會問:認證頁面在 Web Server 上,我無權修改,行不通。確實如此,這里有個變通的辦法:下載認證頁面,按照 JavaScripts 標準修改并保存在本地,每次上網前用本地經過修改的 Web 認證頁面而非 Web Server 的認證頁面就可以了。具體修改方法,參照 http://www.stopbadtherapy.com/standards.shtml 中的對照表,找出認證頁面使用 IE 方言的 JavaScritps,根據對照表提供的修改建議對你的認證頁面作出相應修改。對于使用.cab 的認證頁面,情況就比較復雜。需要分析這個.cab 在你的 JavaScripts 中的用法,判斷它的功能,我這里是用它獲得本地 IP。所以,我在本地執(zhí)行腳本獲得 IP 來模擬這個功能。似乎.cab 多與 IP 有關。
一個例子
* 以我這里為例,我的使用環(huán)境:
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)源碼,發(fā)現這兩段 javascript:
代碼如下:
id="PortalClient"
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認證服務器地址/queryPort.jsp?ip=你當前的IP
登錄頁面出來后,和 IE 中的操作過程完全一樣。
* 當然你可以把這些步驟寫成一個腳本,以后簡單執(zhí)行腳本就可以了。
代碼如下:
#!/bin/bash
dhcpcd eth2
phoenix http://61.61.61.61/queryPort.jsp?ip=`ifconfig eth2 grep inet sed 's/^ *//' sed 's/ /:/g' cut -f3 -d:` &
說明:
eth2 是與 ADSL 聯的網卡名,根據你的實際情況填寫。
61.61.61.61 是我這 ISP 的認證地址。
后面一段是獲得 eth2 的 ip 地址。
注意!一定要用非 IE 瀏覽器獲得調試認證頁面,因為 IE 可以執(zhí)行認證頁面的 JavaScripts,有些認證過程實際上是執(zhí)行多個頁面完成的,IE 最后停留的頁面不一定是起始的認證頁面,你有可能漏掉前面的重要信息,我這里就是這種情況。
另外一種方法
如果你對方法 3 不滿意,可以用方法 5,繼續(xù)分析 web 認證的原理,編寫自己的認證程序。其實搞清原理后,實現的方法更簡單,更靈活,而且在 ISP 要求客戶端定時發(fā)送 keep-alive 包的情況下,也只能采取這種方法。我是這樣做的:
1。用網絡分析軟件(如:ethereal),抓取正常認證過程的通訊包;
在 windoze 下,用 ethereal 抓包。注意抓包時,除了 IE 不要啟動其它產生網絡通訊的程序,以免產生干擾數據;保存這些通訊包。
2。分析所抓包的內容;
只要看一眼 web 認證過程產生的通訊包,你就明白我為什么說這種方法更簡單了。簡單講,web 認證方式實際是客戶端用 http 協(xié)議向 ISP 發(fā)送用戶名、密碼和 IP 等內容的過程??蛻舳俗x取認證頁面;將填寫好認證頁面表格發(fā)送到 ISP 的認證服務器。過程就這么簡單。
3。編寫生成這些包的程序;
用任意一個支持 http 協(xié)議的語言或工具,編寫向認證服務器 POST 認證頁面中 form 的程序即可,甚至讀取認證頁面都不需要。我用 curl 和 python 各做了一個。如果你略微了解 http 協(xié)議,只要找到認證頁面中向服務器 POST 用戶名、密碼等數據的 form,然后轉換為你采用語言的語法格式就可以了,根本不需要分析認證頁面中繁雜的 Javascripts。對計時窗發(fā)出的 keep-alive 包也采用同樣的方法。
例子:
* 認證頁面中的
代碼如下: