系统管理员可以让系统固于金汤,但是如果网页程序有漏洞,最好的系统管理员也没有办法。下面就举几个常见的例子;
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">
〈div align="center">
〈center>〈table border="1" width="53%" bordercolor="#C0C0C0"> 〈tr>
〈td width="**" 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>
〈/div>
〈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.网址未加载/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"
%>
这样就给敏感区的每一个页面加上了验证。
总结:以上只是网页设计中一些比较典型的安全漏洞,要做到真正的安全网页设计,不但需要长久的经验而且需要不断的开阔视野,了解最新的安全问题。