19. marts 2007 - 08:24Der er
30 kommentarer og 1 løsning
Husk indtastningerne i form
Hej. Jeg har en input form, hvor der sker følgende: 1. Jeg henter nogle felter fra MySQL og smider i nogle input-felter via "value". 2. Når der trykkes submit, åbnes ny fil, hvor der kontrolleres for fejlindtastninger, og hvis ingen fejl, så gemmes rettelserne. 3. Hvis der er fejl, så kan jeg via en "retur knap, rette felterne.
Men systemet husker ikke rettelserne, når jeg går tilbage. Derfor gør jeg følgende i min input-form:
Det virker, men jeg har det problem, at hvis jeg i formen sletter indholdet i et felt, trykker submit og der konstateres en fejl, så går den tilbage igen, men viser det oprindelige indhold (det som jeg havde fjernet). Det kan jeg også godt forstå, da jeg i "value" tjekker for, om der er indhold i Session-variablen. Indholdet er jeg netop fjernet, hvorfor value sættes til "row[navn]".
Kan ikke gennemskue, hvad der skal gøres, for at den også fanger, hvis jeg har fjernet indholdet i et felt??
I lang tid har samarbejdsbranchen fokuseret på at forbedre enhedsfunktioner – bedre kameraer, klarere lyd og smartere software. Men den virkelige forvandling handler ikke om funktioner.
if($_SERVER["REQUEST_METHOD"] == "post" && isset($_COOKIE[session_name()])) { // hvis post og cookies er accepteret, ( og siden er set en gang min., default for PHP at sætte en cookie ved session_start() )
foreach($_POST as $key => $value) {
if(trim($value) == "") { continue; }
$_SESSION["posts"][$key] = $value;
}
Tjek her om en bestemt eller flere sessions er sat, og har en gyldig værdi ......
header("Location:". $_SERVER["PHP_SELF"]); // tilbage til fil som der blev postet fra exit; }
I din formular kan du bruge en function til at skrive det som tidligere blev skrevet:
Lige en ting, så jeg er forberedt, når jeg kommer til at "lege" med koderne:
Jeg har jo 2 filer: Fil1: Som indeholder formen Fil2: Som tjekker fejl, evt. returnerer til fil1, hvis fejl, ellers gemmes i MySQL.
Skal jeg slet ikke have noget kode i Fil2. Altså, jeg skal slette mit Session array. Og når jeg så gemmer i MySQL bruger jeg som nu: $_POST['navn'] osv.
Jeg er ikke helt med på, hvor funktionen "fieldvalue" skal stå i fil1. Skal den stå inde i formen nederst??
Nu har jeg prøvet, men når jeg indlæser min fil1 med inputfelterne, viser den i navne-inputformen [". fieldvalue("navn") ."] (dog ikke klammerne). Jeg var i tvivl om, hvor funktionen skulle placeres. Jeg har placeret den lige under input-felterne - altså før "Submit-knappen" ¨ Og føglende kode er placeret i fil2 øverst:
Der er ikke umiddelbart noget i vejen med at ord som select/delete/update optræder i en SQL query, det er blot vigtigt at de fratages deres funktionalitet. Det kan gøres ved altid at huske ' omkring værdierne i SQL sætningerne. F.eks.:
mysql_query("SELECT * FROM tbl WHERE id='".$_POST['oVar']."'");
hvis brugeren så skriver f.eks. "DELETE * FROM tbl" ser vores query sådan her ud
mysql_query("SELECT * FROM tbl WHERE id='DELETE * FROM tbl'");
og den er ganske ufarlig da der blot søges efter et id der hedder 'DELETE * FROM tbl'. Så husk altid ' eller " omkring værdierne i SQL sætninger......MEN.....
hvad nu hvis brugeren skriver "' DELETE * FROM tbl '" så ser det således ud
mysql_query("SELECT * FROM tbl WHERE '' DELETE * from tbl ''");
og det er absolut ikke ufarligt og derfor tilføjer vi endnu en sikkerheds feature nemlig mysql_real_escape_string(). Denne funktion 'escaper' ' og " således at de ikke kan 'bryde' din query, men blot tolkes som en del af værdien.
mysql_query("SELECT * FROM tbl WHERE id='".mysql_real_escape_query($_POST['ovar'])."'");
medfører
mysql_query("SELECT * FROM tbl WHERE id='\' DELETE * FROM tbl \''");
og hvis ellers exp.dk tillader alle disse tegn :), så skulle queryen være ganske ufarlig.
Og til sidst er det altid vigtigt at man checker indholdet af de variabler brugerne sender til scriptet. Hvis du kun forventer tal, så check som jakobdo viser, at det kun er tal der sendes, hvis du kun forventer bogstaver fra a-z så check efter det...osv. osv. osv. check check check til du bliver blå i hovedet. Selv den mest simple kode kan blive temmelig omfattende når alle sikkerheds check medtages, men lad være med at springe over, husk det altid.
nemlig --> Jeg bruger normalt en lidt anden fremgangsmåde i forbindelse med form's og php. Dette lille eksempel kan måske hjælpe dig lidt hvis du vil prøve at gribe det an på en anden måde. Men den måde showsource og jakobdo viser er ganske sikkert udemærket så opfat blot dette som et alternativ.
<?php
// --> Define variables <-- //
$oVar=""; $oMsg="";
// --> Check POST data <-- //
if(isset($_POST['oVar'])) { if($_POST['oVar']!="") { if($_POST['oVar']=="Ko" || $_POST['oVar']=="Gnu") { $oVar=$_POST['oVar']; } else { $oMsg="Tsk tsk Ko eller Gnu, hvor svært kan det være :-)"; } } else { $oMsg="Du skal da skrive noget."; } }
// --> Create HTML output <-- //
$oPut="<html> <body> <form action='' method='POST'> <p>Skriv Ko eller Gnu :</p> <input type='text' name='oVar' value='".$oVar."'> <input type='submit' value='send'> </form> <p>".$oMsg."</p> </body> </html>";
He he...nu sidder jeg lige og 'småtænker' over $_SESSION løsningen og den har selvfølgelig en god lille feature som ovenstående ikke har. Hvis du går væk fra formularen og kommer tilbage igen, så husker den stadig hvad der stod....men det kan vel egentlig både være en fordel og en ulempe....men ganske brugbart i visse tilfælde :)
Til Jakobdo eller showsource: Håber at en af jer vil give en tilbagemelding på mit problem, nemlig at jeg ikke har fået det til at virke. I mit 2. sidste indlæg skriver jeg, hvad jeg har gjort. Håber meget på, at en af jer lige vil give de sidste tjek. Og tak for de øvrige kommentarer og inspiration til sikker håndtering af MySQL.
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.