- A+
对一类ASP安全漏洞的分析及解决方案的探讨
近日,本人用ASP编写一套新闻管理系统。其间从网上查阅了很多相关资料,也下载了不少有关的成套系统。通读了源码后发现了很多问题。在此提出其中较为普遍一例,希望能给大家帮助。
相必大家都很明白,ASP编程中,身份验证是相当重要而常用的。而很多网上的免费ASP程序对这方面处理的却不竟人意。下面以XX工作室出品的一个小系统来看问题具体出在哪里。先来看如部分相关程序:
index.asp:
<HTML><HEAD><TITLE>XX工作室注册系统</TITLE>
<META http-equiv=Content-Type content="text/html;
charset=gb2312"><LINK
href="image/style.css" rel=stylesheet>
<SCRIPT language=JavaScript>
<!--
<!-- hide this script from non-javascript-enabled browsers
function checkform(){
//check the user input value
if( document.Login.UserID.value==""){
alert("请输入用户名!");
document.Login.UserID.focus();
return false;
}
if( document.Login.Password.value==""){
alert("请输入您的密码!");
document.Login.Password.focus();
return false;
}
return true;
}
// stop hiding -->
//-->
</SCRIPT>
<META content="MSHTML 5.50.4807.2300" name=GENERATOR></HEAD>
<BODY bgColor=#000000 leftMargin=0 topMargin=0 marginheight="0"
marginwidth="0">
<TABLE height=600 cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="100%" height=14>
<DIV align=center><!--#include file="head.asp" --></DIV>
</TD></TR>
<TR>
<TD vAlign=center align=middle width="100%" bgColor=#7b0000
height=315>
<FORM name=Login onsubmit="return checkform();" action=login.asp
method=post>
<TABLE height=126 cellSpacing=0 borderColorDark=#ff9933
cellPadding=3
width=30% align=center borderColorLight=#000000 border=1>
<TBODY>
<TR>
<TD vAlign=middle align=center width="100%" height=88><FONT
color=#ffffff> 用户名:
<INPUT size=15
name=UserID>
<BR>
<BR>
口 令:
<INPUT
type=password size=15 name=Password>
</FONT> </TD>
</TR>
<TR>
<TD vAlign=center align=left width="100%" bgColor=#7b0000
height=17> <A
href="join.asp"><IMG
src="image/button-join.gif" border=0></A> &n
bsp;
<input type=image src="image/button-login.gif"
align=absMiddle border=0 name="image">
</TD>
</TR></TBODY></TABLE></FORM>
<P></P></TD></TR>
<TR>
<TD vAlign=center align=middle width="100%" bgColor=#7b0000
height=32></TD></TR>
<TR>
<TD width="100%" colSpan=2>
<TABLE height=101 cellSpacing=0 cellPadding=0 width="100%"
bgColor=#000000
border=0>
<TBODY>
<TR>
<TD vAlign=top align=left bgColor=#000000 colSpan=4 height=21>
<HR color=#983625>
</TD></TR>
<TR>
<TD vAlign=center align=middle bgColor=#983625 colSpan=4
height=80>
<!--#include file="copyright.asp" -->
</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></BODY></HTML>
处理请求的login.asp程序如下:
<%
dim conn
dim connstr
on error resume next
connstr="DBQ="+server.mappath("db1.mdb")+";DefaultDir=;DRIVER={Microsoft
Acce
ss Driver (*.mdb)};"
set conn=server.createobject("ADODB.CONNECTION")
conn.open connstr
Set rs = Server.CreateObject("ADODB.RecordSet")
user=request.form("UserID")
pwd=request.form("Password")
sql="select * from reg where username="&user&" and password="&pwd&""
rs.open sql,conn,1,1
if not rs.eof then
response.redirect "main.asp"
elseif rs.eof and rs.bof then
response.write "密码错误或没有这个用户<a href=join.asp target=_blank>注册</a>"
end if
%>
大家看过是否发现有何不拖之处?我们分析一下,index.asp中,接收用户输入用户名及密码,并用checkform()函数检查用户名和密码理否为空,如果为空的话,提示出错信息。
在login.asp中,接收用户输入的Userid和Password数据,并分别赋值给user和pwd,然后再用sql="select * from reg w here username="&user&" and password="&pwd&"" 这句来对用户名和密码加以验证。 以常理来考虑的话,这是个很完整的程序了。而在实际的使用过程中,整套程序也的确可能正常使用。
但是如果Userid的值和password的值被赋于:x or1=1
这时,sql="select * from reg where username="&user&" and
password="&pwd&"" 就成了:
sql="select * from reg where user=x or 1=1 and pass=x or 1=1"
怎么样?!我不说大家也明白了吧!
既然有这样的问题,接下来我们就来看看如何解决它。从上面的程序中各位也可以看出,只要对用户输入的数据进行严格过滤就可以了。具体可以参下面的程序:
<%
user=request.from("UserID")
pass=request.from("password")
for i=1 to len(UserID)
cl=mid(UserID,i,1)
if cl="" or us="%" or us="<" or us=">" then
response.redirect "error.htm"
response.end
end if
next
%>
同样是先取得用户输入数据,然后分析用户输入的每一个字符,如发现异常,则转到错误页面。
if cl="" or us="%" or us="<" or us=">" then
这一句中可以加入任意的过滤字符,跟据具体情况而定。
- 我的微信
- 这是我的微信扫一扫
- 我的微信公众号
- 我的微信公众号扫一扫