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

ASP
一个ASP版的图片浏览管理器
无组件上传图片至SQLSERVER数据库
利用Jmail.Message发送邮件
用Web页面执行客户端程序
多图片上传到指定的目录并存到数据库
dreamweaverMX通用分页代码研究
下拉菜单输入,根据输入内容自动定位
中文的无组件文件上传ASP函数
一个利用adsi得到局域网信息的asp文件
根据需要动态include不同的文件
让自定义文件下载支持断点续传
用数组实现数据记录的批量录入方法
上传的进度条 实时反映上传情况
用ASP动态生成javascript的表单验证代码
ASP 编程中20个非常有用的例子
ASP生成Word文档的又一方法
用asp解析图片地址,并将其保存。
利用ASP的文件操作实现用户管理
创建 Visual Basic COM 组件在 ASP 中使用
调试 ASP 中使用的 Visual Basic COM 组件

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


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