問題描述:
哪位告訴我在網站做驗證怎麽做啊啊謝謝
解析:
還是從最簡單的例子說起,來了解壹下驗證碼的基本思路。
第壹個例子,在顯示表單的同時,生成壹個4位的隨機數做為驗證碼,利用session傳遞該驗證碼,在數據處理頁面,比對用戶輸入的驗證碼與session中的值是否壹致。順便說壹句,我曾見過有糊塗的仁兄利用hidden類型的input控件傳遞驗證碼,孰不知,通過查看頁面源代碼,該數據是暴露無遺的。還有password型的input中的數據也壹樣。
<%
''''''''**********************************
''''''''* NAME:post *
''''''''* CODE:ops(op.cc) *
''''''''* USE:驗證碼示例壹:數字型 *
''''''''* TIME:2005.7 *
''''''''**********************************
Response.Buffer = true
Dim CheckCode
Response.Write "<><body>"
''''''''======***表單提交後:***======
if Request.ServerVariables("REQUEST_METHOD")="POST" then
Dim founderr,callform,msg
founderr = false ''''''''是否有錯誤發生
callform = false ''''''''是否調用表單
msg = "" ''''''''提示信息
''''''''==============驗證碼驗證開始===========
dim sessionCode
sessionCode = session("cCode")
session("cCode") = ""
CheckCode = trim(Request.Form("ccode"))
if CheckCode = "" then
msg = msg + "<li>請填寫驗證碼"
founderr = true
callform = true
elseif cstr(CheckCode) <> cstr(sessionCode) then
msg = msg + "<li>驗證碼不正確"
founderr = true
callform = true
end if
''''''''==================驗證碼驗證結束============
if founderr = true then
call message("500")
if callform = true then call myform()
else
msg = "<li>操作成功!"
call message("500")
end if
''''''''======***頁面初始化(表單提交前)***======
else
CheckCode = ""
call myform()
end if
Response.Write "</body></>"
REM 子過程,定義表單
Sub myform()
Response.Write "<table width=500 border=1 cellspacing=0 cellpadding=5 align=center>"&_
"<form name=form1 method=post action=post>"&_
"<tr height=30><td rowspan=2 width=100 align=center>驗證碼</td>"&_
"<td><input type=text name=ccode size=10> "&_
getCCode()&"</td></tr>"&_
"<tr height=30><td>請填寫文本框右側的驗證碼</td></tr>"&_
"<tr height=30><td colspan=2 align=center>"&_
"<input type=submit name=Submit value=提交></td></tr>"&_
"</form></table>"
end Sub
Rem 子函數,生成驗證碼(四位隨機數)
function getCCode()
dim ranNum
randomize
ranNum=int(9000*rnd)+1000
session("cCode") = ranNum
getCCode = ranNum
end function
Rem 提示信息
sub message(w)
Response.Write "<table width=&w& border=1 cellspacing=0 cellpadding=5 align=center>"&_
"<tr height=30><td>提示信息</td></tr>"&_
"<tr valign=top><td class="page_speeder_327763530"color:red;"">"&msg&"</td></tr></table>"
end sub
%>
以上代碼展示生成驗證碼的壹般思路,生成壹個四位隨機數作為驗證碼,這是最簡單,同時也是最不安全的壹種方法。
或許妳想到了,可以以每位數字對應壹張圖片,生成圖片型的驗證碼,就象圖片型計數器那樣處理。這並不是壹個好想法,它跟數值型的驗證碼沒有本質上的區別,並不能提高安全性。
下面,介紹如何生成圖片型的驗證碼。
首先,可以通過ASP生成xbm型的驗證碼,這的的確確是壹張xbm格式的圖片,而且,妳可以任意設置圖片的大小。為了簡單起見,我們仍以數字為例。
可以把生成驗證碼的代碼獨立出來,命名為checkcode:
<%
''''''''**********************************************
''''''''* NAME:checkcode *
''''''''* CODE:ops(op.cc) *
''''''''* USE:生成xbm格式的驗證碼 *
''''''''* TIME:2005.7 *
''''''''**********************************************
on error resume next
dim i
dim countdata
countdata="***********"
dim rou,ccode,clen
ccode=""
clen = 4
randomize
for i=1 to 4
rou = int(rnd*10)
ccode = ccode + cstr(rou)
next
dim strDigits
strDigits = Array(_
"0","0x3c","0x66","0x66","0x66","0x66","0x66","0x66","0x66","0x66","0x3c",_
"1","0x30","0x38","0x30","0x30","0x30","0x30","0x30","0x30","0x30","0x30",_
"2","0x3c","0x66","0x60","0x60","0x30","0x18","0x0c","0x06","0x06","0x7e",_
"3","0x3c","0x66","0x60","0x60","0x38","0x60","0x60","0x60","0x66","0x3c",_
"4","0x30","0x30","0x38","0x38","0x34","0x34","0x32","0x7e","0x30","0x78",_
"5","0x7e","0x06","0x06","0x06","0x3e","0x60","0x60","0x60","0x66","0x3c",_
"6","0x38","0x0c","0x06","0x06","0x3e","0x66","0x66","0x66","0x66","0x3c",_
"7","0x7e","0x66","0x60","0x60","0x30","0x30","0x18","0x18","0x0c","0x0c",_
"8","0x3c","0x66","0x66","0x66","0x3c","0x66","0x66","0x66","0x66","0x3c",_
"9","0x3c","0x66","0x66","0x66","0x66","0x7c","0x60","0x60","0x30","0x1c")
dim iCharWidth,iCharHeight,theBit,theNum,iRow,k,theOffset
dim imageStr
imageStr = ""
iCharWidth = 8
iCharHeight= 10*1
Response.ContentType ="image/x-xbitmap"
Response.Expires =0
Response.Write "#define counter_width "&iCharWidth*clen&chr(13) & chr(10)
Response.Write "#define counter_height "&iCharHeight&chr(13) & chr(10)
Response.Write "static unsigned char counter_bits[]={"
for iRow=0 to iCharHeight-1
for i=1 to clen
theBit=mid(ccode,i,1)
k=0
do while k<ubound(strDigits)
if strDigits(k) = theBit then exit do
k=k+iCharHeight+1
loop
if k>=ubound(strDigits) then k=0
theOffset = k + 1
imageStr = imageStr + (strDigits(theOffset+iRow))&","
next
next
imageStr = left(imageStr,(len(imageStr)-1))
Response.Write imageStr
Response.Write "};"
session("cCode") = ccode
%>
在post中,定義表單時,相應的代碼改為:
REM 子過程,定義表單
Sub myform()
Response.Write "<table width=500 border=1 cellspacing=0 cellpadding=5 align=center>"&_
"<form name=form1 method=post action=default>"&_
"<tr height=30><td rowspan=2 width=100 align=center>驗證碼</td>"&_
"<td><input type=text name=ccode size=10> "&_
"<img src=checkcode width=32 height=10 border=0></td></tr>"&_
"<tr height=30><td>請填寫文本框右側的驗證碼</td></tr>"&_
"<tr height=30><td colspan=2 align=center>"&_
"<input type=submit name=Submit value=提交></td></tr>"&_
"</form></table>"
end Sub
以上就是最簡單的xbm型的驗證碼。但是這種格式的驗證碼,windows xp sp2的用戶無法看到,原因是xp sp2取消了對xbm格式文件的支持。不過,可以通過修改註冊表解決這個問題:打開註冊表,找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Inter Explorer\Security,用右鍵增加壹個 dword 值,改名為 BlockXBM,其值為 *********** 。改好後,重新打開遊覽器就可以了。也可以用文件編輯器編輯壹文件,內容如下:
REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Inter Explorer\Security]
"BlockXBM"=dword:***********
將該文件保存為擴展名為reg的註冊表文件,然後雙擊該文件即可。
除了xbm格式的驗證碼,也可以利用Adodb.Stream對象,開發出更復雜的BMP型驗證碼,可以從op.cc/downloads/bmpccode.rar得到相關程序。利用該程序,可以生成數字、字母混合,彩色,且有彩色背景的驗證碼。
對於租用空間的朋友來說,使用第三方組件受到很大限制。如果擁有自己的服務器,可以試壹下利用ASP繪圖組件shotgraph生成驗證碼,該驗證碼是GIF格式的,具有很廣泛的通用性。該組件可從op.cc/downloads/shotgraph.zip得到。壓縮包裏有詳細的示例程序和說明文檔。
總之,生成驗證碼的辦法很多,現在有很多第三方組件可以幫助妳生成各種樣式的驗證碼,上網找找看吧。