Avatar billede Thomsen11 Nybegynder
16. oktober 2009 - 11:27 Der er 14 kommentarer og
1 løsning

Spamfri gæstebog og opret bruger

Hej eksperter.
Jeg har et lille problem, da jeg har lavet en gæstebog og en opret bruger funktion, der bare indsætter rækker i tabel. Problemet er bare at jeg gerne vil undgå spamrobotter der poster alt muligt lort i og rækkerne. Er der nogle der kan hjælpe med noget verifitationskode eller ligende så det kun er mennesker der kan oprette brugere og skrive i gæstebogen.

Mit "opret bruger script" ser sådan ud:
<?php
require_once("config.php");
if($_GET['do'] == "insert" && isset($_POST['Brugernavn']))
{
    $todb['Brugernavn'] = mysql_real_escape_string($_POST['Brugernavn']);
    $todb['Password'] = mysql_real_escape_string($_POST['Password']);
    $todb['Navn'] = mysql_real_escape_string($_POST['Navn']);
    $todb['Email'] = mysql_real_escape_string($_POST['Email']);
    $todb['Year'] = mysql_real_escape_string($_POST['Year']);
    $todb['Adresse'] = mysql_real_escape_string($_POST['Adresse']);
    $todb['Telefon'] = mysql_real_escape_string($_POST['Telefon']);
    $insert_data = mysql_query("INSERT INTO brugere(
                                                Brugernavn,
                                                Password,
                                                Navn,
                                                Email,
                                                Year,
                                                Adresse,
                                                Telefon)VALUES(
                                                '".$todb['Brugernavn']."',
                                                '".$todb['Password']."',
                                                '".$todb['Navn']."',
                                                '".$todb['Email']."',
                                                '".$todb['Year']."',
                                                '".$todb['Adresse']."',
                                                '".$todb['Telefon']."')");
    if($insert_data)
    {
        print"Din bruger blev oprettet.<br /><br />";
    }
    else
    {
        print "<b>FEJL:</b> ".mysql_error();
    }
}
?>
<form action="?do=insert" method="post">
Dit brugernavn (Skal være din email): <input type="text" name="Brugernavn" value="<?=$_POST['Brugernavn'];?>" /><br />
Password                            : <input type="password" name="Password" value="<?=$_POST['Password'];?>" /><br />
Fulde navn                          : <input type="text" name="Navn" value="<?=$_POST['Navn'];?>" /><br />
Årgang(e) (fx.03/04)                : <input type="text" name="Year" value="<?=$_POST['Year'];?>" /><br />
Adresse                            : <input type="text" name="Adresse" value="<?=$_POST['Adresse'];?>" /><br />
Telefon                            : <input type="text" name="Telefon" value="<?=$_POST['Telefon'];?>" /><br />
<input type="submit" value="Opret bruger" />
</form>   


og gæstebog:
<?php

require_once("configbg.php");

       

    $db = mysql_connect($host,$bruger,$kodeord)or die ('Der kunne ikke forbindes til databasen. Fejl: ' . mysql_error());;   
    mysql_select_db($database,$db);       
                       

    if($_POST["skriv"]){
        $navn = htmlspecialchars($_POST[navn]); 
        $besked  = htmlspecialchars($_POST["besked"]);
       

        if($navn != "" || $besked != ""){
               

            if(!get_magic_quotes_gpc()){           
                $navn = addslashes($nyhed_overskrift);
                $besked = addslashes($nyhed_tekst);
            }
               
   
            $sql = "SELECT * FROM bog ";
            $sql .= "WHERE navn = '" . $navn . "' ";
            $sql .= "AND  besked = '" . $besked ."' ";
            $result= mysql_query($sql);
               
            if($row = mysql_fetch_row($result)){
                echo "<p style='color:red;' >Indlægget findes allerede, og blev ikke gemt igen.</p>";
            }else{
                $dato_array=getdate();            //php datofunktion
                $dato = $dato_array["mday"] . "/" . $dato_array["mon"] . " - " . $dato_array["year"];
                mysql_query("INSERT INTO bog(navn, dato, besked) VALUES('$navn','$dato','$besked')"); 
            }
        }   
    }
?>
<html>
   
<body>

<form method="post" id="gaestform" action="#">
        <p>
            <input type="hidden" name="skriv" value="1" >
            Navn: <br />
            <input type="text" name="navn" size="25" >
            <br />
            Besked: <br />
            <textarea name="besked" cols="50" rows="10"></textarea>
            <br />
            <input type="submit" value="Send">
        </p>       
</form>


Håber I kan hjælpe mig. På forhånd tak!!
Avatar billede zips Juniormester
16. oktober 2009 - 11:48 #1
CAPTCHA er en mulighed, god hjælp er her http://www.phpbegynder.dk/artikler.php?id=8&page=1
Avatar billede Slettet bruger
16. oktober 2009 - 19:31 #2
Normalt vil man løse det ved at "fortælle brugeren noget".
- og så kræve at denne oplysning kommer med tilbage ifbm. form-submit.

Typisk et billede af et tal/ord som en bot ikke vil kunne type (aka. Captcha)
- men princippet kan genbruges på andre måder også...

Et (let) regnestykke, en farve, whatever - bare svaret ikke kan læses direkte i HTML'en - og det ikke er det samme hver gang : )

Men hvis din gæstebog er HELT VILDT interessant, skal du ikke regne med at kunne holde spammerne væk for evigt.
- de er begyndt at benytte "lavtlønnede tasteslaver" til at knække Captcha beskyttelsesmure... Røvhuller
Avatar billede Thomsen11 Nybegynder
17. oktober 2009 - 16:42 #3
CAPTCHA synes jeg ser ud som en god ide at bruge. Linket synes jeg også er fint.
Jeg har indsat det på min hjemmeside, men billedet vises ikke. Jeg har ledt lidt i scriptet og er i tvivl om "image/png" er et link til et png billede. Men skal det indsættes på ftp´en og hvordan? Eller skal jeg også have downloadet en font?

- Tak for hjælpen!
Avatar billede zips Juniormester
17. oktober 2009 - 17:08 #4
Som der stå kræver metoden at din server har GD-lib som laver det billede, dette er normalt ikke installeret på en local computer, så hvis du teste på din egen computer er det muligt det ikke vil virke.

Du kan se om du har GL support i din php.ini fil for at se denne fil kan du lave en php fil og indsætte dette
<?php
phpinfo();
?>

Åben den i din browser og du vil se en masse info, et stykke nede står der omkring GD support samt hvilke billeder som det understøtter.

Du kan også prøve at lægge hele scriptet ind i en fil og lægge den op på din webhotel og køre den fil og se om det virker, hvis det gør, har du en fejl i din kode som du selv har indsat.
Avatar billede Thomsen11 Nybegynder
17. oktober 2009 - 20:10 #5
Tak for din kommentar zips!
Jeg har set i min php.ini. Der skulle gerne understøttes alle billedfiler som står der. Jeg har hosted hos one.com, og regner også med at de har styr på det.
Jeg har prøvet at lægge hele scriptet ind i en fil og op på serveren, men som jeg skriver vises billedet ikke, men et fejlbillede med et rødt kryds over. Jeg har kopieret det over i en fil og er vi ikke enige om at det skal se sådan ud. Det er bare pasted fra siden:

<?php


    session_start();

    function outputImage()
    {
        // Denne funktion skriver et billede til browseren
        header( 'Content-Type: image/png' );
        $im = imagecreate( 60, 20 );
        // Baggrundsfarven
        $bgcol = imagecolorallocate( $im, 255, 255, 255 );
        // Rammen
        $bordercol = imagecolorallocate( $im, 0, 0, 0 );
        // Tekstfarce
        $textcol = imagecolorallocate( $im, 100, 100, 220 );
        // Fyld med baggrundsfarven
        imagefill( $im, 1, 1, $bgcol );
        for ( $i = 0; $i < 4; $i++ )
        {
            // Tilfældig farve til linjerne
            $tmpCol = imagecolorallocate( 
                $im, mt_rand( 100, 230), mt_rand( 100, 230), mt_rand( 100, 230) );
            // Tegn linje
            imageline( $im, 0, mt_rand( 0, 19 ), 59, mt_rand( 0, 19 ), $tmpCol );
        }
        // Skriv CAPTCHA-teksten
        imagestring( $im, 5, 9, 2, $_SESSION['captcha-code'], $textcol );
        // Wave effect
        for ( $i = 0; $i < 60; $i += 2 )
            imagecopy( $im, $im, $i - 2, sin( $i / 10 ) * 3, $i, 0, 2, 20 );
        // Tegn rammen
        imagerectangle( $im, 0, 0, 59, 19, $bordercol );
        // Smid billedet til browseren
        imagepng( $im );
        imagedestroy( $im );
        // Stop scriptet her!
        exit;
    }
   
    function newCode()
    {
        // Denne funktion laver en tekst der (som regel) kan udtales
        $vowels = array_slice( preg_split( '//', 'AEUY' ), 1, -1 );
        $nvowels = count( $vowels ) - 1;
        $consonants = array_slice( preg_split( '//', 'BCDFGHJKLMNPQRSTVWXZ' ), 1, -1 );
        $nconsonants = count( $consonants ) - 1;
        $code = "";
        $rnd = mt_rand( 0, 1 ) == 1 ? true : false;
        // Loopet herunder bygger teksten
        while ( strlen( $code ) < 5 )
        {
            $code .= ( $rnd ? $vowels[ mt_rand( 0, $nvowels ) ]
                : $consonants[ mt_rand( 0, $nconsonants ) ] );
            $rnd = !$rnd;
        }
        // Smid teksten i en sessionsvariabel
        $_SESSION['captcha-code'] = $code;
    }
    if ( isset( $_GET['img'] ) || isset( $_GET['newimg'] ))
    {
        if ( isset( $_GET['newimg'] ) )
        {
            // Brugeren kunne ikke læse koden, så lav en ny
            newCode();
        }
        // Vis billede
        outputImage();
        // Scriptet stopper i outputImage() - Denne kode bliver altså kun
        // kørt når der gives ?img eller ?newimg i URL'en
    }
   
    // Dan ny CAPTCHA-tekst
    newCode();


?>
<script type="text/javascript">
    function getNewImg()
    {
        var d = new Date();
        document.getElementById('theImg').src = 
            '<?= $_SERVER['PHP_SELF'] ?>?newimg&x' + d.getTime();
    }
</script>
<form method="post" action="formhandler.php">
    <img id="theImg" align="top" src="<?= $_SERVER['PHP_SELF'] ?>?img">
    <input type="button" value="Jeg kan ikke læse det!" onclick="getNewImg()"><br>
    Skriv bogstaverne i billedet:
    <input type="text" style="width: 60px" name="kode">
    <input type="submit" value="Indsend">
</form>
Avatar billede zips Juniormester
17. oktober 2009 - 20:48 #6
Jeg har lagt det ind her som test på min server http://zips.be/exp/889668/

Prøv at lægge et link til din fil.
Avatar billede Thomsen11 Nybegynder
17. oktober 2009 - 21:28 #7
Har sendt link til zips via privat post her på siden.
Avatar billede Thomsen11 Nybegynder
18. oktober 2009 - 11:43 #8
Zips var så venlig at sende scriptene, zipkomprimeret til mig som jeg kunne hente på hans site. Jeg downloadede dem og så at de var ret ens i forhold til mine. Jeg indsatte hans scripts i mine gamle og problemet var forsat der. Men da jeg så han havde kaldt "hovedscriptet" for index.php valgte jeg at oprette en undermappe på ftp´en og ligge de to php filer derunder. Førhend lagde de to filer i roden på mit site.
Da filerne blev uploadet i undermappen fungerede alting fint.
Mit spørgsmål lyder nu således. Hvordan skal de to scripts hænge sammen med opret bruger og gæstebogs funktionerne?

- I øvrigt stor tak til zips for sin brug af tiden på dette.
Avatar billede zips Juniormester
18. oktober 2009 - 12:20 #9
Efter jeg fik et link til din test side og gik et trin op og så siden, kan jeg se at under kontakt bruger du det script som findes her http://hjemmesideskolen.dk/scripts/phpmailc.php

Det kunne jo også bruges til din gæstebog, man kan godt bruge det samme script det flere steder på siden.

I det script kan du se hvor du skal indsætte det
Avatar billede Thomsen11 Nybegynder
18. oktober 2009 - 14:36 #10
Hvordan skal jeg sætte dem sammen, og hvad skal bruges?
Jeg ved godt jeg ikke er den skarpeste kniv i skuffen, men er ikke helt med på hvordan.
Hvordan skal de scripts sættes sammen med fx mit gæstebogs script?
Avatar billede zips Juniormester
18. oktober 2009 - 14:56 #11
Dette er ikke testet.

<?php
require_once("config.php");
if($_GET['do'] == "insert" && isset($_POST['Brugernavn']))
{
if($_SESSION['verify'] == strtoupper($_POST['auth'])) {
    $todb['Brugernavn'] = mysql_real_escape_string($_POST['Brugernavn']);
    $todb['Password'] = mysql_real_escape_string($_POST['Password']);
    $todb['Navn'] = mysql_real_escape_string($_POST['Navn']);
    $todb['Email'] = mysql_real_escape_string($_POST['Email']);
    $todb['Year'] = mysql_real_escape_string($_POST['Year']);
    $todb['Adresse'] = mysql_real_escape_string($_POST['Adresse']);
    $todb['Telefon'] = mysql_real_escape_string($_POST['Telefon']);
    $insert_data = mysql_query("INSERT INTO brugere(
                                                Brugernavn,
                                                Password,
                                                Navn,
                                                Email,
                                                Year,
                                                Adresse,
                                                Telefon)VALUES(
                                                '".$todb['Brugernavn']."',
                                                '".$todb['Password']."',
                                                '".$todb['Navn']."',
                                                '".$todb['Email']."',
                                                '".$todb['Year']."',
                                                '".$todb['Adresse']."',
                                                '".$todb['Telefon']."')");
    if($insert_data)
    {
        print"Din bruger blev oprettet.<br /><br />";
    }
    else
    {
        print "<b>FEJL:</b> ".mysql_error();
    }
    }
    else
    {
        echo '<p>Desværre, verifikationskoden kunne ikke godkendes!</p>';
    }
}
?>


Og i din for skal du indsætte denne, husk at rette til den rigtigt sti til filen verify.php

<input type="password" id="auth" name="auth" />
<br />Indtast kode for<br />at sende mail! <img src="verify.php" alt="auth" />


Som jo skal styles så den passer til dit layout
Avatar billede Thomsen11 Nybegynder
18. oktober 2009 - 17:57 #12
For at indsætte i tabellen mangler der jo formen, hvor brugeren indsætter. Det her er kun kode så scriptet ved hvad det skal gøre når der skrives oplysninger.

Skal de to sættes sammen i samme script?
Hvis det gøres kan man sagtens indsætte i rækkerne uden verifikationskoden.
Avatar billede zips Juniormester
18. oktober 2009 - 18:27 #13
Ikke forstået...

Du har indsat scriptet i toppen af dette spørgsmål og det er der jeg har indsat koden, du har også lagt en form hvor du skal indsætte det andet jeg skrev, jeg ved ikke hvordan hele dit script ser ud.

Men udfra den side du henviste til i den PM kan jeg blot se at der bruges det script fra hjemmesideskolen og der virker det, derfor burde det også virke ved at indsætte det jeg skrev i #11

Men måske har jeg helt misfortsået det :-)
Avatar billede Thomsen11 Nybegynder
18. oktober 2009 - 18:49 #14
Det du har lavet i #11 mangler dette, i forhold til scriptet som jeg viser i spørgsmålet:

<form action="?do=insert" method="post">
Dit brugernavn (Skal være din email): <input type="text" name="Brugernavn" value="<?=$_POST['Brugernavn'];?>" /><br />
Password                            : <input type="password" name="Password" value="<?=$_POST['Password'];?>" /><br />
Fulde navn                          : <input type="text" name="Navn" value="<?=$_POST['Navn'];?>" /><br />
Årgang(e) (fx.03/04)                : <input type="text" name="Year" value="<?=$_POST['Year'];?>" /><br />
Adresse                            : <input type="text" name="Adresse" value="<?=$_POST['Adresse'];?>" /><br />
Telefon                            : <input type="text" name="Telefon" value="<?=$_POST['Telefon'];?>" /><br />
<input type="submit" value="Opret bruger" />
</form> 

Hvis dette ikke indsættes kommer der jo bare en hvid skærm op, uden noget at udfylde for brugeren.


Du har helt ret i af det virker, det fra hjemmesideskolen. Men forskellen er jo at det er til formmail, og det her jo er indsættelse i rækker. Der skal jo ændres noget, men jeg er helt blank i hvad der skal ændres. Hvad skal gøres, så når man trykker på knappen "opret bruger" efter at have udfyldt felterne, skal den forbi verfy, for at tjekke om verifikationskoden er i overenstemmelse med det billede der bliver lavet.
Jeg har ingen problemer med at se billedet og heller ingen problemer med at skrive de tal som billedet viser, men problemet ligger i, at jeg sagtens kan oprette brugeren uden at skrive nogle tal fra verifikations-billedet.
Avatar billede zips Juniormester
18. oktober 2009 - 19:29 #15
Ja jeg kan se jeg kun skrev for og ikke form i #11 hvor du ønsker den placeret er jo helt op til dig.

Men det må være noget i denne stil

<form action="?do=insert" method="post">
Dit brugernavn (Skal være din email): <input type="text" name="Brugernavn" value="<?=$_POST['Brugernavn'];?>" /><br />
Password                            : <input type="password" name="Password" value="<?=$_POST['Password'];?>" /><br />
Fulde navn                          : <input type="text" name="Navn" value="<?=$_POST['Navn'];?>" /><br />
Årgang(e) (fx.03/04)                : <input type="text" name="Year" value="<?=$_POST['Year'];?>" /><br />
Adresse                            : <input type="text" name="Adresse" value="<?=$_POST['Adresse'];?>" /><br />
Telefon                            : <input type="text" name="Telefon" value="<?=$_POST['Telefon'];?>" /><br />
Indtast kode for<br />at sende mail! <input type="password" id="auth" name="auth" /><br /><img src="verify.php" alt="auth" />
<input type="submit" value="Opret bruger" />
</form>

Og husk at den sti til verify.php er rigtigt

Udfra det jeg lavede i scriptet, skal det tjekke om den indtastede kode er rigtig ellers vil den udskrive"Desværre, verifikationskoden kunne ikke godkendes!"

Er det på fredagsvolley eller hvor har du indsat den?
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

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