当前位置: 首页 > 图文教程 > 网络编程 > ASP > ASP编程菜鸟易犯的一个错误

ASP
ASP正则表达式技巧
ASP Access实现网站计数器(访问量)
ASP新闻分页,将一篇过长的文章分页,生成静态页面
一些关于asp 购物车的想法
一个sql查询器,自动画表格填字段
ASP实现文件直接下载的代码
把网页中的(电话,qq等数字)生成图片的ASP程序
asp长文章用分页符来分页显示
Asp函数介紹(37个常用函数)
ASP中的面向对象类
分页实现方法的性能比较
asp ajax跨域提交数据
asp修改文件和文件夹的名字的代码
ASP 多关键词查询实例代码
asp被杀毒软件误删的解决方法
asp 多关键词搜索的简单实现方法
asp 根据IP地址自动判断转向分站的代码
asp dictionary对象的用法
ASP 千万级数据分页的存储过程
ASP隐藏真实文件的下载功能实现代码

ASP编程菜鸟易犯的一个错误


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-23   浏览: 105 ::
收藏到网摘: 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
    ...
    %>