初学ASP编程易犯的一个错误要注意
在【zài】ASP编程中,身份认证可以说是常要用到【yào yòng dào】🎚的🔷。但怎么【dàn zěn me】样才能🎸做到认证的安【zhèng de ān】📓全呢?
表单提🎪交页面:sub.htm
<html>
<head>
<title>管理员【guǎn lǐ yuán】登陆</title>
<body>
<form name="form1" method="post" action="sub.asp">
<p> 管理员【guǎn lǐ yuán】:
<input type="text" name="UserID" size="25" maxlength="20">
密🕵 码✉:
<input type="text" name="Pass" size="12" maxlength="20">
<input type="submit" name="Submit" value="提交【tí jiāo】">
</p>
</form>
</body>
</html>
SUB.asp程序
<%
接收表单中的【dān zhōng de】数据【shù jù】♊
user=request.from("UserID")
检察表单提交🏤的数据【de shù jù】♊是否为空🥠(表单页【biǎo dān yè】面🍟可能你【kě néng nǐ】用【yòng】🙉JAVASCRIPT OR VBSCRIPT控制了,但这里【dàn zhè lǐ】也不要【yě bú yào】🛳忘记控制!
if user="" then
转到出错提示页面🍟!
response.redirect "err1.htm"
这一句可能没📦用【yòng】🙉,但加上🍶为好【wéi hǎo】🕖!
response.end
end if
pass=request.from("Pass")
if pass="" then
response.redirect "err2.htm"
response.end
end if
联接🛴数据【shù jù】♊库
file=server.mappath("你的数【nǐ de shù】据♊库")
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
找到的【zhǎo dào de】话就进【huà jiù jìn】🦆入管理页面🍟
reponse.redirect "login.asp"
else
没找到【méi zhǎo dào】就进入错误页面🍟
response.write "err3.htm"
end if
%>
大家感觉以上代码应【dài mǎ yīng】该没问题啊【tí ā】,但是这里有一【lǐ yǒu yī】👽个严重的安全❔隐患🌙:
我如果想登录【xiǎng dēng lù】🚐管理员的话可🐓以在SUb.htm表单输入【rù】🐉框中输入【rù】🐉:
第一个文本框【wén běn kuàng】🕛中输入【zhōng shū rù】:a or 1 = 1 或✉ OR =
第二个【dì èr gè】🧢文本框【wén běn kuàng】中输入:a or 1 = 1 或🈚 OR =
提交【tí jiāo】,大家会看到♍...“呜,听我说完好【hǎo】不⭕好【hǎo】🎿,砖头一会再丢【huì zài diū】过来..."
"a " 和“1”为任意【wéi rèn yì】字符🌇
有人会【yǒu rén huì】😜问为什【wèn wéi shí】么你输🏦入这些字符会以管理【yǐ guǎn lǐ】🔔员身份进入呢??
其实这🐦些字符【xiē zì fú】是对你程序中SQL语言的欺骗💐,而成功【ér chéng gōng】进入的【jìn rù de】🛸
大家看🍩:开始程【kāi shǐ chéng】序SQL中是对🍨表进行【biǎo jìn háng】查询满【chá xún mǎn】足user= "&user&" and pass= "&pass&" "条件的记录🈲
sql="select * from 表【biǎo】🌁 where user= "&user&" and pass= "&pass&" "
我而输🏑入上面的代码后就成【hòu jiù chéng】了【le】🕖:
sql="select * from 表【biǎo】✖ where user= a or 1 = 1 and pass= a or 1 = 1 "
大家看看,能有不进入的【jìn rù de】🚞理由【yóu】吗??给我一个不进🎴入的理由【yóu】,先【xiān】🛫!
以上USER PASS字段为👧字符型【zì fú xíng】 如果是数字型🔜也一样【yě yī yàng】的道理【de dào lǐ】😄!
解决方🌤法【fǎ】:
一【yī】、函数替🛬代法:
用REPLACE将用户【jiāng yòng hù】🗝端输入的内容中含有【zhōng hán yǒu】特殊字符进行替换【tì huàn】,达到控制目的🎻啊🛂!sql="select * from 表【biǎo】🤰 where user= "&replace(user," "," ")&" and pass= "&replace(pass," "," ")&" "
这种方法每次只能替😇换一个【huàn yī gè】🏖字符,其实危险的字符不只是🌜" ",还有如🐚">"、"<"、"&"、"%"等字符【děng zì fú】应该全【yīng gāi quán】控制起来【lái】。但用【dàn yòng】REPLACE函数好象不太胜任那怎么办【zěn me bàn】🚒呢🐾??
二、程序控制法【zhì fǎ】🏪
用【yòng】程序🏥来🧒对客户【duì kè hù】端输🕷入的内🔼容全部控制起来🧒,这样能全面控制用【zhì yòng】🍤户端输🕷入的任何可能【hé kě néng】的危险字符【fú】或代码,我就的✡这个方法【fǎ】❣!
<%
捕捉用【bǔ zhuō yòng】🍤户端提交的表🦆单内容
user=request.from("user")
pass=request.from("pass")
...
循环控【xún huán kòng】🥚制开始
for i=1 to len(user)
用【yòng】🍤MID函数读出变量user中【zhōng】i 位置的一个字符【fú】
us=mid(user,i,1)
将读出【jiāng dú chū】的字符【fú】🤩进行比😥较【jiào】
if us=" " or us="%" or us="<" or us=">" or us="&" then
如果含🚤有以上【yǒu yǐ shàng】💃字符将【zì fú jiāng】出错提示,不能含【bú néng hán】📦有以上【yǒu yǐ shàng】💃特殊字符【fú】
response.redirect "err2.htm"
response.end
end if
next
...
%>
关键词:ASP
阅读本文后您有什么感想? 已有 人给出评价!
- 0
- 0
- 0
- 0
- 0
- 0