国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - 一個簡單安全的PHP驗證碼類 附調用方法

一個簡單安全的PHP驗證碼類 附調用方法

2021-01-29 16:37后青春期的詩 PHP教程

這篇文章主要為大家分享了一個簡單安全的PHP驗證碼類,附調用方法,感興趣的小伙伴們可以參考一下

一、驗證碼示例

一個簡單安全的PHP驗證碼類 附調用方法

二、php驗證碼類,secoder.class.php

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
<?php
/**
 * 安全驗證碼
 *
 * 安全的驗證碼要:驗證碼文字扭曲、旋轉,使用不同字體,添加干擾碼
 *
 * @author 流水孟春 <cmpan(at)qq.com>
 * @link http://labs.yulans.cn/YL_Security_Secoder
 * @link http://wiki.yulans.cn/docs/yl/security/secoder
 */
class YL_Security_Secoder {
 /**
 * 驗證碼的session的下標
 *
 * @var string
 */
 //public static $seKey = 'sid.sek ey.ylans.cn';
 public static $seKey = 'sid';
 public static $expire = 3000;  // 驗證碼過期時間(s)
 /**
 * 驗證碼中使用的字符,01IO容易混淆,建議不用
 *
 * @var string
 */
 public static $codeSet = '346789ABCDEFGHJKLMNPQRTUVWXY';
 public static $fontSize = 25;  // 驗證碼字體大小(px)
 public static $useCurve = true; // 是否畫混淆曲線
 public static $useNoise = true; // 是否添加雜點
 public static $imageH = 0;  // 驗證碼圖片寬
 public static $imageL = 0;  // 驗證碼圖片長
 public static $length = 4;  // 驗證碼位數
 public static $bg = array(243, 251, 254); // 背景
 
 protected static $_image = null;  // 驗證碼圖片實例
 protected static $_color = null;  // 驗證碼字體顏色
 
 /**
 * 輸出驗證碼并把驗證碼的值保存的session中
 * 驗證碼保存到session的格式為: $_SESSION[self::$seKey] = array('code' => '驗證碼值', 'time' => '驗證碼創建時間');
 */
 public static function entry() {
 // 圖片寬(px)
 self::$imageL || self::$imageL = self::$length * self::$fontSize * 1.5 + self::$fontSize*1.5;
 // 圖片高(px)
 self::$imageH || self::$imageH = self::$fontSize * 2;
 // 建立一幅 self::$imageL x self::$imageH 的圖像
 self::$_image = imagecreate(self::$imageL, self::$imageH);
 // 設置背景 
 imagecolorallocate(self::$_image, self::$bg[0], self::$bg[1], self::$bg[2]);
 // 驗證碼字體隨機顏色
 self::$_color = imagecolorallocate(self::$_image, mt_rand(1,120), mt_rand(1,120), mt_rand(1,120));
 // 驗證碼使用隨機字體
 //$ttf = dirname(__FILE__) . '/ttfs/' . mt_rand(1, 20) . '.ttf'; 4
 $ttf = dirname(__FILE__) . '/ttfs/4.ttf';
 
 if (self::$useNoise) {
 // 繪雜點
 self::_writeNoise();
 }
 if (self::$useCurve) {
 // 繪干擾線
 self::_writeCurve();
 }
 
 // 繪驗證碼
 $code = array(); // 驗證碼
 $codeNX = 0; // 驗證碼第N個字符的左邊距
 for ($i = 0; $i<self::$length; $i++) {
 $code[$i] = self::$codeSet[mt_rand(0, 27)];
 $codeNX += mt_rand(self::$fontSize*1.2, self::$fontSize*1.6);
 // 寫一個驗證碼字符
 imagettftext(self::$_image, self::$fontSize, mt_rand(-40, 70), $codeNX, self::$fontSize*1.5, self::$_color, $ttf, $code[$i]);
 }
 
 // 保存驗證碼
 isset($_SESSION) || session_start();
 $_SESSION[self::$seKey]['code'] = join('', $code); // 把校驗碼保存到session
 $_SESSION[self::$seKey]['time'] = time(); // 驗證碼創建時間
 
 header('Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate');
 header('Cache-Control: post-check=0, pre-check=0', false);
 header('Pragma: no-cache');
 header("content-type: image/png");
 
 // 輸出圖像
 imagepng(self::$_image);
 imagedestroy(self::$_image);
 }
 
 /**
 * 畫一條由兩條連在一起構成的隨機正弦函數曲線作干擾線(你可以改成更帥的曲線函數)
  
  *  高中的數學公式咋都忘了涅,寫出來
 * 正弦型函數解析式:y=Asin(ωx+φ)+b
 *  各常數值對函數圖像的影響:
 *  A:決定峰值(即縱向拉伸壓縮的倍數)
 *  b:表示波形在Y軸的位置關系或縱向移動距離(上加下減)
 *  φ:決定波形與X軸位置關系或橫向移動距離(左加右減)
 *  ω:決定周期(最小正周期T=2π/∣ω∣)
 *
 */
 protected static function _writeCurve() {
 $A = mt_rand(1, self::$imageH/2);     // 振幅
 $b = mt_rand(-self::$imageH/4, self::$imageH/4); // Y軸方向偏移量
 $f = mt_rand(-self::$imageH/4, self::$imageH/4); // X軸方向偏移量
 $T = mt_rand(self::$imageH*1.5, self::$imageL*2); // 周期
 $w = (2* M_PI)/$T;
  
 $px1 = 0; // 曲線橫坐標起始位置
 $px2 = mt_rand(self::$imageL/2, self::$imageL * 0.667); // 曲線橫坐標結束位置 
 for ($px=$px1; $px<=$px2; $px=$px+ 0.9) {
 if ($w!=0) {
 $py = $A * sin($w*$px + $f)+ $b + self::$imageH/2; // y = Asin(ωx+φ) + b
 $i = (int) ((self::$fontSize - 6)/4);
 while ($i > 0) {
  imagesetpixel(self::$_image, $px + $i, $py + $i, self::$_color); // 這里畫像素點比imagettftext和imagestring性能要好很多 
  $i--;
 }
 }
 }
 
 $A = mt_rand(1, self::$imageH/2);     // 振幅
 $f = mt_rand(-self::$imageH/4, self::$imageH/4); // X軸方向偏移量
 $T = mt_rand(self::$imageH*1.5, self::$imageL*2); // 周期
 $w = (2* M_PI)/$T;
 $b = $py - $A * sin($w*$px + $f) - self::$imageH/2;
 $px1 = $px2;
 $px2 = self::$imageL;
 for ($px=$px1; $px<=$px2; $px=$px+ 0.9) {
 if ($w!=0) {
 $py = $A * sin($w*$px + $f)+ $b + self::$imageH/2; // y = Asin(ωx+φ) + b
 $i = (int) ((self::$fontSize - 8)/4);
 while ($i > 0) {
  imagesetpixel(self::$_image, $px + $i, $py + $i, self::$_color); // 這里(while)循環畫像素點比imagettftext和imagestring用字體大小一次畫出(不用這while循環)性能要好很多
  $i--;
 }
 }
 }
 }
 
 /**
 * 畫雜點
 * 往圖片上寫不同顏色的字母或數字
 */
 protected static function _writeNoise() {
 for($i = 0; $i < 10; $i++){
 //雜點顏色
  $noiseColor = imagecolorallocate(
      self::$_image,
      mt_rand(150,225),
      mt_rand(150,225),
      mt_rand(150,225)
     );
 for($j = 0; $j < 5; $j++) {
 // 繪雜點
  imagestring(
   self::$_image,
   5,
   mt_rand(-10, self::$imageL),
   mt_rand(-10, self::$imageH),
   self::$codeSet[mt_rand(0, 27)], // 雜點文本為隨機的字母或數字
   $noiseColor
  );
 }
 }
 }
 
 /**
 * 驗證驗證碼是否正確
 *
 * @param string $code 用戶驗證碼
 * @param bool 用戶驗證碼是否正確
 */
 public static function check($code) {
 isset($_SESSION) || session_start();
 // 驗證碼不能為空
 if(empty($code) || empty($_SESSION[self::$seKey])) {
 //echo $_SESSION[self::$seKey]['code'].'1';
 return false;
  
 }
 // session 過期
 if(time() - $_SESSION[self::$seKey]['time'] > self::$expire) {
 unset($_SESSION[self::$seKey]);
 //echo $_SESSION[self::$seKey]['code'].'2';
 return false;
 //return 0;
 }
 
// if($code == $_SESSION[self::$seKey]['code']) {
 if(strtoupper($code) == $_SESSION[self::$seKey]['code']) { //不區分大小寫比較
 //echo $_SESSION[self::$seKey]['code'].'3';
 return true;
 }
 //echo $_SESSION[self::$seKey]['code'].'4';
 return false;
 
 }
}
 
 
// useage
/*
YL_Security_Secoder::$useNoise = false; // 要更安全的話改成true
YL_Security_Secoder::$useCurve = true;
YL_Security_Secoder::entry();
*/
 
/*
// 驗證驗證碼
if (!YL_Security_Secoder::check(@$_POST['secode'])) {
 print 'error secode';
}
*/

三、調用方法

1.顯示驗證碼頁面code.php

?
1
2
3
4
5
6
<?php
 session_start();
 require 'secoder.class.php'; //先把類包含進來,實際路徑根據實際情況進行修改。
 $vcode = new YL_Security_Secoder();  //實例化一個對象
 $vcode->entry();
?>

2.檢查驗證碼是否正確

?
1
2
3
4
5
6
7
8
9
<?php
 session_start();
 require 'secoder.class.php'; //先把類包含進來,實際路徑根據實際情況進行修改。
 $vcode = new YL_Security_Secoder();  //實例化一個對象
 //$vcode->entry();
 $code = $_GET['code'];
 echo $vcode->check($code); 
 //$_SESSION['code'] = $vc->getCode();//驗證碼保存到SESSION中
?>

3.驗證碼輸入框調用頁面

?
1
2
<img id="messageImg" src='images/tishis2.gif' width='16' height='16'> 單擊圖片重新獲取驗證碼<br>
<a href="#"><img src="code.php" onclick="javascript:this.src='code.php?tm='+Math.random();" />

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 四虎影院网 | 日韩欧美综合 | 成人黄色网 | 国产精品99在线观看 | 久久亚洲一区二区 | 欧美综合在线一区 | 成人精品视频在线观看 | 久久亚 | 中文字幕 亚洲一区 | 久久精品国产亚洲一区二区三区 | 中文字幕视频免费 | av网站大全免费 | 亚洲欧美日韩国产综合 | 视频一区二区三区免费观看 | 永久91嫩草亚洲精品人人 | 久久久久久99精品 | 欧美日韩国产一区二区三区在线观看 | 久久99精品久久久久久琪琪 | 黄色三级免费网站 | 毛片免费的 | 久久国产精品免费 | 亚洲视频在线看 | 先锋久久| 一呦二呦三呦国产精品 | 俺去操| 中文在线视频 | 成人在线播放 | 久久mm| 一本一道久久a久久精品综合 | 日韩中文字幕一区二区三区 | 91精品啪啪| 久久大陆 | 亚洲视频aaa | 日韩成人免费 | 精品无人乱码一区二区三区的优势 | 黄色片免费观看网站 | 国产精品二区一区二区aⅴ污介绍 | 精品久久久久久久久久久 | 中文字幕在线一区 | 国产电影一区二区三区图片 | 久久九|