Heim  >  Artikel  >  Backend-Entwicklung  >  Extrem einfache Identifizierung des PHP-Bestätigungscodes

Extrem einfache Identifizierung des PHP-Bestätigungscodes

藏色散人
藏色散人nach vorne
2021-04-27 11:20:213847Durchsuche

Dieser Artikel führt Sie in die supereinfache Identifizierung des PHP-Bestätigungscodes ein. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.

Bestätigungscodes finden Sie überall auf der Anmeldeseite, der Registrierungsseite usw. der Website, aber ist Ihr Bestätigungscode wirklich sicher? Vielleicht genügt ein einfaches kleines Programm, und Ihr Bestätigungscode gleicht einer Fälschung. Dieser Artikel ist nur eine einfache Implementierung und wird nicht zu tief gehen.

Wo Angriff ist, gibt es Verteidigung

Ich habe diesen Artikel ausschließlich geschrieben, weil der öffentliche Account meines Kollegen einen Artikel mit dem Titel „Üben Sie – schreiben Sie einen Bestätigungscode“ veröffentlicht hat, und ich werde ihn einfach knacken und ihm einen geben Probieren Sie es aus. Leben Viel Spaß überall ~

Bestätigungscode generieren

Kopieren Sie den Code, führen Sie ihn aus und generieren Sie den folgenden Bestätigungscode:

Extrem einfache Identifizierung des PHP-Bestätigungscodes

Wie im Bild gezeigt, können wir feststellen, dass das Format dieses Bestätigungscodes ist Insbesondere „Standard“, die Schriftgröße ist gleich und die Farbe ist Schwarz, was uns viel Ärger erspart.

Binarisierung

Das Programm liest das Bild und binarisiert es (der entscheidende Punkt besteht darin, den Schwellenwert für die Schriftfarbe zu finden. Dieser Bestätigungscode ist komplett schwarz, also ...), und das Programm beurteilt Pixel für Pixel, um zu bestimmen, welche Schriftart, zu der es gehört. Die Farbe ist mit * markiert und die Nicht-Schriftfarbe ist mit 0 markiert.

Extrem einfache Identifizierung des PHP-Bestätigungscodes

/code>)YTAD)

分析图像,切割

切割出字符串(先切绿线,再分别切蓝线,这样即使这个字符上下移动一下,也不太容易影响我们的切割)

Extrem einfache Identifizierung des PHP-Bestätigungscodes

提取特征码

将字符串拆分后,我们多次获取验证码,将a-z,A-Z,0-9等验证码的特征码全部记录下来。

Extrem einfache Identifizierung des PHP-Bestätigungscodes

这个是提取出来的字母Y Analysieren Sie das Bild, schneiden Sie es aus

Schneiden Sie die Zeichenfolge aus (schneiden Sie zuerst die grüne Linie und dann die blaue Linie separat ab, sodass dies auch dann der Fall ist, wenn sich das Zeichen auf und ab bewegt beeinträchtigt unseren Schnitt nicht so leicht)

f.png "/>

Feature-Code extrahieren

Nachdem wir die Zeichenfolge geteilt haben, haben wir den Bestätigungscode mehrmals erhalten und alle Feature-Codes von a-z, A-Z, 0-9 und andere Bestätigungscodes aufgezeichnet.

Extrem einfache Identifizierung des PHP-BestätigungscodesExtrem einfache Identifizierung des PHP-Bestätigungscodes

< ;center>Dies ist der extrahierte Buchstabe Y🎜🎜Erkennung🎜🎜Der Erkennungsprozess besteht darin, den obigen Vorgang zu wiederholen: Binarisierung->Schneiden->Feature-Code extrahieren und dann Nach dem Vergleich der Ähnlichkeit mit dem zuvor extrahierten Feature-Code ist alles in Ordnung. 🎜🎜PHP-Code-Implementierung🎜
/**
 * 简单验证码识别
 * @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);
*/
🎜Laufende Ergebnisse:🎜🎜🎜🎜🎜

Das obige ist der detaillierte Inhalt vonExtrem einfache Identifizierung des PHP-Bestätigungscodes. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen