Avatar billede Asky Forsker
08. marts 2025 - 09:53 Der er 23 kommentarer

Problemer med Catcha

Capcha problemer
I lang tid har jeg haft en Capcha til at virke upåklageligt, men nu får jeg hele tiden fejl selvom captha-tallene er korrekte. I starten at min response -fil står der:
session_start();
if ($_POST["vercode"] != $_SESSION["vercode"] OR $_SESSION["vercode"]=='') die("Koden er forkert! Tryk tilbage!");{
          } ;
Men selvom tallene er rigtige får jeg alligevel fejlkoden
Capchaen stammer fra denne hjemmeside:
https://www.phpjabbers.com/captcha-image-verification-php19.html
Avatar billede erikjacobsen Ekspert
08. marts 2025 - 15:11 #1
Der skal jo også stå session_start() på den side hvor du laver tallene.

Ellers så bruger du bare den fantastiske debug-teknik der hedder print (eller print_r når det nu er PHP). Skriv værdierne ud, så mange steder du kan komme af sted med det.
Avatar billede Asky Forsker
08. marts 2025 - 16:56 #2
På den side, der laver tallene står session start () n i den lille php-del i toppen af filen sammen med datokoden.
<?php
session_start();
$fmt = new IntlDateFormatter("dan_DNK", IntlDateFormatter::FULL, IntlDateFormatter::FULL, 'Europe/Copenhagen', IntlDateFormatter::GREGORIAN, 'EEEE, d. MMMM yyyy');
$t = time();
$idag = $fmt->format($t);
?>
<!DOCTYPE HTML>
<html>
<head>

men jeg får stadigvæk fejl selvom tallene er rigtige. Skal jeg prøve at sætte det ind lige før kodelinjen, der kalder captchaen?
<label>Skriv koden</label> <img src="captcha.php"><br/><input type="text" name="vercode" />
Avatar billede erikjacobsen Ekspert
08. marts 2025 - 18:44 #3
session_start() skal stå først - det er fint som det er. Men det er da ikke den kode, der laver tallene - det må da være i captcha.php.
Avatar billede Asky Forsker
08. marts 2025 - 19:42 #4
Det er rigtigt, Captcha.php er en ekstern fil i samme mappe. Skal session_start() stå i filen captcha.php ?
Avatar billede erikjacobsen Ekspert
08. marts 2025 - 19:52 #5
Ja, det skal den, som noget af det første.
Avatar billede Asky Forsker
08. marts 2025 - 19:56 #6
Det gør den også, her er koden til captcha.php ,som den hele tiden har været:

<?php
    session_start();
    $text = rand(10000,99999);
    $_SESSION["vercode"] = $text;
    $height = 25;
    $width = 65; 
    $image_p = imagecreate($width, $height);
    $black = imagecolorallocate($image_p, 0, 0, 0);
    $white = imagecolorallocate($image_p, 255, 255, 255);
    $font_size = 14;
    imagestring($image_p, $font_size, 5, 5, $text, $white);
    imagejpeg($image_p, null, 80);
?>
Det er altså ikke her fejlen ligger. En teori er, at når tallene er skrevet, bliver captchaen opdateret i det øjeblik man trykker på send. Dermed vil tallene altid være forkerte, selvom man har skrevet de rigtige ind. Når man trykker tilbage efter fejlmeddelesen er tallene i hvert fald altid ændret.

Det er denne kode, der opdaterer tallene på captchaen:
<script type="text/javascript">
//Refresh Captcha
function refreshCaptcha(){
    var refreshButton = document.querySelector(".refresh-captcha");
refreshButton.onclick = function() {
  document.querySelector(".captcha-image").src = 'captcha.php?' + Date.now();
}
</script>
Avatar billede erikjacobsen Ekspert
08. marts 2025 - 20:10 #7
I koden fra dit spørgsmål kunne det være meget interessant at se hvad der udskrives med

print_r($_POST);
print_r($_SESSION);

Der vil du kunne se om det er "gamle tal".
Avatar billede Asky Forsker
08. marts 2025 - 20:15 #8
Så skal jeg lige vide, hvordan jeg bruger de to kommandoer?
Avatar billede erikjacobsen Ekspert
08. marts 2025 - 20:20 #9
session_start();
print_r($_POST);
print_r($_SESSION);
if ($_POST["vercode"] != $_SESSION["vercode"] OR $_SESSION["vercode"]=='') die("Koden er forkert! Tryk tilbage!");

--- sæt dem ind der
Avatar billede Asky Forsker
08. marts 2025 - 20:47 #10
Det var jo interessant!  for nu virker det. Og jeg kan se at tallene er dem, jeg tastede ind fra captchaen. men en forklaring på på hvorfor jeg ellers får fejl, har jeg ikke fundet, men jeg kan selvfølgelig lade kommandoerne stå til undren for brugerne, ;-)
Avatar billede erikjacobsen Ekspert
08. marts 2025 - 21:02 #11
Det er ikke godt nok. Du skal vide hvorfor det virker/ikke-virker ;)

Prøv flere gange med og uden de der test-udskrifter. Se hvad der sker.

Det lyder lidt underligt at funktionen refreshCaptcha skulle være skyld i det.
Avatar billede Asky Forsker
08. marts 2025 - 21:08 #12
Nu har jeg så prøvet en anden bestillingsside, og der får jeg så "koden er forkert osv".
og der står tilsyneladende det samme i begge opgaver. her er det heller ikke nye tal, men de tal, jeg skrev fra captchaen. hvorfor jeg alligevel får forkert forvirrer mig på et højere plan.
Avatar billede erikjacobsen Ekspert
08. marts 2025 - 21:21 #13
Det virker besynderligt. Du får de rigtige værdier? - men den siger fejl.

Nu er PHP en gammel og underlig tingest. Der er f.eks. både  OR  og  ||  med forskellig precedence. Man bør ikke bruge OR, det forvirrer læseren. Brug || i stedet.

Men det skulle ikke have noget betydning i sammenhæng med == og !=.

Alligevel: sæt parenteser:

if ( ($_POST["vercode"] != $_SESSION["vercode"])  OR ($_SESSION["vercode"]==''))

eller

if ( ($_POST["vercode"] != $_SESSION["vercode"])  || ($_SESSION["vercode"]==''))

Det er ikke muligt at vi kan prøve det direkte ved dig?
Avatar billede Asky Forsker
08. marts 2025 - 21:28 #14
Det er heller ikke funktionen refresh captcha, For hver gang er tallene fra captchaen de rigtige også i printet.
Denne programlinje:
if ($_POST["vercode"] != $_SESSION["vercode"] OR $_SESSION["vercode"]=='') die("Koden er forkert! Tryk tilbage!");
hvis feltet er forkert eller tomt, får man fejl ja
men hvis feltet er rigtigt kan man alligevel godt få fejl. Det er ikke logisk.
Kan linjen formuleres anderledes ?
Avatar billede erikjacobsen Ekspert
08. marts 2025 - 21:40 #15
Den er fin som den står.  Gerne med de ekstra parenteser, som jeg skrev - det burde ikke betyde noget, men nemmere at læse for andre.

Det skyldes noget, som ikke er beskrevet her. Har du f.eks. samme side åben i flere faneblade i samme browser, så den - måske - blander sessioner sammen?
Avatar billede Asky Forsker
08. marts 2025 - 22:08 #16
Har faktisk aldrig den samme side åben i flere eksemplarer, men tit koden lagt ned i bundlinjen, så der nemt kan rettes.
Nu lavede jeg så en rettelse af kodelinjen med ||  i stedet for OR .
Og nu virker det minsandten. Desværre brugte jeg ikke printkommandoen, men i stedet debug.. Med det gode resultat, vil jeg lukke for i aften, men laver flere eksperimenter i morgen.
Kan det være noget med versionen af PHP at gøre? Efterhånden bliver nogle udtryk jo "debrecated" jeg bruger PHP 8,2.
Avatar billede erikjacobsen Ekspert
08. marts 2025 - 22:14 #17
Næppe versionen. Alle 8-ere skulle opføre sig pænt ens, men måske indstillinger i php.ini-filen.

Jeg prøvede selv, men jeg ku' ikke se forskel på brugen af OR eller ||. Manualen siger det samme.

Du skal lave flere test for at se hvad der virker/ikke-virker.
Avatar billede a3-seo.dk Ekspert
09. marts 2025 - 07:11 #18
En anden løsning på Captcha installering.

Grunden til at have et Captcha felt, er at personen verificerer sig som menneske.
Egentligt har vi vel alle vendet os til at de er der, mere eller mindre besværlige.

Her er en alternativ løsning, der gør det lettere for brugeren og besværligt for "Botter":

Honeypot Captcha tilføjer et brugerdefineret inputfelt til My Account Register-formularen med en tom værdi. Dette er ikke synligt for brugeren – men det er synligt for spambots, som vil forsøge at poste en værdi.

Tricket her er valideringstjekket; en fejl vil blive genereret, hvis inputtet har en værdi, og derfor forhindres de fleste falske registreringer i at gå igennem.
https://a3-seo.dk/vare/honeypot-captcha/
Avatar billede Asky Forsker
09. marts 2025 - 09:49 #19
Grunden til at systemet virkede i går var, at jeg havde glemt die-delen i koden. Nu er den del tilføjet og jeg får fejl selvom tallene er rigtige. jeg må altså finde en anden måde i stedet for die-delen fx  session_destroy(); med fare for, at det giver samme resultat.
Overvejer også at finde en anden captcha.
Avatar billede Asky Forsker
09. marts 2025 - 09:58 #20
har faktisk prøvet med noget, der ligner Honeypot:
Lige før submit står der:
<div style="visibility: hidden">
<input type="text" id="moretraps" name="writehere" />
 
<label>Undlad at skrive i dette felt</label> <input name="author" value="" size="40" />
<label>Undlad også at skrive i dette felt</label> <textarea name="message" value="" cols="40" rows="4"></textarea>
</div>

og i script-delen
<noscript>
<label for="moretraps">Skriv venligst flum i dette felt:</label>
</noscript>
Hvis en robot skriver i feltet, ledes den til en tom side.
Avatar billede a3-seo.dk Ekspert
09. marts 2025 - 10:14 #21
Prøv med:
<?php
add_action( 'woocommerce_register_form', 'michael_register_form_honeypot', 9999 );

function michael_register_form_honeypot() {
    echo '<p style="opacity: 0; position: absolute; top: 0; left: 0; height: 0; width: 0; z-index: -1;"><input type="text" name="bb_reg_hp" value="" tabindex="-1" autocomplete="off"></p>';
}

add_filter( 'woocommerce_registration_errors', 'michael_register_form_honeypot_check', 9999, 3 );

function michael_register_form_honeypot_check( $errors, $username, $email ) {
    if ( isset( $_POST['bb_reg_hp'] ) && ! empty( $_POST['bb_reg_hp'] ) ) {
        $errors->add( 'registration-error-invalid-honeypot', 'Sorry, our system flagged this registration attempt as non-human.' );
    }
    return $errors;
}

?>
Avatar billede Asky Forsker
12. marts 2025 - 10:09 #22
Har opgivet at finde fejlen i kontrolkoden ti captchaen, der gør, at jeg hele tiden får fejl, selvom tallene er rigtige. Jeg har prøvet at skrive number i stedet for text i løsningsfeltet, men det er heller ikke her fejlen ligger.
jeg må derfor udelade denne kontrol og fjerne Captchaen, men sætte min lid til "moretraps" til at holde botterne væk.
Avatar billede Asky Forsker
13. marts 2025 - 15:13 #23
Det nærmeste jeg er kommet en løsning er denne:

session_start();
if ($_POST["vercode"] != $_SESSION["vercode"] OR $_SESSION["vercode"]=='') die("Koden er forkert! Tryk tilbage!");{
   
      } 
    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\Exception;
    use PHPMailer\PHPMailer\SMTP; OSV

Hvis jeg  ikke slutter med  ;  (semicolon) efter den sidste krøllede parentes før USE, så virker koden efter hensigten - rigtige tal går videre og forkerte tal får fejl.
DVS den virker i de fleste eksempler, nogen gange får jeg stadig hele tiden fejl.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester