Avatar billede kack Nybegynder
21. marts 2007 - 14:35 Der er 7 kommentarer og
1 løsning

Validering af form uden at slette alt

Hej alle eksperter.

Jeg er i gang med noget validering af en form. Jeg har lavet det i php, men når man så trykker på "Opret" knappen, og en af inputfelterne ikke er udfyldt rigtigt, kommer der en fejl hvor der f.eks står: "Du skal skrive et brugernavn.". Og så forsvinder alt det man har skrevet i alle input felterne.
Kan man ikke lave det så alt sammen ikke forsvinder?

Her er min kode:

<?
if($_POST['ok']){

if($_POST['kodeord'] == $_POST['kodeordto']){


if(!$_POST['brugernavn']) {
echo "<br/><br/><b class='b1'>Du skal skrive et brugernavn.</b>";
}
elseif(!$_POST['kodeord']) {
echo "<br/><br/><b class='b1'>Du skal skrive et kodeord.</b>";
}
elseif(!$_POST['kodeordto']) {
echo "<br/><br/><b class='b1'>Du skal skrive et kodeord.</b>";
}
elseif(!$_POST['email']) {
echo "<br/><b class='b1'>Du skal skrive en email.</b>";
}

else{
echo "<br/><b class='b1'>Brugeren er oprettet! Du kan nu logge ind med dit brugernavn og kodeord.</b>";
$_POST["kom"] = str_replace("<", "&lt;", $_POST["kom"]);
$_POST["kom"] = str_replace(">", "&gt;", $_POST["kom"]);
$_POST["kom"] = str_replace("\\", "\\\\", $_POST["kom"]);
$dato = date('d/m/Y');
$ip = getenv(REMOTE_ADDR);

mysql_query("INSERT INTO dr_brugere (id, brugernavn, kodeord, gkodeord, email, dato, ip) VALUES ('".$_POST['id']."','".$_POST['brugernavn']."','".md5($_POST['kodeord1'])."','".$_POST['kodeord']."','".$_POST['email']."','$dato','$ip')");
}
}
else {
        echo "<br/><b class='b1'>Kodeord ikke ens.</b>";
        }
}
?>
Avatar billede olebole Juniormester
21. marts 2007 - 14:57 #1
<ole>

Du har da ingen validering i dén kode. Du checker bare, om de pågældende variabler er sendt til serveren ... men overhovedet ikke, om de indeholder valide data (= de data/datatyper, du må forvente for den pågældende variabler).

Søg på Google på ordene 'php sql injection', hvis du vil lære bare en anelse om sikkerhed  ;o)

/mvh
</bole>
Avatar billede kack Nybegynder
21. marts 2007 - 15:01 #2
Okay vil lige kigge på det.
Men kan du hjælpe mig med det jeg spurgte om? Altså at den sletter alt hvis man ikke har udfyldt et felt?
Avatar billede olebole Juniormester
21. marts 2007 - 15:06 #3
Ja:
    <input type="text" name="navn" value="<?=$_POST["navn"]?">

Nu viser jeg det blot ved at bruge $_POST["navn"], men den bør du naturligvis validere (må kun indeholde små/store bogstaver, bindestreger og mellemrum) og fylde den i en anden variabel  ;o)
Avatar billede michael_stim Ekspert
21. marts 2007 - 15:08 #4
Jeg havde nu nok fortrukket at gøre det i javascript. Der er (formodentlig) ingen grund til at bruge serveren til det.
Avatar billede kack Nybegynder
21. marts 2007 - 15:17 #5
Olebole: Tak :D Det vare bare det jeg skulle bruge.

Michael_stim: Det er bare fordi jeg ikke bryder mig om popop bokse. Så vil hellere ha' den skriver det på siden.
Avatar billede olebole Juniormester
21. marts 2007 - 15:23 #6
JS-validering bør man altid lave af hensyn til brugeren (hvad man selv synes om popups, er ikke relevant i den forbindelse - og man kan sagtens skrive på siden med JS).

Når man har taget hensyn til brugeren, bør man på serveren tage hensyn til sig selv og sikkerheden - og foretage endnu en validering  ;o)
Avatar billede kack Nybegynder
21. marts 2007 - 15:28 #7
Mange tak for den hurtige hjælp! Jeg acceptere, men har bare endnu et spørgsmål... Forstår ikke helt Hvad dette script gør.. Søgte på google efter "php sql injection".
På wikipedia kommer der dette script frem:

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
  $result = mysql_query("SELECT * FROM users WHERE username=$matches[0]");
else // we don't bother querying the database
  echo "username not accepted";

Altså den tjekker om bogstaverne er fra A-til W og hvad så? Hvad skal den i databasen?
Avatar billede johan.o Nybegynder
22. marts 2007 - 10:44 #8
Så vidt jeg kan se så checker scriptet først indholdet i $_GET['username'].
preg_match() er en sammenligning af en streng med et regular expression. Reg_exp siger at hvis 'strengen' består af 8 til 20 karaktere fra \w 'gruppen' er det fint. (Kort fortalt)

Hvis preg_match var sand :

Udføres mysql query'en med resultatet fra preg_match

Hvis ikke sand :

echo "username not accepted.";

Grunden til at 'den' går i databasen er for at hente f.eks. det korrekte kodeord som senere kan sammenlignes med det kodeord brugeren har skrevet.

Mvh. Johan
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