it-swarm-eu.dev

$ captcha-> CheckAnswer () restituisce sempre false

Dopo molte lotte, ho capito come implementare lo standard reCaptcha di Joomla.

Ma ora il mio problema è la verifica sul lato server.

I passaggi di reCaptcha:

  1. Ho un modulo con il recaptcha implementato in questo modo (funziona benissimo) :

    $captcha_plugin = JFactory::getConfig()->get('captcha');
    if ($captcha_plugin != '0') {
        $captcha = JCaptcha::getInstance($captcha_plugin);
        $field_id = 'captcha';
        print $captcha->display($field_id, $field_id, 'g-recaptcha');
    }
    
  2. Al momento dell'invio, invio un AJAX chiamata a questo URL (funziona bene) :

    'index.php?option=com_content&format=ajax&view=article&task=loginUser&tmpl=component' È un file che ho creato all'interno di com_content> views> article

  3. Il codice nel mio loginUser task/function ( non validante , vedi fine domanda)

    public function _logInUser( $form ){
        $captcha_plugin = JFactory::getConfig()->get('captcha');
        $captcha = JCaptcha::getInstance($captcha_plugin);
        $completed = $captcha->CheckAnswer($form[2]['value']);
        var_dump($form);
        echo $form[2]['value'];
        var_dump($completed);
        die();
    

Aggiornamento: ho anche provato in questo modo, mi dà ancora false quando dovrebbe tornare vero:

JPluginHelper::importPlugin('captcha');
$dispatcher = JEventDispatcher::getInstance();
$res = $dispatcher->trigger('onCheckAnswer',$form[2]['value']);
if(!$res[0]){
    var_dump($res);
    die('Invalid Captcha');
}
var_dump($res);
die();

echo $form[2]['value']; Restituisce "" quando non si fa clic su captcha e restituisce qualcosa del genere quando si fa clic: "03AMGVjXgaSV3U5UnezVUIFslFElvrMDe2gOVoJtEwtT9SVMaqG47cyC16CPrl01H3yKVF1y4aaBOnK-E1AeBa1H8XoBE17fN-8L3j0_W5mvO8g9kbrVg-yYEuk1B9lSTWxYfn9kf23yPTY-wlIOijh04vqBwUTLFoiTL-Jw9Ae-l2uvgVrnb1qyBrYt5dtvfRWvwbAx6h6qGXh4WBZz19eFkTv5mTmheGsp4s-5e-VtiqMEQJynNxE0fjxqQxKNyCECAK6SRbtLdZ8NTlDAG4dOd4zfb-R2aIYxwvPOxLjxrlO_5xggTOwqA"

Quindi deve funzionare.

ma questa riga restituisce sempre false: $completed = $captcha->CheckAnswer($form[2]['value']);

e quando si rimuove $form[2]['value'] in $captcha->CheckAnswer

Ottengo questo risultato:

Avviso: argomento 1 mancante per Joomla\CMS\Captcha\Captcha :: checkAnswer (), chiamato in /customers/a/c/e/test-mysite.dk/httpd.www/test/components/com_content/ views/article/view.ajax.php sulla riga 35 e definito in /customers/a/c/e/test-mysite.dk/httpd.www/test/libraries/src/Captcha/Captcha.php sulla riga 192 Avviso: Variabile non definita: codice in /customers/a/c/e/test-mysite.dk/httpd.www/test/libraries/src/Captcha/Captcha.php sulla riga 200

INFO AGGIORNAMENTO per i futuri lettori!: Joomla NON fornisce reCaptcha per il modulo di accesso. Solo per la registrazione e il modulo di contatto. L'ho trovato qui: https://forum.joomla.org/viewtopic.php?t=910764

2
JonasB

Pugno di tutto, PHP fa distinzione tra maiuscole e minuscole. Ciò significa che CheckAnswer e checkAnswer non sono gli stessi (notare la maiuscola c).

L'uso corretto è $captcha->checkAnswer('your_captcha_id').
Qual è il problema con il tuo approccio:
Stai passando il risultato del post del captcha come ID del tuo captcha.

Dato che hai usato captcha come $field_id Quando hai incluso il captcha, dovresti scrivere $captcha->checkAnswer('captcha') per controllare la risposta.

2

Non è mai riuscito a funzionare con $captcha->checkAnswer() di Joomla.

Quindi, invece, ho omesso la soluzione di controllo di Joomla e sono andato direttamente all'API di controllo di Google.

Ecco il codice che sto usando con successo per la parte di controllo:

$secretKey = "my_secret_key";
$ip = $_SERVER['REMOTE_ADDR'];
$response=file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$secretKey."&response=".$form[2]['value']."&remoteip=".$ip);
var_dump($response);

$form[2]['value'] è la risposta di reCaptcha

1
JonasB