设计之家 > 教程 > 網頁教程 > 其他教程 >

網頁設計中的安全漏洞三例

作者:未知 來源:ARTDESIGN 時間:2005-04-23
這個題目很奇怪,網頁設計還要考慮安全的嗎?安全不是系統管理員的事嗎?那你就錯了,系統管理員可以讓系統固于金湯,但是如果網頁程序有漏洞,最好的系統管理員也沒有辦法。下面就舉幾個常見的例子;

1、用戶驗證漏洞。

一般程序設計者將用戶名和密碼保存在數據庫中,驗證用戶合法性時,檢驗密碼和用戶名是否對應,以此判定用戶是否合法。

一個典型的用戶驗證頁面如下:

此頁源代碼如下:

〈html>
〈head>
〈meta http-equiv="Content-Language" content="zh-cn">  
〈meta http-equiv="Content-Type" content="text/html; charset=gb2312">  
〈meta name="GENERATOR" content="Microsoft FrontPage 4.0">  
〈meta name="ProgId" content="FrontPage.Editor.Document">  

〈/head>
〈body>
〈p align="center"> 〈/p> 

〈form method="POST" action="login.asp">
〈P align="center">
〈center>〈table border="1" width="53%" bordercolor="#C0C0C0"> 〈tr>
〈td width="100%" bgcolor="#C0C0C0" colspan="2">
〈p align="center">用戶登錄〈/td>〈/tr>〈tr>  
〈td width="25%" align="right">用戶名:〈/td>

〈td width="75%">〈input type="text" name="name" size="20">〈/td>  
〈/tr> 

〈tr> 〈td width="25%" align="right">密 碼:〈/td>

〈td width="75%">〈input type="password" name="passwd" size="20">〈/td>  
〈/tr>

〈/table>

〈/center>

〈/P>

〈p align="center">〈input type="submit" value="登 錄" name="B1">

〈input type="reset" value="重 寫" name="B2">〈/p>

〈/form>

〈p align="center"> 〈/p>

〈/body>

〈/html>


此頁面的數據用login.asp處理,其源代碼如下(以下程序有多處漏洞,請勿直接引用):
〈!--#include file="conn.inc"-->

〈%Response.Buffer=true%>

〈%

'取得帳號用戶

zhanghao=trim(request.form("name"))

mima=trim(request.form("passwd"))

'從數據庫中取得數據

mysql="select zhanghao,mima,danwei,lev from login where  
zhanghao='"&zhanghao&"' and mima='"&mima&"'"  
zhanghao='"&zhanghao&"' and mima='"&mima&"'"  
'如果沒有此記錄,跳到登錄錯誤頁面  
if rs.eof or rs.bof then  
response.redirect"loginerr.htm"
end if  
'如果有此記錄,順利登錄  
response.redirect"manage.asp"  
%>  
以上驗證方式有很大一部分程序員使用,但是,如果我們構造一個非常特殊的用戶名和密碼(這里不給出),語句:mysql="select zhanghao,mima,danwei,lev from login where zhanghao='"&zhanghao&"' and mima='"&mima&"'" 中的條件:where zhanghao='"&zhanghao&"' and mima='"&mima&"' 限制就會毫無用處,一直為真,這樣,非合法用戶也就直接進入了敏感區域。網上有很多這樣設計的驗證,筆者因為工作關系,發現太多有這種漏洞的驗證,甚至一些很有影響的大公司設計的程序也是如此。建議讀者檢查自己的程序有無這種漏洞,如果有,請用以下方法解決。
(1)修改程序,改變驗證方式;
將SQL語句改為:
select zhanghao,mima,danwei,lev from login where zhanghao='"&zhanghao&"'
然后執行,如果沒有此帳號,直接跳入錯誤頁面;如果有此帳號,將此帳號對應密碼和用戶提交密碼比較:

if rs("mima")=trim(passwd) then
response.redirect"manage245sdv.asp"
這樣就可以有效防止特殊用戶名用戶漏洞的產生;
(2)驗證用戶名密碼之前先檢驗有無非法字符;
過濾一些敏感字符可以直接防止此漏洞的產生,比如:“&”“/”“”“+”“ ‘ ”等。具體方法在在這里就不詳細給出了。

2、 連接文件漏洞

ASP網頁程序設計的時候,我們一般將數據庫連接方式保存為一個文件,在需要此連接的網頁中直接應用此文件。剛才用戶驗證的例子程序就有這樣的連接文件應用,讀者會發現“login.asp”文件源程序有這樣一句:
〈!--#include file="conn.inc"-->
其中“conn.inc”是包含數據庫連接方式的文件。
這種引用方式給網頁設計者很大的方便,然而,如果有心人想窺探你的數據連接方式,他就有可能猜出你的連接文件名,然后在瀏覽器直接打入此文件名,如:
http://www.awebsite.com/conn/conn.inc
結果是此文件被下載,然后你的數據庫連接方式直接暴露在別人面前,甚至數據庫帳號密碼也泄漏,然后結果就可想而知。
以上設計方式現在仍然有很多設計者在使用,希望讀者不要以此實驗!那么,網頁設計者怎樣避免以上漏洞?有以下幾種方法:
(1)改變連接文件名
連接文件不一定要是inc文件,也可以是ASP文件,因此,我們可以將conn.inc改名為conn.asp,這樣,瀏覽端就不可以下載此連接文件了;
(2)將連接方式保存在Application中,直接引用;
這種方式對系統資源有一些小小的消耗,但是仍然不失為一種好的選擇;
(3)如果一定要使用inc文件,將此文件取一個特別復雜的名字,比如:xxx223773.inc,反正不能讓瀏覽者猜到;
以上方法可以有效防止此類漏洞的發生,可以依自己習慣設定。

3、 驗證不全漏洞
還是第一點的驗證,經驗不足的網頁設計者在設計網頁時,往往可以考慮到在敏感區域入口加上用戶驗證,但是,對于敏感區域內部的網頁就不再加入驗證。這樣的結果是,如果用戶從網頁設計者提供的入口進入敏感區域,就會有驗證出現;如果用戶跨過驗證入口,直接調用敏感區的文件,這個驗證就形于虛設。這個毛病不但初學者有,那些設計經驗很豐富的設計者有時為了簡單,客戶有不會仔細檢查,干脆也就做個樣子算了。那么,到底應該怎樣使敏感區的每一個文件都有驗證,不能直接調閱?有以下方法:那就是給用戶設計一個session,如果用戶的session不為空,證明是合法用戶;反之,直接跳到登錄頁面。以下給出簡單例子。
(1)給每一個用戶在驗證頁面設計一個session;
如上文的login.asp中,在最后一行加入:
〈%session("zhanghao2764819")=trim(zhanghao)%>
這樣就給每一個合法用戶一個唯一session;
(2)敏感區的每一個文件驗證其session是否為空,如果為空,跳到登錄頁面要求登錄;可以這樣設計:
敏感區的每一個文件其都加入:
〈!--#include file="yanzh.asp"-->
其內容如下:

〈%
if session("zhanghao2764819")="" then  
response.redirect"login.htm"  
%>  


這樣就給敏感區的每一個頁面加上了驗證。

總結:以上只是網頁設計中一些比較典型的安全漏洞,要做到真正的安全網頁設計,不但需要長久的經驗而且需要不斷的開闊視野,了解最新的安全問題。
标签:

相關文章:

推薦設計

最新文章