>請注意,儘管有更好的自動第三方解決方案,例如Recaptcha,但該教程旨在僅解釋和證明此類技術的實際運行方式。我們不會解釋什麼驗證碼實際上是什麼,因為它被認為是常識,並且已經在其他地方進行了更詳細的範圍。
鑰匙要點
>創建一個形狀。
生成隨機線。
display()函數除了在瀏覽器中顯示圖像的普通HTML代碼外,沒有其他內容。除此之外,只能進行樣式以使輸出看起來可顯示。
>在Create_image()函數中,使用一個變量來引用ImageCreateTureColor()函數返回的圖像,該函數以圖像的寬度和長度作為其參數。 ImagePng()創建指定名稱和路徑的PNG圖像(在同一目錄中)。黑色圖像將是我們的第一步之後的輸出。
請注意,功能imagepng()將是我們函數的最後一行,以下所有步驟將僅在此函數調用之前插入create_image()函數中,否則它們不會生效。
可以為驗證碼選擇任何形狀。我們將使用函數ImageFilledRectangle()選擇矩形。它需要五個參數 - 圖像參考,啟動X-POS,啟動Y-POS,結束X-POS,結束Y-POS和背景顏色。您可以使用相應的函數作為橢圓驗驗。 ImageColaralocate()函數
在此步驟之後,上圖將是白色的。
<span><span><?php </span></span><span><span>session_start(); </span></span><span><span>?></span> </span> <span><span><span><title</span>></span>demo.php<span><span></title</span>></span> </span> <span><span><span><body</span> <span>style<span>="<span>background-color:#ddd; </span>"</span></span>></span> </span> <span><span><?php </span></span><span> <span>create_image(); </span></span><span> <span>display(); </span></span><span> <span>/***** definition of functions *****/ </span></span><span> <span>function display() </span></span><span> <span>{ </span></span><span> <span>?></span> </span> <span><span><span><div</span> <span>style<span>="<span>text-align:center;</span>"</span></span>></span> </span> <span><span><span><h3</span>></span>TYPE THE TEXT YOU SEE IN THE IMAGE<span><span></h3</span>></span> </span> <span><span><span><b</span>></span>This is just to check if you are a robot<span><span></b</span>></span> </span> <span><span><span><div</span> <span>style<span>="<span>display:block;margin-bottom:20px;margin-top:20px;</span>"</span></span>></span> </span> <span><span><span><img</span> src<span>="image.png"</span>></span> </span> <span><span><span></div</span>></span> </span> //div1 ends <span><span><span></div</span>></span> //div2 ends </span> <span><span><?php </span></span><span> <span>} </span></span><span> </span><span> <span>function create_image() </span></span><span> <span>{ </span></span><span> <span>$image = imagecreatetruecolor(200, 50); </span></span><span> <span>imagepng($image, "image.png"); </span></span><span> <span>} </span></span><span> </span><span> <span>?></span> </span> <span><span><span></body</span>></span> </span><span><span><?php </span></span><span><span>?></span></span>
生成隨機線。
現在,我們實際上是從使驗證碼的失真部分開始。在PHP中,線從起點(x1,y1)到終點(x2,y2)生成。現在,當我們希望線條觸摸盒子的兩端時,我們將保持
> y坐標是rand()*p給出的,因為這是我們盒子的高度,並且始終將返回50以下的值。您可以使用rand(0,50)。它們將產生相同的輸出範圍。
<span>$background_color = imagecolorallocate($image, 255, 255, 255); </span><span>imagefilledrectangle($image,0,0,200,50,$background_color);</span>
生成隨機點。
隨機點將以與隨機線相同的方式生成。使用的函數是ImagesetPixel()。此函數採用將點將點放在框中的坐標值的值。 >
>我們將隨機指向字符串中的一個位置(其中包含在下層和高層中的字母),並將其分配給變量$ letter
><span><span><?php </span></span><span><span>session_start(); </span></span><span><span>?></span> </span> <span><span><span><title</span>></span>demo.php<span><span></title</span>></span> </span> <span><span><span><body</span> <span>style<span>="<span>background-color:#ddd; </span>"</span></span>></span> </span> <span><span><?php </span></span><span> <span>create_image(); </span></span><span> <span>display(); </span></span><span> <span>/***** definition of functions *****/ </span></span><span> <span>function display() </span></span><span> <span>{ </span></span><span> <span>?></span> </span> <span><span><span><div</span> <span>style<span>="<span>text-align:center;</span>"</span></span>></span> </span> <span><span><span><h3</span>></span>TYPE THE TEXT YOU SEE IN THE IMAGE<span><span></h3</span>></span> </span> <span><span><span><b</span>></span>This is just to check if you are a robot<span><span></b</span>></span> </span> <span><span><span><div</span> <span>style<span>="<span>display:block;margin-bottom:20px;margin-top:20px;</span>"</span></span>></span> </span> <span><span><span><img</span> src<span>="image.png"</span>></span> </span> <span><span><span></div</span>></span> </span> //div1 ends <span><span><span></div</span>></span> //div2 ends </span> <span><span><?php </span></span><span> <span>} </span></span><span> </span><span> <span>function create_image() </span></span><span> <span>{ </span></span><span> <span>$image = imagecreatetruecolor(200, 50); </span></span><span> <span>imagepng($image, "image.png"); </span></span><span> <span>} </span></span><span> </span><span> <span>?></span> </span> <span><span><span></body</span>></span> </span><span><span><?php </span></span><span><span>?></span></span>
放入循環時,看起來像
<span>$background_color = imagecolorallocate($image, 255, 255, 255); </span><span>imagefilledrectangle($image,0,0,200,50,$background_color);</span>
我們將解釋行
><span>$line_color = imagecolorallocate($image, 64,64,64); </span><span>for($i=0;$i<10;$i++) { </span> <span>imageline($image,0,rand()%50,200,rand()%50,$line_color); </span><span>}</span>
在下一節中。
函數Imagestring()在我們的圖像中寫入文本。它有6個參數:
X坐標的計算是通過檢查完成的。大概,這些字母的間距約為35個像素(5($ i*30)),其中$ i = 0,1,2,3,4,5,6。這是因為如果我們將這個值保持在15-20px左右,則可能會有兩個字母重疊。如果該值超過40px,則完全不適合盒子。
這將生成6個字母驗證碼文本。我們始終可以通過更改由於簡單性(例如顏色,Y-Coordine等)來創造更多的隨機性,例如最終的驗證碼看起來像這樣
>每次您刷新頁面時,在驗證碼中寫的文本都會更改。
可以通過使用像素或更改顏色或大小來創建設計來實現更多隨機性。 >
>在這裡採取用戶的響應,然後在處理後,他/她會收到答复。首先,使用輸入文本框和提交按鈕製作一個簡單的表單。根據複雜的Web應用程序的要求,可以有許多方法來處理驗證碼。但是,出於此示例,請保持簡單,我們將在同一頁面上對其進行處理。
$ word。 = $ letter; - 串聯操作員。用於一個接一個地附加所有單個字母,生成6個字母的單詞。
$ _ session ['catcha_string'] = $ word;我們的驗證碼字符串存儲在會話變量中,該變量將用於驗證目的。
><span><span><?php </span></span><span><span>session_start(); </span></span><span><span>?></span> </span> <span><span><span><title</span>></span>demo.php<span><span></title</span>></span> </span> <span><span><span><body</span> <span>style<span>="<span>background-color:#ddd; </span>"</span></span>></span> </span> <span><span><?php </span></span><span> <span>create_image(); </span></span><span> <span>display(); </span></span><span> <span>/***** definition of functions *****/ </span></span><span> <span>function display() </span></span><span> <span>{ </span></span><span> <span>?></span> </span> <span><span><span><div</span> <span>style<span>="<span>text-align:center;</span>"</span></span>></span> </span> <span><span><span><h3</span>></span>TYPE THE TEXT YOU SEE IN THE IMAGE<span><span></h3</span>></span> </span> <span><span><span><b</span>></span>This is just to check if you are a robot<span><span></b</span>></span> </span> <span><span><span><div</span> <span>style<span>="<span>display:block;margin-bottom:20px;margin-top:20px;</span>"</span></span>></span> </span> <span><span><span><img</span> src<span>="image.png"</span>></span> </span> <span><span><span></div</span>></span> </span> //div1 ends <span><span><span></div</span>></span> //div2 ends </span> <span><span><?php </span></span><span> <span>} </span></span><span> </span><span> <span>function create_image() </span></span><span> <span>{ </span></span><span> <span>$image = imagecreatetruecolor(200, 50); </span></span><span> <span>imagepng($image, "image.png"); </span></span><span> <span>} </span></span><span> </span><span> <span>?></span> </span> <span><span><span></body</span>></span> </span><span><span><?php </span></span><span><span>?></span></span>
>在進一步移動之前,我們必須知道何時顯示以及何時不顯示輸入框。它將僅顯示
>>每次單擊提交按鈕時,使用$標誌設置為“ 1”來滿足第一個條件。最初,它已設置為任何其他值。通過檢查我們的會話變量中存儲的值是否與用戶輸入相同(請參見下面的代碼)來實現第二個條件。
為了實現這一目標,我們將在本文開頭替換開始步驟的以下幾行:with:
<span>$background_color = imagecolorallocate($image, 255, 255, 255); </span><span>imagefilledrectangle($image,0,0,200,50,$background_color);</span>
請注意,函數create_image()和display()僅按照上述2個條件來調用。
<span>$line_color = imagecolorallocate($image, 64,64,64); </span><span>for($i=0;$i<10;$i++) { </span> <span>imageline($image,0,rand()%50,200,rand()%50,$line_color); </span><span>}</span>
>我們需要上一頁的會話變量,因此會話不會在此處銷毀。關閉瀏覽器窗口後,會話將自動銷毀。
>驗證碼看起來像
如果輸入不正確,則只有然後再次提示用戶。
如果輸入正確,則將向用戶顯示消息。
>有一個小警告 - 當用戶按下返回按鈕時,瀏覽器緩存中的任何圖像都不會重新加載,而頁面則可以。在發布請求中,瀏覽器返回按鈕將顯示一個“過期的文檔”頁面,但是當請求獲取時,圖像不會再生。
解決方案很簡單 - 每次創建圖像的唯一名稱,以便瀏覽器在緩存中找不到它們。我們將在創建和顯示在瀏覽器中時,將一個唯一的字符串通過內置時間()函數返回給我們。
。>在您開始會話的位置下方添加此行:
>用
<span>$pixel_color = imagecolorallocate($image, 0,0,255); </span><span>for($i=0;$i<1000;$i++) { </span> <span>imagesetpixel($image,rand()%200,rand()%50,$pixel_color); </span><span>} </span>>替換顯示()函數中的img src標籤
以及我們在create_image()函數中創建png映像的部分也將被
<span>$letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; </span><span>$len = strlen($letters); </span><span>$letter = $letters[rand(0, $len-1)]; </span> <span>$text_color = imagecolorallocate($image, 0,0,0);</span>替換
現在,圖像將被稱為Image39342015.png。此過程將隨著頁面的刷新而創建的圖像多次,這可能會浪費大量的磁盤空間,因此,我們將確保在創建圖像之前,刪除了PNG擴展名的所有其他圖像。在調用ImagePNG()函數之前添加以下內容。
<span>for ($i = 0; $i< 6;$i++) { </span> <span>$letter = $letters[rand(0, $len-1)]; </span> <span>imagestring($image, 5, 5+($i*30), 20, $letter, $text_color); </span> <span>$word.=$letter; </span><span>} </span><span>$_SESSION['captcha_string'] = $word;</span>
在生產應用程序中,只需確保您隔離存儲驗證碼圖像的文件夾,其他有用的圖像也可能會被刪除。
<span>$word.=$letter; </span><span>$_SESSION['captcha_string'] = $word; </span>>在此處下載完整的代碼。
>
經常詢問的問題(常見問題解答)關於帶有PHP GD>
>如何使我的驗證碼更安全?中完成此操作?幾個原因。一個常見的原因是,在PHP安裝中未安裝或啟用GD庫。您可以使用function_Exists('gd_info')函數檢查此功能。如果返回false,則未啟用GD。另一個原因可能是您的PHP代碼中的錯誤。確保檢查您的錯誤日誌是否有任何線索。
可以使用AJAX實現刷新驗證驗證功能。您需要創建一個JavaScript函數,該功能將請求發送到服務器以生成新的驗證碼。然後,該服務器使用新的驗證碼映像進行響應,然後在沒有完整頁面的網頁上更新網頁上。
>向您的聯繫表中添加驗證碼涉及修改表單的HTML和PHP代碼。在HTML中,您需要為驗證碼添加一個圖像標籤和一個輸入字段,以便用戶輸入驗證碼。在PHP中,您需要生成驗證碼並驗證用戶的輸入。
>如果您的驗證碼驗證不起作用,則可以到期有幾個原因。一個常見的原因是,會話變量未正確設置或檢索。在將任何輸出發送到瀏覽器之前,請確保調用Session_Start(),並且會話變量正在正確使用。另一個原因可能是用戶的輸入未與驗證碼正確進行比較。如果您的驗證碼包含上部和下案例字符,請確保使用不敏感的比較。
>>
bot仍然可以繞過我的驗證碼嗎?為防止機器人而設計,它們不是萬無一失的。高級機器人可以使用OCR(光學字符識別)讀取CAPTCHA字符。但是,通過使您的驗證碼更加複雜,例如使用字符的混合,添加噪音並定期更改驗證碼,您可以使bot更難繞過。以上是帶有PHP和GD的簡單驗驗的詳細內容。更多資訊請關注PHP中文網其他相關文章!