PHP生成各種驗證碼和Ajax驗證

轉載鏈接:http://www.helloweba.com/view-blog-191.html

驗證碼在WEB應用中非常重要,通常用來防止用戶惡意提交表單,如惡意注冊和登錄、論壇惡意灌水等。本文將通過實例講解使用PHP生成各種常見的驗證碼包括數字驗證碼、數字+字母驗證碼、中文驗證碼、算術驗證碼等等以及其Ajax驗證過程。

查看演示DEMO下載源碼

PHP生成驗證碼圖片

PHP生成驗證碼的原理:使用PHP的GD庫,生成一張帶驗證碼的圖片,并將驗證碼保存在Session中。PHP生成驗證碼的大致流程有:

1、產生一張png的圖片;

2、為圖片設置背景色;

3、設置字體顏色和樣式;

4、產生4位數的隨機的驗證碼;

5、把產生的每個字符調整旋轉角度和位置畫到png圖片上;

6、加入噪點和干擾線防止注冊機器分析原圖片來惡意破解驗證碼;

7、輸出圖片;

8、釋放圖片所占內存。

應某位同學的要求,下面我們以

 

helloweba.com的文章評論所用的驗證碼為例,講解驗證碼的生成過程,直接上代碼。

session_start();
getCode(4,60,20);function getCode($num,$w,$h) {$code = "";for ($i = 0; $i < $num; $i++) {$code .= rand(0, 9);}//4位驗證碼也可以用rand(1000,9999)直接生成//將生成的驗證碼寫入session,備驗證時用$_SESSION["helloweba_num"] = $code;//創建圖片,定義顏色值header("Content-type: image/PNG");$im = imagecreate($w, $h);$black = imagecolorallocate($im, 0, 0, 0);$gray = imagecolorallocate($im, 200, 200, 200);$bgcolor = imagecolorallocate($im, 255, 255, 255);//填充背景imagefill($im, 0, 0, $gray);//畫邊框imagerectangle($im, 0, 0, $w-1, $h-1, $black);//隨機繪制兩條虛線,起干擾作用$style = array ($black,$black,$black,$black,$black,$gray,$gray,$gray,$gray,$gray);imagesetstyle($im, $style);$y1 = rand(0, $h);$y2 = rand(0, $h);$y3 = rand(0, $h);$y4 = rand(0, $h);imageline($im, 0, $y1, $w, $y3, IMG_COLOR_STYLED);imageline($im, 0, $y2, $w, $y4, IMG_COLOR_STYLED);//在畫布上隨機生成大量黑點,起干擾作用;for ($i = 0; $i < 80; $i++) {imagesetpixel($im, rand(0, $w), rand(0, $h), $black);}//將數字隨機顯示在畫布上,字符的水平間距和位置都按一定波動范圍隨機生成$strx = rand(3, 8);for ($i = 0; $i < $num; $i++) {$strpos = rand(1, 6);imagestring($im, 5, $strx, $strpos, substr($code, $i, 1), $black);$strx += rand(8, 12);}imagepng($im);//輸出圖片imagedestroy($im);//釋放圖片所占內存
}

代碼中,自定義函數getCode()詮釋了驗證碼的生成過程。運用PHP GD庫自帶的圖像處理函數,能輕松生成各種想要的圖片效果。

imagecreate():創建一個新圖像

imagecolorallocate():為圖像分配顏色

imagefill():填充圖像

imagerectangle():畫一個矩形(邊框)

imagesetstyle():設置畫線風格

imageline():畫一條線段

imagesetpixel():畫點像素

imagepng():以PNG格式將圖像輸出到瀏覽器或文件

imagedestroy():釋放圖片所占內存

將上述代碼保存為code_num.php,以便調用。

Ajax刷新和驗證

驗證碼生成后,我們要在實際的項目中應用,通常我們使用ajax可以實現點擊驗證碼時刷新生成新的驗證碼(有時生成的驗證碼肉眼很難識別),即“看不清換一張”。填寫驗證碼后,還需要驗證所填驗證碼是否正確,驗證的過程是要后臺程序來完成,但是我們也可以通過ajax來實現無刷新驗證。

我們建立一個前端頁面index.html,載入jquery,同時在body中加入驗證碼表單元素:

<p>驗證碼:<input type="text" class="input" id="code_num" name="code_num" maxlength="4" /> 
<img src="code_num.php" id="getcode_num" title="看不清,點擊換一張" align="absmiddle"></p>
<p><input type="button" class="btn" id="chk_num" value="提交" /></p>
html代碼中,<img src="code_num.php"即調用了生成的驗證碼,當點擊驗證碼時,刷新生成新的驗證碼:
$(function(){//數字驗證$("#getcode_num").click(function(){$(this).attr("src",'code_num.php?' + Math.random());});...
});

刷新驗證碼,其實就是重新請求了驗證碼生成程序,這里要注意的是調用code_num.php時要帶上隨機參數防止緩存。接下來填寫好驗證碼之后,點“提交”按鈕,通過$.post(),前端向后臺chk_code.php發送ajax請求。

$(function(){...$("#chk_num").click(function(){var code_num = $("#code_num").val();$.post("chk_code.php?act=num",{code:code_num},function(msg){if(msg==1){alert("驗證碼正確!");}else{alert("驗證碼錯誤!");}});});
});

后臺chk_code.php驗證:

session_start();$code = trim($_POST['code']);
if($code==$_SESSION["helloweba_num"]){echo '1';
}

后臺根據提交的驗證碼與保存在session中的驗證碼比對,完成驗證。

對于其他幾種驗證的生成和使用,其原理一樣,開發者可以根據需要,產生多種樣式的隨機驗證碼,本文演示demo中提供了數字驗證碼、數字+字母驗證碼、中文驗證碼、仿google驗證碼,算術驗證碼等,點擊這里看演示demo。限于篇幅,其他幾種驗證碼的生成代碼略過,敬請諒解。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276488.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276488.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276488.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

若川的2019年度總結,波瀾不驚

從2014年開始寫年度總結至今已經六個年頭了。正如孔子所說&#xff1a;逝者如斯夫&#xff0c;不舍晝夜。2019年的年度總結寫得比較晚&#xff0c;都快農歷新年了&#xff0c;此刻在家里繼續寫完這篇文章。往年基本是元旦之后幾天就寫完了。我的年度總結盡量寫得非技術人員也能…

如何正確選擇倉儲物流供應商?

如何正確選擇倉儲物流供應商&#xff1f; 以前有做電商的朋友向我咨詢過怎么去選擇優質的倉儲物流供應商&#xff1f;有哪些能做作為關鍵問題進行參考。作為一個優秀的合作伙伴是可以為客戶提供超乎預期的服務的&#xff0c;上海維佳供應鏈服務專業提供物流外包解決倉儲物流供應…

在虛機上安裝WIN2003

Moss2-turn on-WM;SJY;SJYM;666666備注&#xff1a;計算機名在網絡上必須是唯一的。姓名&#xff1a;WP; 單位&#xff1a;SJY; 計算機名稱&#xff1a;SJYP; 密碼&#xff1a;666666server 2003 R2版 MDGJK-PF6YQ-PD8DJ-RFQVM-7WKWG在“網絡設置”頁面上&#xff0c;單擊“典型…

python字典獲取關聯值_【Python實戰12】使用字典關聯數據

現在我的手里有了新的一組數據&#xff0c;數據內容如下&#xff1a;james.txt&#xff1a;James Lee,2002-3-14,2-34,3:21,2.34,2.45,3.01,2:01,2:01,3:10,2-22,2-01,2.01,2:16julie.txt&#xff1a;Julie Jones,2002-8-17,2.59,2.11,2:11,2:23,3-10,2-23,3:10,3.21,3-21,3.01…

Sending HTML content in an email using PHP

轉載鏈接&#xff1a;http://code.web-max.ca/misc_htmlemail.php 發送一個HTML格式的電子郵件&#xff0c;主要在郵件的頭信息中定義郵件正文的類型&#xff1a; Content-Type:text/html;charset"utf-8"。 示例&#xff1a; <?php// Example $HTML …

Realtime Ray Tracing RenderMan Point Cloud

這里演示的是演示的是光線與包圍盒測試。在裝備Winfast 8800GT 512M的臺式機上可以進行每秒4.6億次點到射線的距離計算計算&#xff0c;用于判斷點是否真正的與射線相交。外部數據的填充與準備延遲依舊是GPGPU應用的一個巨大門檻。白色是命中的包圍盒&#xff0c;綠色的就是射線…

SharePoint文檔上傳管理

前臺代碼: <% Control Language"C#" AutoEventWireup"true" CodeBehind"FileUpload.ascx.cs" Inherits"UploadFile.FileUpload" %><table><tr><td style"width:138px; height: 24px;">請選擇列表:…

如何制定有價值的目標

寫于2017年07月09日23:29現在修改發布到公眾號聲明原創公司會制定一系列目標&#xff0c;個人也可以制定一些目標&#xff0c;有利于自我學習成長。那么看我這篇文章可以告訴你如何制定有價值的目標。會制定有價值的目標&#xff0c;絕對超越很多人。SMART原則王健林之前說定個…

清除dns緩存命令行_怎么防止移動dns劫持,防止移動dns劫持要先了解什么是dns劫持...

本人以網絡技術出身&#xff0c;近兩年接觸CDN網絡&#xff0c;處理了一些CDN方面的網絡問題&#xff0c;大多數以運營商丟包&#xff0c;延遲抖動為主&#xff0c;也處理一些硬件故障&#xff0c;比如機械硬盤的讀寫io測試&#xff0c;內存條兼容性測試&#xff0c;服務器IPMI…

php 修改上傳文件大小 (max_execution_time post_max_size)

轉載鏈接&#xff1a;http://hi.baidu.com/ttl289/item/683c8223a54c6d0f76272cd7 有些朋友要通過自己的網站后臺&#xff0c;包括論壇&#xff0c;來上傳一些文件&#xff0c;php一般為2m&#xff0c;或8m&#xff08;以下我們按默認為2m&#xff09;&#xff0c;接下來就是來…

移動硬盤格式化(pc和mac共用)-菜鳥級解決方案[轉]

用pc的時候買了一個320G的移動硬盤&#xff0c;從來沒考慮過什么格式化的問題&#xff0c;插上就用了。 后來接觸mac才發現pc和mac在移動存儲設備的格式化上還是有不少沖突的。如果你的移動硬盤mac上不能修改&#xff0c;或者pc上找不到&#xff0c;那就盡情得批判萬惡的資本主…

【php】php的ssh2擴展的安裝

ssh2(secure shell2)&#xff0c;對于遠端主機提供高安全性的資料傳輸工作。安裝&#xff1a;1、首先要裝OpenSSL。 2、要安裝 libssh2../configure && make all install3、再然后&#xff0c;安裝PECL/ssh2可以使用 pear install ssh2安裝&#xff08;有的說是 pear i…

回答知乎問題:你寫過什么自認為驚艷的詩?

首次整理于 2019-07-27 22:04:00&#xff0c;現在整理發布在公眾號申明原創。整理了一下大學期間2012年&#xff5e;2016年發布在QQ空間&#xff0c;自己感覺寫得還行的七首“詩詞”。回答知乎問題&#xff1a;你寫過什么自認為驚艷的詩&#xff1f;中國古詩詞博大精深。小時候…

lighttpd安裝配置支持php

轉載鏈接&#xff1a;https://wiki.freebsdchina.org/howto/n/php_fastcgi_lighttpd 安裝lighttpd 記得在SPAWNFCGI前打勾 [X] SPAWNFCGI Depend on spawn-fcgi utility #cd /usr/ports/www/lighttpd #make config #make install clean 安裝php 模塊自己看自己需要 #cd /usr/p…

密碼可逆不可逆選擇_膝關節損傷不可逆!跑步要注意!

膝蓋同時也是運動者最常受傷的關節。根據美國運動醫學整型外科協會的報告&#xff0c;美國每年約有三百萬人拉傷、挫傷、或扭傷他們的膝部&#xff0c;其中約有一半是因為運動引起的。而對于跑者而言&#xff0c;影響最大的就是我們的膝關節。換言之&#xff0c;長跑的潛在危害…

MS CRM 2011 C#中獲取Web Resource

原創地址&#xff1a;http://www.cnblogs.com/jfzhu/archive/2013/02/15/2913077.html 轉載請注明出處 我在以前的文章中講過如何用JScript讀取web resource資源&#xff0c;我在本文中將要講解如何在C#中獲取web resource資源。 有時候可能有這樣的需求&#xff0c;你需要在一…

測試驅動開發

測試驅動開發: 測試驅動開發&#xff08;Test Driven Development,英文縮寫TDD&#xff09;是極限編程的一個重要組成部分&#xff0c;它的基本思想就是在開發功能代碼之前&#xff0c;先編寫測試代碼。也就是說在明確要開發某個功能后&#xff0c;首先思考如何對這個功能進行測…

面試官問:能否模擬實現JS的call和apply方法

寫于2018年11月30日&#xff0c;發布在掘金上閱讀量近一萬&#xff0c;現在發布到微信公眾號申明原創。相對比較基礎的知識&#xff0c;雖然日常開發可能用得比較少&#xff0c;各種源碼中有很多call和apply&#xff0c;需要掌握。前言這是面試官問系列的第三篇&#xff0c;旨在…

HTML中小meta的大作用

轉載鏈接&#xff1a;http://www.pconline.com.cn/pcedu/sj/wz/html/0401/293106.html meta是用來在HTML文檔中模擬HTTP協議的響應頭報文。meta 標簽用于網頁的<head>與</head>中&#xff0c;meta 標簽的用處很多。meta 的屬性有兩種&#xff1a;name和http-equiv。…

prometheus 發送恢復 值_Prometheus基礎知識介紹

【編者的話】本文會讓你了解Prometheus是什么&#xff0c;并讓你理解它在監控領域的適用場景。Prometheus起源很久以前&#xff0c;加利福尼亞州山景城有一家名為Google的公司。他們推出了大量產品&#xff0c;其中最著名的是廣告系統和搜索引擎平臺。為了運行這些不同的產品&a…