iT邦幫忙

0

網站以客戶端IP位址做為登入授權依據,如何實作?

像下列這個網站,他可以用客戶端的IP,來斷定客戶端是否來自特定擁有大量授權的團體機關,同時提供直接以帳號密碼來登入使用網站相關內容:
http://www.lawdata.com.tw

我Google了許多關鍵字,但似乎找不到相關的文獻,都是一些文不對題的搜尋結果。想請問各位網友先進,這是運用什麼特定的技術達到的?還是單純抓使用者所用的IP在後端進行比對?不會有假IP的問題嗎?
謝謝各位~

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

4
逮丸逮丸
iT邦大師 1 級 ‧ 2011-08-12 10:30:17
最佳解答

該站用的 CGI 的基礎是 漢珍數位圖書 所開發的,
這種模式:
先定義所屬機構的IP為何,
在這範圍內免帳密,
其他範圍則導到需要帳密授權的畫面。

是大多資料庫內容供應商,
賣給客戶使用權的普遍模式。

wiseguy 所提的幾個方案,
要看管理或開發者是擅於 系統管理 或 程式開發,
方案一是前者,方案二是後者,
方案三是兩種人才都有,或者兩者都擅長。

在此以 Ruby on Rails 的語法來模擬簡單的可能實作,
邏輯還算蠻簡單,ruby 的語法也很容易看懂,
用其他程式語言改寫很容易:

<pre class="c" name="code"># 允許IP的陣列,更理想的是能以 CIDR 或用IP範圍的方式來表示
# 在此以列舉IP的方式方便建置說明
ALLOWED = ['1.2.3.4','2.3.4.5']

def index
  # 如果此 session 已授權過,導到已授權頁面
  if is_session_valid?
    redirect_to "已授權頁面"
	return
  end
  # 未授權過的session,則檢查來query本頁面的 IP 為何
  comming_ip = request.env['REMOTE_ADDR']
  # 看此 IP 是否為允許範圍內
  if ALLOWED.include? comming_ip
    #在此 session 標上已授權記號
    make_session_valid
    redirect_to "已授權頁面"
  else
    redirect_to "填帳密之表單"
  end
end

def 已受權頁面
  # 若此session無 已授權 標示,導回首頁
  unless is_session_valid?
    redirect_to "index"
	return
  end
  
  # 執行秀出已授權可看的畫面內容
end
# 其他帳密通過者,也使session標示已授權,就不需說明了

如果您網站程式,是自行開發的,
上面的邏輯是很容易寫出的,
就不需動到 web server 的設定。

如果您網站程式,是請外人開發的話,
而想動 web server 設定的話,
就要搞定 web server 也能用 網頁程式 所依靠的帳號密碼來源。

8
wiseguy
iT邦超人 1 級 ‧ 2011-08-12 00:44:29

方案一:
只使用 apache 來控管,需要用到
mod_auth_basic.so ### 啟用帳號密碼認證
mod_authn_default.so ### 認證預設原則
mod_authz_default.so ### 授權預設原則
mod_authn_file.so ### 使用 htpasswd 來建立帳號密碼提供認證
mod_authz_host.so ### 設定什麼 IP 可以存取
mod_authz_user.so ### 設定什麼帳號可以存取

方案二:
只使用 server side script (如 asp, php, jsp, RoR, cgi ...) 來處理
用個資料庫把IP跟帳密做關連就行了,登入時同時判斷帳密跟IP,樓主舉的網站應該就是這類型的。

方案三:
混合方案一跟方案二,可以在 apache 先擋掉 IP 之後再給合法 user 登入的頁面。

我要發表回答

立即登入回答