Solución:
Seguridad de la clave privada
Si bien las respuestas aquí definitivamente funcionan, están usando un GET
solicitud, que expone su clave privada (aunque https
se utiliza). En Google Developers, el método especificado es POST
.
Para más detalles: https://stackoverflow.com/a/323286/1680919
Verificación vía POST
function isValid()
{
try {
$url="https://www.google.com/recaptcha/api/siteverify";
$data = ['secret' => '[YOUR SECRET KEY]',
'response' => $_POST['g-recaptcha-response'],
'remoteip' => $_SERVER['REMOTE_ADDR']];
$options = [
'http' => [
'header' => "Content-type: application/x-www-form-urlencodedrn",
'method' => 'POST',
'content' => http_build_query($data)
]
];
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
return json_decode($result)->success;
}
catch (Exception $e) {
return null;
}
}
Sintaxis de matriz: Yo uso la sintaxis de matriz “nueva” ( [
and ]
en lugar de array(..)
). Si su versión de php aún no admite esto, tendrá que editar esas 3 definiciones de matriz en consecuencia (ver comentario).
Valores devueltos: Esta función devuelve true
si el usuario es válido, false
si no, y null
si ocurrió un error. Puede usarlo, por ejemplo, simplemente escribiendo if (isValid()) { ... }
esta es la solucion
index.html
<html>
<head>
<title>Google recapcha demo - Codeforgeek</title>
<script src="https://www.google.com/recaptcha/api.js"></script>
</head>
<body>
<h1>Google reCAPTHA Demo</h1>
<form id="comment_form" action="form.php" method="post">
<input type="email" placeholder="Type your email" size="40"><br><br>
<textarea name="comment" rows="8" cols="39"></textarea><br><br>
<input type="submit" name="submit" value="Post comment"><br><br>
<div class="g-recaptcha" data-sitekey="=== Your site key ==="></div>
</form>
</body>
</html>
verificar.php
<?php
$email; $comment; $captcha;
if(isset($_POST['email']))
$email=$_POST['email'];
if(isset($_POST['comment']))
$comment=$_POST['comment'];
if(isset($_POST['g-recaptcha-response']))
$captcha=$_POST['g-recaptcha-response'];
if(!$captcha){
echo '<h2>Please check the the captcha form.</h2>';
exit;
}
$response = json_decode(file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=YOUR SECRET KEY&response=".$captcha."&remoteip=".$_SERVER['REMOTE_ADDR']), true);
if($response['success'] == false)
{
echo '<h2>You are spammer ! Get the @$%K out</h2>';
}
else
{
echo '<h2>Thanks for posting comment.</h2>';
}
?>
http://codeforgeek.com/2014/12/google-recaptcha-tutorial/
No soy fanático de ninguna de estas soluciones. Yo uso esto en su lugar:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.google.com/recaptcha/api/siteverify");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
'secret' => $privatekey,
'response' => $_POST['g-recaptcha-response'],
'remoteip' => $_SERVER['REMOTE_ADDR']
]);
$resp = json_decode(curl_exec($ch));
curl_close($ch);
if ($resp->success) {
// Success
} else {
// failure
}
Yo diría que esto es superior porque te aseguras de que se envíe al servidor y no esté haciendo una llamada ‘file_get_contents’ incómoda. Esto es compatible con recaptcha 2.0 descrito aquí: https://developers.google.com/recaptcha/docs/verify
Encuentro este limpiador. Veo que la mayoría de las soluciones son file_get_contents, cuando creo que curl sería suficiente.