Para probarlo, he escrito un pequeño bot que intenta publicar la demostración visual de captcha .
Si primero inicia la sesión de captcha, decir es que solo quiere 2 opciones usando http://demo.visualcaptcha.net/start/2
. A continuación, elige uno de los dos resultados posibles y publica en http://demo.visualcaptcha.net/try
.
Resultado:
✓☓☓✓✓✓☓☓☓☓☓☓☓✓✓☓☓☓☓☓✓☓✓✓☓✓✓☓✓✓☓✓✓✓✓✓☓✓☓✓✓✓☓✓☓✓☓✓✓✓
☓✓✓☓✓☓✓✓☓☓✓☓✓✓☓☓✓☓✓✓✓☓✓☓☓✓✓☓✓☓✓☓☓☓☓☓✓✓☓☓✓☓☓✓☓✓☓☓☓✓
✓☓☓✓✓✓☓✓☓☓✓☓☓✓☓☓☓☓☓☓✓✓✓☓✓☓✓☓☓☓✓✓☓✓☓☓✓✓☓☓☓✓✓☓✓☓☓✓✓✓
☓✓☓✓✓☓☓✓✓☓☓☓✓☓☓✓☓✓☓✓✓☓☓☓✓✓☓✓☓✓✓✓✓✓✓✓✓✓☓☓✓☓☓☓✓✓☓✓✓☓
☓✓☓☓✓✓✓✓☓✓✓✓☓✓✓☓☓✓☓✓✓✓✓☓☓✓✓✓☓☓✓☓✓☓✓✓✓☓✓✓☓☓✓☓✓☓☓☓☓☓
Of the 250 tries, I succeeded 127 times and failed 123 times.
VisualCaptcha es claramente muy inseguro.
Usar un número fijo de imágenes (por ejemplo, 5), en lugar de dejar que el cliente elija el número de imágenes, ayudaría a reducir los intentos exitosos a 1 en 5. Aunque reconozco que no es suficiente para la mayoría de los casos de uso. p>
<?php
/**
* Try posting to the visualCaptcha demo
* @return boolean true if posted successfully
*/
function tryVisualCaptcha()
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_COOKIEJAR, "/tmp/visualcaptcha-cookies.txt");
curl_setopt($curl, CURLOPT_COOKIEFILE, "/tmp/visualcaptcha-cookies.txt");
curl_setopt($curl, CURLOPT_URL, "http://demo.visualcaptcha.net/start/2");
$ret = curl_exec($curl);
$result = json_decode($ret);
$post = [$result->imageFieldName => $result->values[0]];
curl_setopt($curl, CURLOPT_URL, "http://demo.visualcaptcha.net/try");
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));
curl_exec($curl);
$info = curl_getinfo($curl);
return strpos($info['redirect_url'], 'validImage') !== false;
}
// Main
$results = [0 => 0, 1 => 0];
for ($i = 1; $i <= 250; $i++) {
$success = tryVisualCaptcha();
$results[(int)$success]++;
echo $success ? "✓" : "☓", $i % 50 === 0 ? "\n" : "";
}
echo "Of the ", array_sum($results), " tries, I succeeded ", $results[1],
" times and failed ", $results[0], " times.\n";