首頁 後端開發 php教程 比较全面的php session验证码与防分辨

比较全面的php session验证码与防分辨

Jun 13, 2016 am 10:59 AM
break image rand str

比较全面的php session验证码与防识别

验证码开发过程中的3个误区:

1、?背景干扰:干扰线、干扰点、干扰图,基本没有,程序很容易通过高亮度调节去除掉。

2、?字符旋转:破解机器人通过数次学习、旋转之后,能够得到90%以上的正确识别率,采用常规字体,能够得到接近100%的识别。

3、?随机间距:基本没用,采用提取高亮度之后,采用图片切割的方法,很容易就将随机间距消灭掉。

?

防止被破解:

1、?背景干扰线尽量能够干扰到字符,采用和字符相同的颜色,能够破坏高亮度反差色提取法对字符的学习。QQ有采用。

2、?矢量变形:想GoogleMsYahoo都采用了这种变态的方法,这种将字符进行扭曲变形,基本上机器识别率为零,因为没有相对应的固定形状。损失是用户也不一定认得。需要验证码图片有一些大才行。

3、?字符粘连,可以破坏掉字符切割法分割字符,Google也有用到这个,QQ也有采用。

4、?中文验证码,中文验证码的识别难度比较大,但是现在逐渐的也慢慢被学习并且破解。(香港,台湾是用繁体)

5、?字符旋转:需要和字符粘连在一起才能够起作用,他们一起,验证码几乎不具备机器破解可能性。加随机背景图片、随机字体、稍微旋转字母或数字,位置不固定,稍微扭曲

?

注意:

字体.ttf的当$mode=7的该字体必须支持中文,否则出现乱码。

在服务端做验证时取session存储的验证字符与用户提交的字符进行比较,相同则通过验证。

<?php/** @Date 2011-2-24* @Author hudeyong926*/function getCode($length = 32, $mode = 0) {	switch ($mode) {		case '1' :			$str = '123456789';			break;		case '2' :			$str = 'abcdefghijklmnopqrstuvwxyz';			break;		case '3' :			$str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';			break;		case '4' :			$str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';			break;		case '5' :			$str = 'ABCDEFGHIJKLMNPQRSTUVWXYZ123456789';			break;		case '6' :			$str = 'abcdefghijklmnopqrstuvwxyz1234567890';			break;		case '7' ://中文验证码			break;		default :			$str = 'ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789';			break;	}	$result = '';	for($i = 0; $i < $length; $i ++) {		if ($mode == 7) {			$str [$i] = chr ( mt_rand ( 176, 215 ) ) . chr ( mt_rand ( 161, 249 ) );			$str [$i] = iconv ( "GB2312", "UTF-8", $str [$i] ); //imagettftext是utf-8的,所以先转换下			$result .= $str [$i];		} else {			$l = strlen ( $str ) - 1;			$num = mt_rand ( 0, $l );			$result .= $str [$num];		}	}	return $result;}//建立验证图片function createAuthNumImg($randStr, $fontName, $imgW = 100, $imgH = 40) {	header ( "content-type: image/png" );	$image = imagecreate ( $imgW, $imgH );	$fontSize = 20;//字号	//$green = imagecolorallocate($image,0x6b,0xc1,0x46);	$gray = imagecolorallocate ( $image, 228, 228, 228 ); //灰色	$red  = imagecolorallocate ( $image, 255, 102, 204 );//粉色 	$blue = imagecolorallocate($image,0x53,0x68,0xbd);	$colors = array($red, $gray, $blue);		$color_b = imagecolorallocate ( $image, 0, 0, 0 ); //黑色	for($i = 0; $i < 1000; $i ++) { //绘背景干扰点		imagesetpixel ( $image, mt_rand ( 0, $imgW ), mt_rand ( 0, $imgH ), $colors[rand(0,count($colors)-1)]);	}	imagerectangle ( $image, 0, 0, $imgW - 1, $imgH - 1, $color_b );//绘制边框	imagettftext ( $image, $fontSize, 5, 3, 25, $color_b, $fontName, $randStr);///将验证字符绘入图片 字符旋转		for($i=0; $i<2; $i++){ //绘背景干扰线		imageline($image, mt_rand(0,5), mt_rand(6,18), mt_rand(65,$imgW), mt_rand(6,$imgH), $color_b);//一条干扰线	}		imagepng ( $image );	imagedestroy ( $image );}session_start ();$verifyCode = GetCode ( 5 );$_SESSION ['VERIFY_CODE'] = $verifyCode ;createAuthNumImg ( $verifyCode, "font.ttf", 75, 30); //字体存放路径,如果你没有文件就去C:\WINDOWS\Fonts文件中找一个吧。/** 问答模式$a=GetCode(2,1);  $b=GetCode(1,1);  $passPort = $a."+".$b."=?";  $verifyCode = $a+$b;  $_SESSION ['VERIFY_CODE'] = $verifyCode ;  createAuthNumImg ( $passPort, "font.ttf", 75, 30);*/?>
登入後複製

中文占两个字符长度,需要控制验证码图片的长度,一个中文位置相当于2个非中文

<?php echo strlen('中'); echo strlen('ad');?>
登入後複製

为了避免机器人的破解,验证码的视觉效果越来越差,随之很多网站就加了“看不清?请刷新”之类的功能,当然也不是简简单单的页面刷新,是只刷新验证码部分,用户从而得到一个新的验证码。在网上看了些别人写的方法,下面总结两种。
第一种比较简单,运用一下onclick即可,直接点击验证码的图片就可以刷新,不过最好在验证码后面说明一下,提示有这个功能。

<img src="/static/imghw/default1.png"  data-src="validimg.jsp"  class="lazy" alt="看不清?请刷新"    style="max-width:90%"  style="max-width:90%" onclick="this.src=this.src+'?'+Math.random()" />
登入後複製

第二种则是用JavaScript的方法:

<img  src="/static/imghw/default1.png"  data-src="validimg.jsp"  class="lazy"    style="max-width:90%"  style="max-width:90%"  alt="比较全面的php session验证码与防分辨" > <a href="JavaScript:reloadImage("validimg.jsp" );">刷新</a><script language="JavaScript">function reloadImage(url){document.formName.img1.src = url+Math.random();}</script>
登入後複製
?

?

?

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
如何解決 golang 中的 'undefined: rand.Seed” 錯誤? 如何解決 golang 中的 'undefined: rand.Seed” 錯誤? Jun 25, 2023 am 08:34 AM

在使用Golang進行開發或學習過程中,我們可能會遇到undefined:rand.Seed的錯誤提示。這個錯誤通常會在需要使用隨機數產生器時出現,因為在Golang中需要先設定一個隨機數種子,才能使用rand套件中的函數。本篇文章將介紹如何解決這種錯誤。 1.引入math/rand包首先,我們需要在程式碼中引入math/rand包。在

如何免費使用Bing Image Creator 如何免費使用Bing Image Creator Feb 27, 2024 am 11:04 AM

本文將介紹七種利用免費的BingImageCreator獲得高品質輸出的方法。 BingImageCreator(現稱為MicrosoftDesigner的ImageCreator)是一個出色的線上人工智慧藝術生成器之一。它能根據使用者的提示產生高度逼真的視覺效果。提示越具體、清晰和創意,生成的效果也會更出色。 BingImageCreator在創建高品質影像方面取得了重大進展。現在它使用Dall-E3訓練模式,顯示出更高水準的細節和現實主義。然而,它能否始終如一地產生高清結果取決於幾個因素,包括快速

小米手機image怎麼刪除 小米手機image怎麼刪除 Mar 02, 2024 pm 05:34 PM

小米手機image怎麼刪除?在小米手機中是可以刪除image,但是多數的用戶不知道image如何的刪除,接下來就是小編為用戶帶來的小米手機image刪除方法教程,感興趣的用戶快來一起看看吧!小米手機image怎麼刪除1、先打開小米手機中的【相簿】功能;2、然後勾選不需要的圖片,點擊右下角的【刪除】按鈕;3、之後點擊最頂部的【相簿】進入到專區,選擇【回收站】;4、接著直接點選下圖所示的【清空回收站】;5、最後直接點選【永久刪除】即可完成。

Imagemagic安裝Centos及Image安裝教學課程 Imagemagic安裝Centos及Image安裝教學課程 Feb 12, 2024 pm 05:27 PM

LINUX是一種開源的作業系統,它的靈活性和可自訂性使得它成為了許多開發者和系統管理員的首選,在LINUX系統中,映像處理是一個非常重要的任務,而Imagemagick和Image是兩個非常受歡迎的影像處理工具,本文將為您介紹如何在Centos系統中安裝Imagemagick和Image,並提供詳細的安裝教學。 Imagemagic安裝Centos教學Imagemagick是一個功能強大的影像處理工具集,它可以在命令列下執行各種映像操作,以下是在Centos系統上安裝Imagemagick的步驟:1

php rand函數產生相同隨機數怎麼解決 php rand函數產生相同隨機數怎麼解決 Mar 23, 2023 am 09:17 AM

rand()函數在每次呼叫時使用相同的初始種子(seeds)。預設的初始種子是從作業系統的時間獲得的,但是它只有微秒的精確度。也就是說,在極短的時間內,許多rand()函數呼叫都會使用相同的初始種子,導致相同的隨機數產生。那麼,如何解決這個問題呢?

如何在 Golang 平行處理中同步隨機數產生? 如何在 Golang 平行處理中同步隨機數產生? Jun 03, 2024 pm 02:53 PM

在Go並發程式設計中同步隨機數產生:使用互斥鎖(sync.Mutex)控制對rand.Rand隨機數產生器的存取。每個goroutine在產生隨機數前取得互斥鎖,並在產生後釋放互斥鎖。這確保了同一時間只有一個goroutine可以存取隨機數產生器,消除了資料爭用。

Python內建類型str原始碼分析 Python內建類型str原始碼分析 May 09, 2023 pm 02:16 PM

1Unicode電腦儲存的基本單位是位元組,由8個位元組組成。由於英文只由26個字母加若干符號組成,因此英文字元可以直接用位元組來保存。但是其他語言(例如中日韓等),由於字元眾多,不得不使用多個位元組來進行編碼。隨著電腦科技的傳播,非拉丁文字元編碼技術不斷發展,但是仍有兩個比較大的限制:不支援多語言:一種語言的編碼方案不能用於另一種語言沒有統一標準:例如中文就有GBK、GB2312、GB18030等多種編碼標準由於編碼方式不統一,開發人員就需要在不同編碼之間來回轉換,不可避免地會出現很多錯

Python中__str__和__repr__有什麼異同點 Python中__str__和__repr__有什麼異同點 Apr 29, 2023 pm 07:58 PM

__str__和__repr__有什麼異同?字串的表示形式我們都知道,Python的內建函數repr()能夠把物件用字串的形式表達出來,方便我們辨認。這就是“字串表示形式”。 repr()就是透過__repr__這個特殊方法得到一個物件的字串表示形式的。如果沒有實作__repr__,當我們在控制台裡列印一個向量的實例時,得到的字串可能會是。 >>>classExample:pass>>>print(str(Example()))>>>

See all articles