这个题目很奇怪,网页设计还要考虑安全的吗?安全不是系统管理员的事吗?那你就错了,系统管理员可以让系统固于金汤,但是如果网页程序有漏洞,最好的系统管理员也没有办法。下面就举几个常见的例子; 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="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> 〈/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”是包含数据库连接方式的文件。 这种引用方式给网页设计者很大的方便,然而,如果有心人想窥探你的数据连接方式,他就有可能猜出你的连接文件名,然后在浏览器直接打入此文件名,如: //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" %> 这样就给敏感区的每一个页面加上了验证。
总结:以上只是网页设计中一些比较典型的安全漏洞,要做到真正的安全网页设计,不但需要长久的经验而且需要不断的开阔视野,了解最新的安全问题。
|