ASP编程菜鸟易犯的一个错误
在【zài】📪ASP编程中,身份认【shēn fèn rèn】证可以🐜说是常要用到💎的。但怎么🌪样才能做到认证的安【zhèng de ān】全呢【quán ne】?
表单提【biǎo dān tí】交页面⚫:sub.htm
<html>
以下为【yǐ xià wéi】😇引用的内容:
<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">
密 码【mǎ】🖕:
<input type="text" name="Pass" size="12" maxlength="20">
<input type="submit" name="Submit" value="提交">
</p>
</form>
</body>
</html>
以下为引用【yòng】的😷内容【nèi róng】: SUB.asp程序【chéng xù】 <% 接收表单中的数据【de shù jù】 user=request.from("UserID") 检察表单提交的数据【de shù jù】是否为【shì fǒu wéi】💁空(表单页面📐可能你用【yòng】JAVASCRIPT OR VBSCRIPT控制了【kòng zhì le】😾,但这里【dàn zhè lǐ】也不要忘记控【wàng jì kòng】🖕制🚓! if user="" then 转到出🗡错提示🏫页面📐! response.redirect "err1.htm" 这一句可能没😑用【yòng】,但加上【dàn jiā shàng】为好😅! response.end end if pass=request.from("Pass") if pass="" then response.redirect "err2.htm" response.end end if 联接数🕵据库😎 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】🥃话就进入管理页面📐 reponse.redirect "login.asp" else 没找到【méi zhǎo dào】就进入错误页【cuò wù yè】面📐 response.write "err3.htm" end if %> |
大家感😊觉以上【jiào yǐ shàng】代码应该没问题啊【tí ā】🎀,但是这里有一个严重🤛的安全【de ān quán】隐患:
我如果想登录管理员🔑的话可👊以在【yǐ zài】SUb.htm表单输【biǎo dān shū】📙入框中【rù kuàng zhōng】输入:
第一个【dì yī gè】🛄文本框中输入🎮:a or 1 = 1 或【huò】 OR =
第二个【dì èr gè】文本框【wén běn kuàng】⛑中输入:a or 1 = 1 或🌃 OR =
提交,大家会看到...“呜,听我说完好⛹不好【bú hǎo】⛹,砖头一🧢会再丢【huì zài diū】🕵过来【guò lái】..."
"a " 和💀“1”为任意【wéi rèn yì】字符
有人会【yǒu rén huì】问为什【wèn wéi shí】🐟么你输【me nǐ shū】入这些🍖字符会以管理员身份进入呢🎗??
其实这【qí shí zhè】些字符🎥是对你程序中SQL语言的🕷欺骗📖,而成功【ér chéng gōng】进入的【jìn rù de】
大家看:开始程序SQL中是对📯表进行查询满【chá xún mǎn】足【zú】🥧user= "&user&" and pass= "&pass&" "条件的🐫记录【jì lù】
sql="select * from 表【biǎo】⚫ where user= "&user&" and pass= "&pass&" "
我而输入上面的代码后就成了:
sql="select * from 表【biǎo】🕶 where user= a or 1 = 1 and pass= a or 1 = 1 "
大家看【dà jiā kàn】🗣看🗣,能有不进入的【jìn rù de】理🚕由吗??给我一【gěi wǒ yī】🔹个不进入的【jìn rù de】理🚕由,先!
以上【yǐ shàng】🖇USER PASS字段为🌞字符型【zì fú xíng】 如果是🐤数字型【shù zì xíng】也一样的道理!
解决方法:
一、函数替代法:
用【yòng】⭕REPLACE将用【jiāng yòng】⭕户端输入的内容中含有【yǒu】🧜特殊字符进行替换,达到控🚪制目的【zhì mù de】🍤啊!sql="select * from 表 where user= "&replace(user," "," ")&" and pass= "&replace(pass," "," ")&" "
这种方⚽法每次【fǎ měi cì】只能替【zhī néng tì】换一个字符【zì fú】,其实危险的字🌉符不只🐗是📏" ",还有如">"、"<"、"&"、"%"等字符【děng zì fú】👯应该全🔽控制起来。但用REPLACE函数好象不太胜任那怎么办【zěn me bàn】呢【ne】??
二、程序控制法
用程序【yòng chéng xù】来🚵对客户端输入【duān shū rù】⛹的内容全部控制起♋来🚵,这样能全面控【quán miàn kòng】制用户【zhì yòng hù】端输入【duān shū rù】⛹的任何【de rèn hé】可能的危险字【wēi xiǎn zì】🏟符或代🚩码🧡,我就的这个方法!
以下为引用的😳内容【nèi róng】: <% 捕捉用⬛户端提【hù duān tí】交的表单内容【nèi róng】🗞 user=request.from("user") pass=request.from("pass") ... 循环控制开始 for i=1 to len(user) 用⬛MID函数读出变量user中i 位置的【wèi zhì de】一个字⛏符 us=mid(user,i,1) 将读出【jiāng dú chū】的字符【de zì fú】进行比较【jiào】 if us=" " or us="%" or us="<" or us=">" or us="&" then 如果含【rú guǒ hán】📕有以上😔字符将🥑出错提🎾示【shì】,不能含【bú néng hán】有以上😔特殊字符 response.redirect "err2.htm" response.end end if next ... %> |
关键词:ASP编程
阅读本文后您有什么感想? 已有 人给出评价!
- 1
- 1
- 1
- 1
- 1
- 1