<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Captcha (anti-robot)]]></title><description><![CDATA[<p dir="auto">Bonjour à tous,<br />
J'ai fais un topic sur la création d'image et la sécu, et j'ai eu aucun commentaire :E<br />
mais bon là je vais faire un mélange des 2 je vais vous expliquer comment faire une captcha de base.</p>
<p dir="auto">Pour ceux qui ne qui n'ont jamais entendu parler des captcha, et non chapka (le chapeau russe), c'est le plus nouveau une suite de chiffre ou/et de lettre qu'il faut recopier lorsque l'on inscrit ou que l'on fait appel à un service sur un site.</p>
<p dir="auto">Contexte: On doit généré un code qui fait entre 3 et 5 caractères alphanumérique en majuscule sauf 0 (car c'est lourd mélanger le O et le 0).</p>
<pre><code>&lt;?php
	$chars = "123456789AZERTYUIOPQSDFGHJKLMWXCVBN"; // La liste des caractères possible
	$code = "";
	$code_len = rand(3, 5); // longueur de code aléatoire
	for ($i = 0; $i &lt; $code_len; $i++) {
		$code .= $chars[rand(0, strlen($chars)-1)]; // ajout d'un caractère au hasard
	}

	echo $code;
	?&gt;
</code></pre>
<p dir="auto">maintenant on génère un image avec:</p>
<pre><code>&lt;?php
	header('Expires: Mon, 1 Jan 2000 01:00:00 GMT'); // date à la quelle l'image doit d'être supprimée (il y a +14 ans xD)
	header('Cache-Control: no-store, no-cache, must-revalidate'); // on dit que ça doit pas mettre sauvegardé dans le cache
	header('Cache-Control: post-check=0, pre-check=0', false); // même chose
	header("Content-type: image/png"); // type d'image png, vous pouvez aussi mettre en jpeg et diminuer la qualité pour avoir un truc pour perturber les robots...

	$img = imagecreatetruecolor(120, 30); // génération d'une image de 120px de large et 30px de haut
	imagefill($img, 0, 0, 0xFFFFFF); // la couleur de fond est blanc dans ce cas-ci

	$chars = "123456789AZERTYUIOPQSDFGHJKLMWXCVBN"; // La liste des caractères possible
	$code = "";
	$code_len = rand(3, 5); // longueur de code aléatoire
	for ($i = 0; $i &lt; $code_len; $i++) {
		$code .= $chars[rand(0, strlen($chars)-1)]; // ajout d'un caractère au hasard
	}

	imagestring($img, 5, 20, 10, $code, 0x000000);

	imagepng($img);
	imagedestroy($img);
	?&gt;
</code></pre>
<p dir="auto">rendu: <img src="http://mars073.zz.mu/demo/captcha/captcha.old.png" alt="captcha.old.png" class=" img-fluid img-markdown" /><br />
fonction non-vu dans mon autre topic:</p>
<ul>
<li><a href="http://be2.php.net/manual/fr/function.imagecreatetruecolor.php" rel="nofollow ugc">imagecratetruecolor()</a> crée une image avec toute les couleurs (+16 million).</li>
<li><a href="http://be2.php.net/manual/fr/function.imagefill.php" rel="nofollow ugc">imagefill()</a> ça vous permet de remplir votre image d'une certaine couleur.</li>
<li><a href="http://be2.php.net/manual/fr/function.imagestring.php" rel="nofollow ugc">imagestring()</a> écrire un simple texte sur l'image.</li>
</ul>
<p dir="auto">0x000000 est l'équivalent du code couleur hexadécimal #000000 le système souvent utilisé en html, css, lua, etc. Normalement on utilise une variable (car les couleurs ne sont pas correctes de mémoire) le code pour le remplissage aurait donc due être:</p>
<pre><code>&lt;?php
	$blanc = imagecolorallocate($img, 255, 255, 255);
	imagefill($img, 0, 0, $blanc); // la couleur de fond est blanc dans ce cas-ci
	?&gt;
</code></pre>
<p dir="auto">la fonction <a href="http://be2.php.net/manual/fr/function.imagecolorallocate.php" rel="nofollow ugc">imagecolorallocate()</a> permet de déclarer une couleur en peu comme en css avec par exemple: "rgb( 255, 255, 255);".</p>
<p dir="auto">une image php peut se mettre au même titre que n'importe quelle image dans un code html:</p>
<pre><code>&lt;!-- Contexte: L'image php s'appel "captcha.php" et se trouve dans le même dossier que le code html --&gt;
&lt;img src="captcha.php" border="0"&gt;
&lt;input type="text" name="antirobot" placeholder="Recopier le code..."&gt;
</code></pre>
<p dir="auto">Mais comment on fait pour connaître code après? simplement avec une variable $_SESSION et au passage on va ajouter entre 2 et 6 lignes en arrière-plan.</p>
<pre><code>&lt;?php
	session_start();
	header('Expires: Mon, 1 Jan 2000 01:00:00 GMT'); // date à la quelle l'image doit d'être supprimée (il y a +14 ans xD)
	header('Cache-Control: no-store, no-cache, must-revalidate'); // on dit que ça doit pas mettre sauvegardé dans le cache
	header('Cache-Control: post-check=0, pre-check=0', false); // même chose
	header("Content-type: image/png"); // type d'image png, vous pouvez aussi mettre en jpeg et diminuer la qualité pour avoir un truc pour perturber les robots...

	$img = imagecreatetruecolor(120, 30); // génération d'une image de 120px de large et 30px de haut
	imagefill($img, 0, 0, 0xFFFFFF); // la couleur de fond et blanc dans ce cas-ci

	$chars = "123456789AZERTYUIOPQSDFGHJKLMWXCVBN"; // La liste des caractères possible
	$code = "";
	$code_len = rand(3, 5); // longueur de code aléatoire

	$line_n = rand(2, 6); // nombre de ligne aléatoire entre 2 et 6
	for ($i=0; $i &lt; $line_n; $i++) { 
		// position du point de départ et de fin de la ligne au hasard
		imageline($img, rand(1, imagesx($img)), rand(1, imagesy($img)), rand(1, imagesx($img)), rand(1, imagesy($img)), 0x000000);
	}

	for ($i = 0; $i &lt; $code_len; $i++) {
		$code .= $chars[rand(0, strlen($chars)-1)]; // ajout d'un caractère au hasard
	}
	$_SESSION['code'] = $code;
	imagestring($img, 5, 20, 10, $code, 0x000000);

	imagepng($img);
	imagedestroy($img)
	?&gt;
</code></pre>
<p dir="auto">fonctions:</p>
<ul>
<li><a href="http://be2.php.net/manual/fr/function.imageline.php" rel="nofollow ugc">imageline()</a> tracer une ligne sur une image avec un point de départ et un point de fin.</li>
<li><a href="http://be2.php.net/manual/fr/function.imagesx.php" rel="nofollow ugc">imagesx()</a> retourne la largeur de l'image.</li>
<li><a href="http://be2.php.net/manual/fr/function.imagesy.php" rel="nofollow ugc">imagesy()</a> retourne la hauteur de l'image.</li>
</ul>
<p dir="auto">Protégé contre les robots? haha t'es marrant, je te tuerais en dernier. En faite il est extrêmement compliqué... enfin les vrai robot pas les trucs en mousse codé en javascript ou en vb.</p>
<p dir="auto">maintenant on va faire en sorte que les lettres soient positionnées un peu aléatoirement:</p>
<pre><code>&lt;?php
	session_start();
	header('Expires: Mon, 1 Jan 2000 01:00:00 GMT'); // date à la quelle l'image doit d'être supprimée (il y a +14 ans xD)
	header('Cache-Control: no-store, no-cache, must-revalidate'); // on dit que ça doit pas mettre sauvegardé dans le cache
	header('Cache-Control: post-check=0, pre-check=0', false); // même chose
	header("Content-type: image/png"); // type d'image png, vous pouvez aussi mettre en jpeg et diminuer la qualité pour avoir un truc pour perturber les robots...

	$img = imagecreatetruecolor(120, 30); // génération d'une image de 120px de large et 30px de haut
	imagefill($img, 0, 0, 0xFFFFFF); // la couleur de fond et blanc dans ce cas-ci

	$chars = "123456789AZERTYUIOPQSDFGHJKLMWXCVBN"; // La liste des caractères possible
	$code = "";
	$code_len = rand(3, 5); // longueur de code aléatoire

	$line_n = rand(2, 6); // nombre de ligne aléatoire entre 2 et 6
	for ($i=0; $i &lt; $line_n; $i++) { 
		// position du point de départ et de fin de la ligne au hasard
		imageline($img, rand(1, imagesx($img)), rand(1, imagesy($img)), rand(1, imagesx($img)), rand(1, imagesy($img)), 0x000000);
	}

	for ($i = 0; $i &lt; $code_len; $i++) {
		$char = $chars[rand(0, strlen($chars)-1)]; // un caractère au hasard
		$code .= $char; // ajout du catactère
		imagestring($img, 5, 20+($i*12)+rand(-2, 2), 10+rand(-10, 5), $char, 0x000000);
	}
	$_SESSION['code'] = $code;

	imagepng($img);
	imagedestroy($img)
	?&gt;
</code></pre>
<p dir="auto">maintenant on va mettre des couleurs et flouter l'image avec une matrix:</p>
<pre><code>&lt;?php
	session_start();
	header('Expires: Mon, 1 Jan 2000 01:00:00 GMT'); // date à la quelle l'image doit d'être supprimée (il y a +14 ans xD)
	header('Cache-Control: no-store, no-cache, must-revalidate'); // on dit que ça doit pas mettre sauvegardé dans le cache
	header('Cache-Control: post-check=0, pre-check=0', false); // même chose
	header("Content-type: image/png"); // type d'image png, vous pouvez aussi mettre en jpeg et diminuer la qualité pour avoir un truc pour perturber les robots...

	$img = imagecreatetruecolor(120, 30); // génération d'une image de 120px de large et 30px de haut
	imagefill($img, 0, 0, 0xA3A3A3); // la couleur de fond et blanc dans ce cas-ci

	$chars = "123456789AZERTYUIOPQSDFGHJKLMWXCVBN"; // La liste des caractères possible
	$code = "";
	$code_len = rand(3, 5); // longueur de code aléatoire

	$line_n = rand(2, 6); // nombre de ligne aléatoire entre 2 et 6
	for ($i=0; $i &lt; $line_n; $i++) { 
		// position du point de départ et de fin de la ligne au hasard
		imageline($img, rand(1, imagesx($img)), rand(1, imagesy($img)), 
			rand(1, imagesx($img)), rand(1, imagesy($img)), "0x".dechex(rand(20, 200)).dechex(rand(20, 200)).dechex(rand(20, 200)));
	}

	for ($i = 0; $i &lt; $code_len; $i++) {
		$char = $chars[rand(0, strlen($chars)-1)]; // un caractère au hasard
		$code .= $char; // ajout du catactère
		imagestring($img, 5, 20+($i*12)+rand(-2, 2), 10+rand(-10, 5), $char, "0x".dechex(rand(180, 255)).dechex(rand(180, 255)).dechex(rand(180, 255)));
	}
	$_SESSION['code'] = $code;

	$flou = array(
		array(1.0, 2.0, 1.0), 
		array(2.0, 4.0, 2.0), 
		array(1.0, 2.0, 1.0)
	);
	imageconvolution($img, $flou, 16, 0);

	imagepng($img);
	imagedestroy($img)
	?&gt;
</code></pre>
<p dir="auto">ps: la fonction <a href="http://be2.php.net/manual/fr/function.dechex.php" rel="nofollow ugc">dechex()</a> permet de transformer un chiffre décimal en hexadécimale pour le code couleur.<br />
et donc le test de la captcha en requête POST (par exemple) donnerait:</p>
<pre><code>&lt;?php
	session_start();
	if (isset($_POST['antirobot'])) {
		if ($_POST['antirobot']==$_SESSION['code']) {
			echo "Le code est valide";
		} else {
			echo "Le code est incorrect";
		}
	}
	?&gt;
</code></pre>
<p dir="auto">Rendu final: <img src="http://mars073.zz.mu/demo/captcha/captcha.png" alt="captcha.png" class=" img-fluid img-markdown" /><br />
moche et compliqué à lire, c'est ça le principe? non à vous de modifier <img src="http://new.melinyel.net/assets/plugins/nodebb-plugin-emoji/emoji/android/1f61b.png?v=b824361be89" class="not-responsive emoji emoji-android emoji--stuck_out_tongue" style="height:23px;width:auto;vertical-align:middle" title=":P" alt="😛" /></p>
<p dir="auto">Bonne programmation à tous!<br />
Cordialement,<br />
Mars073</p>
]]></description><link>http://new.melinyel.net/topic/493/captcha-anti-robot</link><generator>RSS for Node</generator><lastBuildDate>Fri, 22 May 2026 16:53:33 GMT</lastBuildDate><atom:link href="http://new.melinyel.net/topic/493.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 11 Apr 2014 21:38:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Captcha (anti-robot) on Wed, 16 Apr 2014 22:59:46 GMT]]></title><description><![CDATA[<p dir="auto">Merci de ce tutoriel, je compte m'en servir rapidement sur un prochain site. <img src="http://new.melinyel.net/assets/plugins/nodebb-plugin-emoji/emoji/android/1f642.png?v=b824361be89" class="not-responsive emoji emoji-android emoji--slightly_smiling_face" style="height:23px;width:auto;vertical-align:middle" title=":)" alt="🙂" /></p>
<p dir="auto">+1 Rep.</p>
]]></description><link>http://new.melinyel.net/post/5656</link><guid isPermaLink="true">http://new.melinyel.net/post/5656</guid><dc:creator><![CDATA[Azad]]></dc:creator><pubDate>Wed, 16 Apr 2014 22:59:46 GMT</pubDate></item><item><title><![CDATA[Reply to Captcha (anti-robot) on Sat, 12 Apr 2014 00:17:25 GMT]]></title><description><![CDATA[<p dir="auto">un peu de patience il y avait "... rédaction en cours ..." en bas, pour dire que je n'avais pas fini <img src="http://new.melinyel.net/assets/plugins/nodebb-plugin-emoji/emoji/android/1f61b.png?v=b824361be89" class="not-responsive emoji emoji-android emoji--stuck_out_tongue" style="height:23px;width:auto;vertical-align:middle" title=":P" alt="😛" /></p>
<p dir="auto">s'il y a des trucs un peu chaud à comprendre faut me le dire je mets plus d'explications</p>
]]></description><link>http://new.melinyel.net/post/5354</link><guid isPermaLink="true">http://new.melinyel.net/post/5354</guid><dc:creator><![CDATA[mars073]]></dc:creator><pubDate>Sat, 12 Apr 2014 00:17:25 GMT</pubDate></item><item><title><![CDATA[Reply to Captcha (anti-robot) on Fri, 11 Apr 2014 22:44:22 GMT]]></title><description><![CDATA[<p dir="auto">C'est compliqué pour moi tout ça ^^ Est-ce qu'on pourrait avoir une image du rendu final ?</p>
]]></description><link>http://new.melinyel.net/post/5352</link><guid isPermaLink="true">http://new.melinyel.net/post/5352</guid><dc:creator><![CDATA[Soulalex]]></dc:creator><pubDate>Fri, 11 Apr 2014 22:44:22 GMT</pubDate></item></channel></rss>