比较全面的php session验证码与防分辨
比较全面的php session验证码与防识别
验证码开发过程中的3个误区:
1、?背景干扰:干扰线、干扰点、干扰图,基本没有,程序很容易通过高亮度调节去除掉。
2、?字符旋转:破解机器人通过数次学习、旋转之后,能够得到90%以上的正确识别率,采用常规字体,能够得到接近100%的识别。
3、?随机间距:基本没用,采用提取高亮度之后,采用图片切割的方法,很容易就将随机间距消灭掉。
?
防止被破解:
1、?背景干扰线尽量能够干扰到字符,采用和字符相同的颜色,能够破坏高亮度反差色提取法对字符的学习。QQ有采用。
2、?矢量变形:想Google、Ms、Yahoo都采用了这种变态的方法,这种将字符进行扭曲变形,基本上机器识别率为零,因为没有相对应的固定形状。损失是用户也不一定认得。需要验证码图片有一些大才行。
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>
?
?

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

Golang을 사용하여 개발하거나 학습하는 과정에서 undefound:rand.Seed라는 오류 메시지가 나타날 수 있습니다. 이 오류는 일반적으로 난수 생성기를 사용해야 할 때 발생합니다. Golang에서는 rand 패키지의 함수를 사용하기 전에 난수 시드를 설정해야 하기 때문입니다. 이 문서에서는 이 오류를 해결하는 방법을 설명합니다. 1. math/rand 패키지를 도입하려면 먼저 math/rand 패키지를 코드에 도입해야 합니다. 존재하다

이 기사에서는 무료 BingImageCreator를 사용하여 고품질 출력을 얻는 7가지 방법을 소개합니다. BingImageCreator(현재 Microsoft Designer용 ImageCreator로 알려짐)는 훌륭한 온라인 인공 지능 아트 생성기 중 하나입니다. 사용자 프롬프트를 기반으로 매우 사실적인 시각 효과를 생성합니다. 프롬프트가 더 구체적이고 명확하며 창의적일수록 결과는 더 좋아질 것입니다. BingImageCreator는 고품질 이미지 생성에 있어 상당한 진전을 이루었습니다. 이제 Dall-E3 트레이닝 모드를 사용하여 더 높은 수준의 디테일과 현실감을 보여줍니다. 그러나 일관되게 HD 결과를 생성하는 능력은 빠른 속도를 포함한 여러 요인에 따라 달라집니다.

Xiaomi 휴대폰에서 이미지를 삭제하는 방법 Xiaomi 휴대폰에서 이미지를 삭제할 수 있지만 대부분의 사용자는 이미지 삭제 방법을 모릅니다. 다음은 편집자가 가져온 Xiaomi 휴대폰에서 이미지 삭제 방법에 대한 튜토리얼입니다. 와서 우리와 함께 보자! Xiaomi 휴대폰에서 이미지를 삭제하는 방법 1. 먼저 Xiaomi 휴대폰에서 [앨범] 기능을 엽니다. 2. 그런 다음 불필요한 사진을 확인하고 오른쪽 하단에 있는 [삭제] 버튼을 클릭합니다. 상단의 특수 영역에 들어가려면 [휴지통]을 선택합니다. 4. 그런 다음 아래 그림과 같이 [휴지통 비우기]를 직접 클릭합니다. 5. 마지막으로 [영구 삭제]를 직접 클릭하여 완료합니다.

LINUX는 유연성과 사용자 정의 가능성으로 인해 많은 개발자와 시스템 관리자가 가장 먼저 선택하는 운영 체제입니다. LINUX 시스템에서 이미지 처리는 매우 중요한 작업이며 Imagemagick과 Image는 매우 인기 있는 이미지 처리 도구입니다. 이 기사에서는 Centos 시스템에 Imagemagick 및 Image를 설치하는 방법을 소개하고 자세한 설치 튜토리얼을 제공합니다. Imagemagic 설치 Centos 튜토리얼 Imagemagick은 명령줄에서 다양한 이미지 작업을 수행할 수 있는 강력한 이미지 처리 도구 세트입니다. 다음은 Centos 시스템에 Imagemagick을 설치하는 단계입니다.

rand() 함수는 각 호출에서 동일한 초기 시드를 사용합니다. 기본 초기 시드는 운영 체제의 시간에서 가져오지만 정확도는 마이크로초에 불과합니다. 즉, 매우 짧은 시간 내에 많은 rand() 함수 호출이 동일한 초기 시드를 사용하여 동일한 난수 생성이 발생합니다. 그렇다면 이 문제를 해결하는 방법은 무엇입니까?

Go 동시 프로그래밍에서 난수 생성 동기화: 뮤텍스(sync.Mutex)를 사용하여 rand.Rand 난수 생성기에 대한 액세스를 제어합니다. 각 고루틴은 난수를 생성하기 전에 뮤텍스 잠금을 획득하고 생성 후 뮤텍스 잠금을 해제합니다. 이렇게 하면 한 번에 하나의 고루틴만 난수 생성기에 액세스할 수 있어 데이터 경합이 제거됩니다.

1유니코드 컴퓨터 저장의 기본 단위는 8비트로 구성된 바이트(byte)이다. 영어는 26개의 문자와 여러 개의 기호로만 구성되므로 영어 문자를 바이트 단위로 직접 저장할 수 있습니다. 하지만 다른 언어(예: 중국어, 일본어, 한국어 등)는 문자 수가 많기 때문에 인코딩에 여러 바이트를 사용해야 합니다. 컴퓨터 기술이 확산됨에 따라 비라틴어 문자 인코딩 기술이 계속 발전하고 있지만 여전히 두 가지 주요 제한 사항이 있습니다. 다국어 지원이 불가능합니다. 한 언어의 인코딩 방식을 다른 언어에서 사용할 수 없으며 통일된 표준이 없습니다. 예를 들어 중국어에는 GBK, GB2312, GB18030 등과 같은 여러 인코딩 표준이 있습니다. 인코딩 방법이 통일되어 있지 않기 때문에 개발자는 서로 다른 인코딩 간에 전환해야 하며 많은 오류가 필연적으로 발생합니다.

__str__과 __repr__의 유사점과 차이점은 무엇입니까? 우리 모두는 문자열 표현을 알고 있습니다. Python의 내장 함수인 repr()은 식별을 용이하게 하기 위해 문자열 형식으로 객체를 표현할 수 있습니다. 이것이 "문자열 표현"입니다. repr()은 특수 메소드 __repr__을 통해 객체의 문자열 표현을 얻습니다. __repr__이 구현되지 않은 경우 벡터의 인스턴스를 콘솔에 인쇄하면 결과 문자열이 구현될 수 있습니다. >>>classExample:pass>>>print(str(Example()))>>>
