席東

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