이 글에서는 초간단 PHP 인증코드 식별 방법을 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.
인증코드는 웹사이트 로그인 페이지, 등록 페이지 등 어디에나 있는데, 당신의 인증코드는 정말 안전할까요? 어쩌면 간단한 작은 프로그램만 있으면 인증 코드가 가짜가 될 수도 있습니다. 이 기사는 단순한 구현일 뿐이며 너무 깊게 다루지는 않을 것입니다.
공격이 있는 곳에 방어가 있습니다
제가 이 글을 쓴 이유는 전적으로 제 동료의 공개 계정에 "연습-인증코드 작성"이라는 글이 올라왔기 때문입니다. Life 어디에서나 즐겨보세요~
인증코드 생성
코드를 복사하고 실행한 후 다음 인증코드를 생성하세요.
그림과 같이 이 인증코드의 형식은 다음과 같습니다. 특히 "표준"은 글꼴 크기가 동일하고 색상이 검은색이므로 많은 수고를 덜 수 있습니다.
이진화
프로그램은 이미지를 읽고 이를 이진화하며(핵심은 글꼴 색상의 임계값을 찾는 것입니다. 이 인증 코드는 모두 검은색이므로...) 프로그램은 픽셀 단위로 판단하여 어느 것인지 결정합니다. 해당 폰트가 속한 색상은 *로 표시되어 있고, 폰트가 아닌 색상은 0
위의 사진을 보면 대략적인 인증코드의 모습을 알 수 있습니다(YTAD)
YTAD
)分析图像,切割
切割出字符串(先切绿线,再分别切蓝线,这样即使这个字符上下移动一下,也不太容易影响我们的切割)
提取特征码
将字符串拆分后,我们多次获取验证码,将a-z,A-Z,0-9等验证码的特征码全部记录下来。
这个是提取出来的字母Y
이미지를 분석해서 잘라내기끈을 잘라냅니다(녹색 선을 먼저 잘라낸 후, 파란색 선을 따로 잘라서 캐릭터가 상하로 움직여도 우리의 절단에 쉽게 영향을 미치지 않습니다)
기능 코드 추출
문자열을 분할한 후 여러 번 인증 코드를 획득하여 a-z, A-Z, 0-9 및 기타 인증 코드의 모든 기능 코드를 기록했습니다.
< ;center>이것은 추출된 문자
Y
🎜🎜recognition🎜🎜인식 과정은 위의 과정을 반복하는 것입니다: 이진화->절단->특징 코드 추출, 비교 후 이전에 추출한 기능코드와 유사하면 괜찮습니다. 🎜🎜PHP 코드 구현🎜
/**
* 简单验证码识别
* @author zhjx922
*/
class vCode{
//字符特征码
private $_wordKeys = array (
'A' => '000**00000****000**00**0**0000****0000****0000************0000****0000****0000**',
'B' => '******00**000**0**0000****000**0******00**000**0**0000****0000****000**0******00',
'C' => '00*****00**000****00000***000000**000000**000000**000000**00000*0**000**00*****0',
'D' => '******00**000**0**0000****0000****0000****0000****0000****0000****000**0******00',
'E' => '*********00000**00000**00000******0**00000**00000**00000**00000*******',
'F' => '**********000000**000000**000000******00**000000**000000**000000**000000**000000',
'G' => '00*****00**000****000000**000000**000000**000*****0000****0000**0**000**00*****0',
'H' => '**0000****0000****0000****0000************0000****0000****0000****0000****0000**',
'I' => '******00**0000**0000**0000**0000**0000**0000**0000**00******',
'J' => '00****0000**0000**0000**0000**0000**0000***000****0**00***00',
'K' => '**0000****000**0**00**00**0**000****0000****0000**0**000**00**00**000**0**0000**',
'L' => '**00000**00000**00000**00000**00000**00000**00000**00000**00000*******',
'M' => '**0000*****00*************0**0****0**0****0**0****0000****0000****0000****0000**',
'N' => '**0000*****000******00******00****0**0****0**0****00******000*****000*****0000**',
'P' => '*******0**0000****0000****0000*********0**000000**000000**000000**000000**000000',
'Q' => '00****000**00**0**0000****0000****0000****0000****0**0****00****0**00**000****0*',
'R' => '*******0**0000****0000****0000*********0*****000**00**00**000**0**0000****0000**',
'S' => '0******0**0000****000000**0000000******0000000**000000**000000****0000**0******0',
'T' => '********000**000000**000000**000000**000000**000000**000000**000000**000000**000',
'U' => '**0000****0000****0000****0000****0000****0000****0000****0000**0**00**000****00',
'V' => '**0000****0000****0000**0**00**00**00**00**00**000****0000****00000**000000**000',
'W' => '**0000****0000****0000****0000****0**0****0**0****0**0*************00*****0000**',
'X' => '**0000****0000**0**00**000****00000**000000**00000****000**00**0**0000****0000**',
'Y' => '**0000****0000**0**00**000****00000**000000**000000**000000**000000**000000**000',
'Z' => '*******00000**00000**0000**0000**0000**0000**0000**00000**00000*******',
'a' => '00*****00**000**000000**0*********0000****000***0****0**',
'b' => '**000000**000000**000000**0***00***00**0**0000****0000****0000*****00**0**0***00',
'c' => '00*****00**000****000000**000000**0000000**000**00*****0',
'd' => '000000**000000**000000**00***0**0**00*****0000****0000****0000**0**00***00***0**',
'e' => '00****000**00**0**0000************0000000**000**00*****0',
'f' => '000****000**00**00**00**00**000000**0000******0000**000000**000000**000000**0000',
'g' => '0*****0***000*****000**0**000**00*****00**0000000******0**0000**0******0',
'h' => '**000000**000000**000000**0***00***00**0**0000****0000****0000****0000****0000**',
'i' => '00**0000**000000000***0000**0000**0000**0000**0000**00******',
'k' => '**00000**00000**00000**00**0**0**00****000****000**0**00**00**0**000**',
'l' => '***00**00**00**00**00**00**00**00**0****',
'm' => '*0**0**0**0**0****0**0****0**0****0**0****0**0****0**0**',
'n' => '**0***00***00**0**0000****0000****0000****0000****0000**',
'o' => '00****000**00**0**0000****0000****0000**0**00**000****00',
'p' => '**0***00***00**0**0000****0000****0000*****00**0**0***00**000000**000000',
'q' => '00***0**0**00*****0000****0000****0000**0**00***00***0**000000**000000**',
'r' => '**0****00***00**0**000000**000000**000000**000000**00000',
's' => '0******0**0000****0000000******0000000****0000**0******0',
't' => '00**000000**0000******0000**000000**000000**000000**000000**00**000****0',
'u' => '**0000****0000****0000****0000****0000**0**00***00***0**',
'v' => '**0000****0000**0**00**00**00**000****0000****00000**000',
'w' => '**0000****0000****0**0****0**0****0**0**********0**00**0',
'x' => '**0000**0**00**000****00000**00000****000**00**0**0000**',
'y' => '**0000****0000****0000****0000****0000**0**00***00***0***00000**0******0',
'z' => '******0000**000**000**000**000**0000******',
'0' => '000**00000****000**00**0**0000****0000****0000****0000**0**00**000****00000**000',
'1' => '00**000***00****0000**0000**0000**0000**0000**0000**00******',
'2' => '00****000**00**0**0000**000000**00000**00000**00000**00000**00000**00000********',
'3' => '0*****00**000**0000000**00000**0000***0000000**0000000**000000****000**00*****00',
'4' => '00000**00000***0000****000**0**00**00**0**000**0********00000**000000**000000**0',
'5' => '*******0**000000**000000**0***00***00**0000000**000000****0000**0**00**000****00',
'6' => '00****000**00**0**0000*0**000000**0***00***00**0**0000****0000**0**00**000****00',
'7' => '********000000**000000**00000**00000**00000**00000**00000**00000**000000**000000',
'8' => '00****000**00**0**0000**0**00**000****000**00**0**0000****0000**0**00**000****00',
'9' => '00****000**00**0**0000****0000**0**00***00***0**000000**0*0000**0**00**000****00',
);
/**
* 生成验证码
* @author 武老师
*/
public function make($verCode = '') {
if(empty($verCode)) {
$baseChars = 'ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789';
$verCode = '';
$codeCharLenth = 4;
for ($i = 1; $i $image,
'code' => $verCode
);
}
/**
* 获取原始图像数组
* @param string $imageString
* @return array
*/
public function getImage($imageString) {
$im = imagecreatefromstring($imageString);
list($width, $height) = getimagesizefromstring($imageString);
$image = array();
for($x = 0;$x $x) {
if($x != ($preX + 1)) {
$wordCount++;
}
$preX = $x;
for($y = 0;$y $image) {
$wordImage[$key] = $this->removeByLine($image);
}
return $wordImage;
}
/**
* 按行移除无用数据
* @param array $image
* @return array
*/
public function removeByLine($image) {
$isFilter = false;
foreach($image as $y => $yImage) {
if($isFilter == true || array_filter($yImage)) {
$isFilter = true;
} else {
unset($image[$y]);
}
}
krsort($image);
$isFilter = false;
foreach($image as $y => $yImage) {
if($isFilter == true || array_filter($yImage)) {
$isFilter = true;
} else {
unset($image[$y]);
}
}
ksort($image);
return $image;
}
/**
* 获取关键字字符串
* @param array $wordImage
* @return string
*/
public function getWordString($wordImage) {
$wordString = '';
foreach($wordImage as $image) {
foreach($image as $string) {
$wordString .= $string;
}
}
return $wordString;
}
/**
* 匹配关键字
* @param array $image
* @return array
*/
public function match($image) {
$match = array(
'min' => '',
'key' => ''
);
foreach($this->_wordKeys as $k => $v) {
$percent = 0.0;
similar_text($this->getWordString($image), $v, $percent);
if($match['min'] == '') {
$match['min'] = $percent;
$match['key'] = $k;
} else {
if($percent > $match['min']) {
$match['min'] = $percent;
$match['key'] = $k;
}
}
}
return $match;
}
/**
* 终端显示验证码
* @param $image
*/
public function show($image) {
foreach($image as $xImage) {
foreach($xImage as $yImage) {
echo $yImage;
}
echo PHP_EOL;
}
echo PHP_EOL;
}
}
$vCode = new vCode();
$codeImage = $vCode->make();
$imageString = $codeImage['image'];
$image = $vCode->getImage($imageString);
//原图
$vCode->show($image);
//去除干扰边框、拆字
$newImage = $vCode->remove($image);
$word = array();
$code = '';
foreach($newImage as $image) {
$vCode->show($image);
$code .= $vCode->match($image)['key'];
}
echo "生成的验证码为:{$codeImage['code']}" . PHP_EOL;
echo "识别的验证码为:{$code}" . PHP_EOL;
/*
//用来批量生成验证码的特征码。识别他人网站验证码,需要自己采集多张,人肉标记特征码
$vCode = new vCode();
$string = 'ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789';
$max = ceil(strlen($string) / 4);
$wordKeys = array();
for($i=0;$imake($code)['image'];
$image = $vCode->getImage($imageString);
$newImage = $vCode->remove($image);
foreach($newImage as $key => $image) {
$word = $vCode->getWordString($image);
isset($code[$key]) && $wordKeys[$code[$key]] = $word;
}
}
echo var_export($wordKeys);
*/
🎜실행 결과:🎜🎜🎜🎜🎜
위 내용은 매우 간단한 PHP 인증 코드 식별의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!