這個(gè)題目很奇怪,網(wǎng)頁(yè)設(shè)計(jì)還要考慮安全的嗎?安全不是系統(tǒng)管理員的事嗎?那你就錯(cuò)了,系統(tǒng)管理員可以讓系統(tǒng)固于金湯,但是如果網(wǎng)頁(yè)程序有漏洞,最好的系統(tǒng)管理員也沒有辦法。下面就舉幾個(gè)常見的例子;

1、用戶驗(yàn)證漏洞。

一般程序設(shè)計(jì)者將用戶名和密碼保存在數(shù)據(jù)庫(kù)中,驗(yàn)證用戶合法性時(shí),檢驗(yàn)密碼和用戶名是否對(duì)應(yīng),以此判定用戶是否合法。

一個(gè)典型的用戶驗(yàn)證頁(yè)面如下:

此頁(yè)源代碼如下:

〈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>


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

〈%Response.Buffer=true%>

〈%

'取得帳號(hào)用戶

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

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

'從數(shù)據(jù)庫(kù)中取得數(shù)據(jù)

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

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

2、 連接文件漏洞

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

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

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


這樣就給敏感區(qū)的每一個(gè)頁(yè)面加上了驗(yàn)證。

總結(jié):以上只是網(wǎng)頁(yè)設(shè)計(jì)中一些比較典型的安全漏洞,要做到真正的安全網(wǎng)頁(yè)設(shè)計(jì),不但需要長(zhǎng)久的經(jīng)驗(yàn)而且需要不斷的開闊視野,了解最新的安全問題。
標(biāo)簽:

相關(guān)文章

隨機(jī)推薦