席東
摘要:驗證碼對大家來說應(yīng)該不會陌生,諸如登錄賬號、發(fā)表評論等操作,網(wǎng)站一般都會要求用戶輸入驗證碼。那么驗證碼在網(wǎng)站中起了什么作用呢?當(dāng)我們在制作網(wǎng)站時如何添加驗證碼功能呢?下面就驗證碼的功能、如何使用PHP生成驗證碼、如何實現(xiàn)無刷新局部更新進(jìn)行介紹。
關(guān)鍵詞:驗證碼;PHP;AJAX;SESSION
中圖分類號:TP393 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2019)32-0053-02
1什么是驗證碼
驗證碼(CAPTCHA)是“Completely Automated Public Turingtest to tell Computers and Humans Apart”(全自動區(qū)分計算機(jī)和人類的圖靈測試)的縮寫。它是一種能夠區(qū)分用戶是計算機(jī)還是人類的程序。
驗證碼能夠?qū)Ρ┝ζ平饷艽a、無限刷票、論壇灌水等操作進(jìn)行有效防止,當(dāng)前很多網(wǎng)站基礎(chǔ)都會使用驗證碼。簡單來說驗證碼是一個由計算機(jī)自動生成的問題,問題回答的是否正確由計算機(jī)自動評判。一般來說驗證碼所表達(dá)的問題只有人類才能解答,而計算機(jī)是無法解答這個的問題,于是可以得出不能正確回答驗證碼問題的用戶,就不是合法用戶,對這些用戶做出限制,就可以避免很多惡意情況的發(fā)生。
驗證碼的種類有很多,有的是一張圖片,圖片上有數(shù)字,字符、漢字、運算式等信息;有的是多張圖片需要用戶根據(jù)要求進(jìn)行選擇;有的需要用戶使用鼠標(biāo)拖動完成驗證。向網(wǎng)站進(jìn)行數(shù)據(jù)請求時,用戶需要識別圖片上的內(nèi)容,然后網(wǎng)站會檢查用戶輸入的驗證碼與系統(tǒng)生成的驗證碼是否一致,如一致則認(rèn)為這次訪問網(wǎng)站的請求是一個正常的操作,如驗證碼不一致,網(wǎng)站則會拒絕此次請求。
驗證碼可有效防止一些惡意攻擊,對于提升網(wǎng)站的安全性、可服務(wù)性有重要意義。
2在網(wǎng)站中添加驗證碼
PHP語言是一種常用的動態(tài)網(wǎng)站編程語言,如何使用PHP語言生成驗證碼呢?
2.1創(chuàng)建驗證碼
1)使用imagecreatetruecolor函數(shù)生成指定規(guī)格的圖片
imagecreatetruecolor(int $width,int $height)
imagecreatetruecolor()如果執(zhí)行成功,會返回一個圖像標(biāo)識符,代表了一幅大小為x_size和y_size的黑色圖像,該函數(shù)第一個參數(shù)是圖像的寬度,第二個參數(shù)是圖像的高,單位為像素,如執(zhí)行失敗返回FALSE。
2)使用ImageColorAllocate函數(shù)為圖像分配顏色
imagecolorallocate(resource $image,int $red,int $green,int$blue)
imagecolorallocate()執(zhí)行成功后,返回一個標(biāo)識符,代表由給定的RGB成分組成的顏色。該函數(shù)的$image參數(shù)是一個圖像標(biāo)識符,$red,$green和$blue分別是所需要的顏色的紅,綠,藍(lán)成分,顏色參數(shù)是0到255的整數(shù)或者十六進(jìn)制的Ox00到OxFF。如執(zhí)行失敗則返回-1。
如果需要可以使用rand()和mt_rand()函數(shù)生成隨機(jī)顏色,如:
$rand_color=ImageColorAllocate($im,rand(0,255),rand(0,255),rand(0,255))
3)使用ImageFill函數(shù)填充圖片的背景色
imagefill(resource$image,int$x,int$y,int$color)
imagefill()函數(shù)在image圖像的坐標(biāo)x,y處使用color所代表的顏色,執(zhí)行區(qū)域填充。如執(zhí)行成功返回TRUE,執(zhí)行失敗返回FALSE。
4)使用mt_rand函數(shù)生成隨機(jī)數(shù)字
mt_rand(int$min,int$max)
mt_rand()函數(shù)如果執(zhí)行成功,會返回一個在min與max(包含這個值)之間的隨機(jī)整數(shù)。
5)使用ImageString函數(shù)在指定圖像上水平畫一行字符串
imagestring(resource $image,int $font,int $x,int $y,string $s,int$col)
imagestring()函數(shù)執(zhí)行成功,會使用由col指定的顏色將字符串s畫到image所代表的圖像的x,y坐標(biāo)處,如果font是1,2,3,4或5,則會使用內(nèi)置字體,當(dāng)然也可以使用自定義字體,只需加載指定的字體集(ttf)文件即可。
在這里,可以進(jìn)行多種變形,可以分別將兩個隨機(jī)數(shù)字的數(shù)學(xué)運算式顯示到圖片上,還可以隨機(jī)生成幾個文字或字符顯示到圖片上等,用來增加機(jī)器識別驗證碼的難度。
2.2將驗證碼的答案保存到SESSION
WEB服務(wù)器向本地瀏覽器傳輸信息時使用的是HTYP協(xié)議,它是一種無狀態(tài)(stateless)協(xié)議,即HTTP協(xié)議自身不能對通信的信息進(jìn)行保存。HTTP協(xié)議不能保留之前一切的請求或響應(yīng)報文的信息,那么應(yīng)如何保存驗證碼的信息呢?
Session又稱為會話控制,Session能夠存儲用戶訪問WEB服務(wù)器時生成的相關(guān)數(shù)據(jù)。當(dāng)用戶在應(yīng)用程序的Web頁面之間跳轉(zhuǎn)時,存儲在Session對象中的數(shù)據(jù)就不會丟失,直到訪問WEB服務(wù)器的會話結(jié)束。
將PHP生成的驗證碼結(jié)果保存到SESSION后,在會話結(jié)束前可以隨時讀取SESSION中的驗證碼,用來與用戶提交的驗證碼進(jìn)行比較。
首先使用session_start()函數(shù),啟動一個新會話。
然后將生成的隨機(jī)數(shù)保存到SESSION關(guān)聯(lián)數(shù)組中。
4如何在不刷新網(wǎng)頁的前提下刷新驗證碼
在訪問網(wǎng)站時,如果用戶看不清楚驗證碼圖片中的內(nèi)容,就需要重新得到新的驗證碼圖片。這時如果刷新整個頁面能夠刷新出新的驗證碼圖片,但是頁面中其他內(nèi)容也會被刷新,這會給用戶帶來較差的體驗。
如果能夠只刷新驗證碼圖片,而不影響頁面中其他元素,將會大大提升網(wǎng)頁的友好性及用戶體驗。
5總結(jié)
為了防止非法用戶利用計算機(jī)自動批量注冊、發(fā)表評論、對特定賬號進(jìn)行暴力破解等行為,驗證碼技術(shù)應(yīng)運而生,驗證碼一般是一個混合了數(shù)字或符號的圖片,并且驗證碼圖片可能會含有干擾信息(能夠增加機(jī)器識別的難度)。每次請求時均需要進(jìn)行驗證碼驗證,這將有效防止有人惡意、暴力攻擊。用戶在識別驗證碼時,會占用一些時間,這也能夠起到減輕服務(wù)器壓力的作用。
隨著圖片識別技術(shù)的不斷發(fā)展,圖片上的信息也逐漸可以被計算機(jī)程序識別,于是驗證碼技術(shù)也在不斷進(jìn)步,不斷完善,也將變得更加復(fù)雜。