Comment implémenter la reconnaissance du code de vérification en PHP : binarisez d'abord l'image et enregistrez la valeur dans un tableau bidimensionnel ; puis trouvez la position de chaque nombre à travers une boucle puis calculez la position du nombre dans le ; positionner le tableau bidimensionnel dans le tableau et concaténer les nombres ; enfin, comparer et identifier la chaîne avec la chaîne de chaque police ;
Recommandé : "Tutoriel vidéo PHP"
Mais l'introduction originale est relativement simple et ne mention du processus spécifique de mise en œuvre de l’algorithme. Le processus détaillé est reproduit à partir de :
http://www.poboke.com/study/php-verification-code-identification-primary.html
Donc ceci L'article est basé sur un exemple pratique pour démontrer le processus par lequel PHP identifie le code de vérification et soumet le code de vérification au serveur pour vérification.
Première partie : Reconnaissance des codes de vérification
Récemment recherché quelques avancées dans la connaissance des codes de vérification et les a enregistrées. D'une part, c'est un résumé des connaissances apprises ces derniers jours pour m'aider à comprendre ; d'autre part, j'espère que cela sera utile aux étudiants techniques qui étudient cet aspect, d'autre part, moi aussi ; J'espère attirer l'attention des administrateurs de sites Web et prendre davantage en considération lors de la fourniture de codes de vérification. Comme je viens d'entrer en contact avec cet aspect de la connaissance, ma compréhension est relativement simple, donc les erreurs sont inévitables. N'hésitez pas à commenter.
La fonction du code de vérification : empêche efficacement un pirate informatique d'effectuer des tentatives de connexion continues sur un utilisateur enregistré spécifique en utilisant un programme spécifique pour forcer brutalement. En fait, les codes de vérification modernes empêchent généralement les machines de s'enregistrer par lots et de publier des réponses par lots. À l'heure actuelle, de nombreux sites Web utilisent la technologie des codes de vérification pour empêcher les utilisateurs d'utiliser des robots pour s'inscrire, se connecter automatiquement et envoyer du spam.
Le soi-disant code de vérification consiste à générer une image à partir d'une chaîne de chiffres ou de symboles générés aléatoirement. Certains pixels d'interférence sont ajoutés à l'image (pour empêcher l'OCR). L'utilisateur peut identifier visuellement les informations du code de vérification. et entrez-le dans le formulaire Soumettre la vérification du site Web, et une certaine fonction ne peut être utilisée qu'après une vérification réussie.
Notre code de vérification le plus courant :
1. Quatre chiffres, une chaîne aléatoire à un chiffre, le code de vérification le plus original, l'effet de vérification est presque nul.
2. Code de vérification d'image numérique aléatoire. Les caractères sur l'image sont assez réguliers, certains peuvent avoir un interféron aléatoire ajouté, et certains ont des couleurs de caractères aléatoires, donc l'effet de vérification est meilleur que le précédent. Les personnes sans connaissances de base en graphisme et en imagerie ne peuvent pas le casser !
3. Nombres aléatoires dans différents formats d'image + lettres anglaises majuscules aléatoires + pixels d'interférence aléatoires + positions aléatoires.
4. Les caractères chinois sont le dernier code de vérification pour l'enregistrement. Il est généré de manière aléatoire, ce qui rend la saisie plus difficile et affecte l'expérience utilisateur. Par conséquent, il est généralement utilisé moins fréquemment.
Par souci de simplicité, l'objet principal de notre explication cette fois est le premier type. Examinons d'abord plusieurs images de codes de vérification courants sur Internet.
Ces quatre styles peuvent essentiellement représenter les types de codes de vérification mentionnés en 2. Au départ, il semble que la première image soit la plus facile à déchiffrer, la seconde est la deuxième, la troisième est plus difficile et la quatrième est le plus facile à craquer.
Quelle est la situation réelle ? En fait, ces trois types d’images sont également difficiles à déchiffrer.
La première image est la plus simple. Le fond et les chiffres de l'image utilisent la même couleur, les caractères sont réguliers et les personnages sont dans la même position. Cet article utilise ce type de code de vérification comme exemple. Les étudiants peuvent créer eux-mêmes d'autres images.
La deuxième image ne semble pas facile, mais si vous l'étudiez attentivement, vous découvrirez ses règles. Peu importe la façon dont la couleur de fond et l'interféron changent, les caractères de vérification sont réguliers et de la même couleur, il est donc très facile de l'éliminer. l'interféron, tant qu'ils sont tous des pigments sans caractère, excluez-le simplement.
La troisième image semble être plus compliquée. En plus du changement de couleur de fond et d'interféron comme mentionné ci-dessus, la couleur des caractères de vérification change également, et les couleurs de chaque caractère sont également différentes.
La quatrième image, en plus des caractéristiques mentionnées dans la troisième image, ajoute deux lignes droites de taux d'interférence au texte. Cela semble difficile mais est en réalité facile à supprimer.
Ce qui suit utilise la « requête d'URL universelle » de Wanwang pour illustrer le processus d'identification du code de vérification.
Ouvrez Wanwang : http://www.net.cn, il y a une "Requête d'URL générale" dans la barre latérale droite du site :
Comme vous pouvez le voir, ceci est le premier Une sorte de code de vérification. Pour que l'œil humain reconnaisse les chiffres, la différence de couleur entre la couleur numérique et la couleur d'arrière-plan de l'image du code de vérification est relativement grande, donc sa valeur RBG est également très différente. peut être distingué en jugeant la valeur RVB de chaque pixel et de l'arrière-plan.
La reconnaissance du code de vérification est généralement divisée en les étapes suivantes :
1. Retirez la police
Identification du code de vérification, après tout, il ne s'agit pas d'une reconnaissance OCR professionnelle, et comme les codes de vérification de chaque site Web sont différents, la méthode la plus courante consiste à créer une bibliothèque de signatures de ce code de vérification. Lors de la suppression des polices, nous devons télécharger quelques images supplémentaires afin que ces images incluent tous les caractères. Les images ici ne contiennent que des chiffres, nous n'avons donc besoin de collecter que des images de nombres comprenant 0 à 9.
1. Actualisez le code de vérification plusieurs fois et enregistrez les images du code de vérification. Collectez toutes les images de 0 à 9.
2. Ouvrez l'image avec un logiciel de traitement d'image. J'utilise Fireworks. Appuyez sur ctrl+8 pour agrandir la vue de l'image 8 fois, afin que vous puissiez clairement observer l'image. chaque pixel.
Vous pouvez constater que la largeur de chaque nombre est de 6px, la hauteur est de 10px, l'intervalle entre les nombres est de 4px, le premier nombre est décalé de 2px à gauche et de 0px en haut. Ces numéros seront utilisés ultérieurement.
3. Découpez chaque numéro et enregistrez-le sous forme d'image, la taille est de 6*10.
2. Binarisation de l'image
La binarisation consiste à représenter chaque pixel du numéro de vérification de l'image par le numéro 1, et les autres parties par 0. moyens. Binarisez l'image à reconnaître et enregistrez les données dans un tableau bidimensionnel pour obtenir le tableau de caractéristiques de l'image.
1. Tout d'abord, séparez les chiffres de la couleur d'arrière-plan et de la couleur d'interférence, et utilisez le sélecteur de couleur de l'écran pour observer le motif de couleur.
On peut tirer une conclusion : les valeurs R, V et B de la couleur de fond sont toutes supérieures à 200, tandis qu'une des valeurs R, V et B de la la couleur numérique peut être inférieure à 200. Elle peut donc être facilement distinguée.
2. Le code php suivant sert simplement à démontrer le tableau bidimensionnel. Afin de voir visuellement les nombres, 1 et 0 sont remplacés par 0 et - :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
echo '<br><img src="v1.jpg"><br><br>';
getHec("v1.jpg");
fonction getHec($imagePath) {
$res = imagecreatefromjpeg($imagePath);
$taille = getimagesize($imagePath);
pour ($i = 0; $i < $taille[1]; ++$i) {
pour ($j = 0; $j < $taille[0]; ++$j) {
$rgb = imagecolorat($res, $j , $i);
$rgbarray = imagecolorsforindex($res, $rgb );
si ($rgbarray[ 'rouge'] < 200 || $rgbarray['vert']<200 || $rgbarray['bleu'] < 200) {
écho "0";
"" - ";
}
}
echo "<br>";
}
}
|
Les résultats sont présentés dans la figure ci-dessous :
Si la couleur de fond de l'image est plus complexe, la méthode de traitement est la même. Vous pouvez toujours trouver la valeur critique à distinguer. il faut l'observer soi-même.
3. Binarisation des polices numériques
Calculez les données binaires de chaque police numérique, enregistrez ces données et utilisez-les comme clés.
1. Binarisez l'image de la police numérique 0-9, supprimez la couleur de type pixel de l'image une par une, puis obtenez les valeurs R, V et B de chaque pixel, puis créez un jugement. Le code est le suivant :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
pour($i= 0;$i& lt;10;$ je++){
echo"'$i'=>'";
echogetHec("$i.jpg")."',<br>";
}
fonctiongetHec($imagePath){
$res= imagecreatefromjpeg($imagePath);
$taille=getimagesize($imagePath);
pour($i=0;$i<$taille[ 1];++$i){
pour($j=0;$j<$taille[ 0];++$j){
$rgb=imagecolorat($res,$j ,$i);
$rgbarray=imagecolorsforindex($res,$rgb );
si($rgbarray[ 'rouge']<200||$rgbarray[ 'vert']<200||$rgbarray['bleu']<200){
écho"1";
"" 0 ";
}
}
}
}
|
Résultat de sortie :
1
2
3
4
5
6
7
8
9
10
|
' 0'=>'0111101000011000011000011000011000011000011000011 00001011110',
'1'=>' =& gt;'011110100001100001000001000010000100001000010000110011111111','3'=>' 011110100001100001000010001100000010000001100001100001011110',
'4'=>'000100000100001100010100100100100100111111000100001100001111',
'5'=>' 111111100000100000101110110001000001000001100001100001011110',
'6'=>'001110010001100000100000101110110001100001100001100001011110',
'7'=>' =&
gt;'011110100001100001100001011110010010100001100001100001011110',
'9'=>' 0111001000101000011000011000011011101000001000001100010011100',
|
4. 🎜>Mettez les fonctionnalités de l'image à l'étape 2 Comparez le code avec le modèle de police du code de vérification à l'étape 3 pour obtenir les chiffres sur l'image de vérification.
Processus algorithmique (voir pièce jointe pour le code) :
1. Enregistrez la valeur binarisée de l'image dans un tableau bidimensionnel.
2. Trouvez la position de chaque numéro par boucle, en utilisant la largeur, la hauteur, l'espacement, le décalage gauche et le décalage supérieur du numéro obtenu précédemment.
Par exemple : décalage gauche du i-ème nombre = (largeur du nombre + intervalle) * i + décalage gauche. (w h Une chaîne similaire à un glyphe numérique.
4. Comparez la chaîne avec la chaîne de chaque police pour trouver la similitude. Prenez le nombre correspondant à la similitude la plus élevée, ou vous pouvez conclure qu'il s'agit d'un certain nombre lorsque la similitude atteint plus de 95 %.
5. Les résultats de la reconnaissance sont les suivants :
En utilisant la méthode actuelle, la reconnaissance du code de vérification peut être fondamentalement de 100 %.
À travers les étapes ci-dessus, vous avez peut-être dit que vous n'aviez pas découvert comment éliminer l'interféron ! En fait, la méthode pour éliminer l'interféron est très simple. Une caractéristique importante de l'interféron est qu'il ne peut pas affecter l'effet d'affichage du code de vérification. Ainsi, lors de la création de l'interféron, son RVB peut être inférieur ou supérieur à une certaine valeur, comme dans l'exemple que j'ai donné Dans l'image, les valeurs RVB de l'interféron ne seront pas inférieures à 200, nous pourrons donc facilement éliminer l'interféron.
Téléchargement du code source : http://yunpan.cn/cmJCkEnyGij3t
Mot de passe d'accès d2ba
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!