当前位置: 首页 > 图文教程 > 网络编程 > ASP > 初学ASP编程易犯的一个错误要注意

ASP
ASP基础讲座(下)
解决IIS5 HTTP500内部错误
ASP 3.0高级编程(四十六)
ASP 3.0高级编程(四十五)
ASP 3.0高级编程(四十四)
ASP 3.0高级编程(四十三)
ASP 3.0高级编程(四十二)
ASP 3.0高级编程(四十一)
ASP 3.0高级编程(三十九)
ASP 3.0高级编程(三十八)
ASP 3.0高级编程(三十七)
ASP 3.0高级编程(三十六)
ASP 3.0高级编程(三十五)
ASP 3.0高级编程(三十四)
ASP 3.0高级编程(三十三)
ASP 3.0高级编程(三十二)
ASP 3.0高级编程(三十一)
ASP错误代码说明
jscript错误代码及相应解释大全
ASP错误处理

初学ASP编程易犯的一个错误要注意


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 59 ::
收藏到网摘: n/a

在ASP编程中,身份认证可以说是常要用到的。但怎么样才能做到认证的安全呢?

表单提交页面:sub.htm 

以下为引用的内容:

    <html>
    <head>
    <title>管理员登陆</title>
    <body>
    <form name="form1" method="post" action="sub.asp">
    <p> 管理员:
    <input type="text" name="UserID" size="25" maxlength="20">
    密 码:
    <input type="text" name="Pass" size="12" maxlength="20">
    <input type="submit" name="Submit" value="提交">
    </p>
    </form>
    </body>
    </html>

以下为引用的内容:

    SUB.asp程序
    <%
    接收表单中的数据
    user=request.from("UserID")
    检察表单提交的数据是否为空(表单页面可能你用JAVASCRIPT OR VBSCRIPT控制了,但这里也不要忘记控制!
    if user="" then
    转到出错提示页面!
    response.redirect "err1.htm"
    这一句可能没用,但加上为好!
    response.end
    end if
    pass=request.from("Pass")
    if pass="" then
    response.redirect "err2.htm"
    response.end
    end if
    联接数据库
    file=server.mappath("你的数据库")
    set conn=server.createobject("adodb.connection")
    dr="driver={microsoft access driver (*.mdb)};dbq="&file
    conn.open dr
    set rs=server.createobject("adodb.recordset")
    关键是这里的SQL语言
    sql="select * from 表 where user= "&user&" and pass= "&pass&" "
    rs.open sql
    if not rs.eof then
    找到的话就进入管理页面
    reponse.redirect "login.asp"
    else
    没找到就进入错误页面
    response.write "err3.htm"
    end if
    %>

大家感觉以上代码应该没问题啊,但是这里有一个严重的安全隐患:

我如果想登录管理员的话可以在SUb.htm表单输入框中输入:

第一个文本框中输入:a or 1 = 1 或 OR =

第二个文本框中输入:a or 1 = 1 或 OR =

提交,大家会看到...“呜,听我说完好不好,砖头一会再丢过来..."

"a " 和“1”为任意字符

有人会问为什么你输入这些字符会以管理员身份进入呢??

其实这些字符是对你程序中SQL语言的欺骗,而成功进入的

大家看:开始程序SQL中是对表进行查询满足user= "&user&" and pass= "&pass&" "条件的记录

sql="select * from 表 where user= "&user&" and pass= "&pass&" "

我而输入上面的代码后就成了:

sql="select * from 表 where user= a or 1 = 1 and pass= a or 1 = 1 "

大家看看,能有不进入的理由吗??给我一个不进入的理由,先!

以上USER PASS字段为字符型 如果是数字型也一样的道理!

解决方法:

一、函数替代法:

用REPLACE将用户端输入的内容中含有特殊字符进行替换,达到控制目的啊!sql="select * from 表 where user= "&replace(user," "," ")&" and pass= "&replace(pass," "," ")&" "

这种方法每次只能替换一个字符,其实危险的字符不只是" ",还有如">"、"<"、"&"、"%"等字符应该全控制起来。但用REPLACE函数好象不太胜任那怎么办呢??

二、程序控制法

用程序来对客户端输入的内容全部控制起来,这样能全面控制用户端输入的任何可能的危险字符或代码,我就的这个方法!

以下为引用的内容:

    <%
    捕捉用户端提交的表单内容
    user=request.from("user")
    pass=request.from("pass")
    ...
    循环控制开始
    for i=1 to len(user)
    用MID函数读出变量user中i 位置的一个字符
    us=mid(user,i,1)
    将读出的字符进行比较
    if us=" " or us="%" or us="<" or us=">" or us="&" then
    如果含有以上字符将出错提示,不能含有以上特殊字符
    response.redirect "err2.htm"
    response.end
    end if
    next
    ...
    %>