4588pkdkrikue5c Skrevet 18. april 2009 Skrevet 18. april 2009 Hei, Eg lurer på korleis eg sikkert kan fjerne ein rad frå MySQL databasa mi? Sei at eg held på med ei gjestebok, og vil ha ein slett knapp. For å få det til har eg skreve følgende kode: <?php include('dblogin.php'); $sql = "DELETE FROM databasetabell WHERE gjestebok_id ='" . $_GET['fjern'] . "'"; mysql_query($sql, $con); include('index.php'); ?> Men det er no usikkert som fy. For adressa til slett fila vart generert automatisk med ein slett knapp som i HTML koden vart slik: <a href="slett.php?fjern=gjestebok_id (då altså innleggsid på innlegget). Ein oppegåande kan då forstå at ein berre treng å skrive ein anna ID for å fjerna eit anna innlegg.. Korleis skjuler eg denne informasjonen trygt frå omverden? No er eg frustrert!
Nidaroo Skrevet 18. april 2009 Skrevet 18. april 2009 Ikke benytt link/knapp med url til id. Benytt skjulte id. som i feks. $id som skrives i php. DELETE FROM `databasetabell` WHERE `gjestebok_id`.`id` = 1 LIMIT 1
4588pkdkrikue5c Skrevet 18. april 2009 Forfatter Skrevet 18. april 2009 (endret) Ikke benytt link/knapp med url til id. Benytt skjulte id. som i feks. $id som skrives i php. Kan du utdype? Korleis? Kan du vise til eit døme? Takk for svar Endret 18. april 2009 av steffenz
TheClown Skrevet 19. april 2009 Skrevet 19. april 2009 Hun mener nok at du ikke skal bruke GET, men POST eller en annen måte å sende informasjon på. Det der funker det, så lenge du skjekker om GET-en ikke inneholder noe farlig. Hvis det er snakk om id kan du alltids ta en if (is_numeric($_GET['fjern'])) Men for sikkerhetsskyld burde du skjekke om brukeren har rettigheter til å slette gjesteboka. Ellers kan man hacke systemet ditt ved å endre tallet til noe annet og trykke enter. Skjønner du tegninga?
Jonas Skrevet 19. april 2009 Skrevet 19. april 2009 Ein oppegåande kan då forstå at ein berre treng å skrive ein anna ID for å fjerna eit anna innlegg.. Uansett hvordan du sender informasjon til PHP-scriptet, så vil den alltid kunne manipuleres. Å benytte POST istedenfor GET gir en oppegående person to sekunder bry, deretter er det fritt frem. Som sagt, så er du nødt til å sjekke om brukeren som prøver å slette et innlegg faktisk har rettigheter til å slette akkurat dette innlegget.
Warz Skrevet 19. april 2009 Skrevet 19. april 2009 Dessutten må du beskytte deg mot SQL-injection. <?php include('dblogin.php'); $sql = "DELETE FROM databasetabell WHERE gjestebok_id ='" . mysql_real_escape_string($_GET['fjern']) . "'"; mysql_query($sql, $con); include('index.php'); ?>
AlecTBM Skrevet 19. april 2009 Skrevet 19. april 2009 Hvis du har en admin konto som er den eneste som kan slette ting så kan du jo sjekke om det er en admin session som er satt eller noe før du kjører spørringen
4588pkdkrikue5c Skrevet 19. april 2009 Forfatter Skrevet 19. april 2009 Takk for alle svar. Eg forstår kor dykk vil. Eg leste såvidt om mysql_real_escape_string i boka "Webprogrammering i PHP" men fell litt av på vegen. Men det er altså berre å skrive inn dette slik du gjorde her? Når det gjeld å sjekke admin session har eg ikkje sett meg heil inn i bruk av sessions heller. Kanskje eg berre bør gå å lese litt, men mindre dette er særdeles lett?
Warz Skrevet 19. april 2009 Skrevet 19. april 2009 (endret) Ja.. det er ikke verre enn å skrive mysql_real_escape_string, MEN det fungerer ikke på alle servere. Jeg skjønte heller ikke dette helt i starten, men det er slik at noen servere har noe som heter "magic quotes" på. DVS at setninger automatisk blir gitt "slashes". Eksempel (tror det er slik) blir en string som dette: what's up til: what\'s up (hvis magic quotes are på) mysql_real_escape_string gjør det samme, dvs hvis vi ikke fjerner slashen blir den nye stringen: what\\'s up hvis magic quotes er på. I databasen blir det da lagret what\'s up i stedet for what's up. Håper det gir litt mening? Dette er grunnen til at du burde bruke en funksjon som skjekker det. Hvis magic quotes er på fjerner vi da slashene, før vi kan bruke mysql_real_escape_string. Selv bruker jeg denne som fungerer helt greit: <?php /** * New version of quote_smart handling null values and locales with comma as decimal separator. * For usage with mysqli or other database connectors change the mysql_real_escape string to match the * database specific escaper of your choice. * * Based on quote_smart function from php.net and feedback norskwebforum.no. * Thanks to Zerd for pointing out problem with null values and magic_quotes * * @version 1.01 * @author Ketil Stadskleiv <[email protected]> * @param mixed $value * @return string */ function quote_smart($value){ // Stripslashes if (get_magic_quotes_gpc() && !is_null($value) ) { $value = stripslashes($value); } //Change decimal values from , to . if applicable if( is_numeric($value) && strpos($value,',') !== false ){ $value = str_replace(',','.',$value); } if( is_null($value) ){ $value = 'NULL'; } // Quote if not integer or null elseif (!is_numeric($value)) { $value = "'" . mysql_real_escape_string($value) . "'"; } return $value; } Da gjør du bare slik: $q = sprintf('DELETE FROM databasetabell WHERE gjestebok_id = %d)', quote_smart($_GET['fjern'])); mysql_query($q, $con); Når det gjelder Sessions er det ærlig talt ikke særlig vanskelig. Gjør et enkelt google søk på php session og test et av eksemplene så for du det nok til ganske raskt Endret 19. april 2009 av Warz
JohndoeMAKT Skrevet 26. april 2009 Skrevet 26. april 2009 Hvorfor i alle verden er gjestebok_id en string? Det gjør sikkerhet voldsomt mye vanskeligere. Hold deg til integer på slike felt, da trenger du bare int-caste og sjekke etter verdier over null.
4588pkdkrikue5c Skrevet 1. mai 2009 Forfatter Skrevet 1. mai 2009 (endret) Takker for gode svar! No fungerer ting! Men eg får ikkje ÆØÅ til å fungere. Det verker for meg som det er når eg poster dataene inn i skjemaet, for det fungerer utmerka når eg sett det inn i phpMyAdmin. Og sida viser ÆØÅ og når eg har skreve det inn i phpMyAdmin. Har nokon konkrete tips til meg? Korleis "sett" eg det før eg legg data inn i databasen. Eg har med <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> i HTML'en, óg header ('Content-Type:text/html;charset=utf-8'); i PHP'en, samt accept-character i formen.. Endret 1. mai 2009 av steffenz
JohndoeMAKT Skrevet 2. mai 2009 Skrevet 2. mai 2009 Korleis "sett" eg det før eg legg data inn i databasen. SET NAMES 'utf8';
4588pkdkrikue5c Skrevet 2. mai 2009 Forfatter Skrevet 2. mai 2009 Kor sett eg det? Eg har prøvd følgende: $query = 'INSERT INTO portefolje SET NAMES 'utf8'; prosjektnavn = "'.$prosjektnavn.'", kategori = "'.$kategori.'", type = "'.$type.'", kunde = "'.$kunde.'", bildenavn = "'.$filnavn.'", beskrivelse = "'.$beskrivelse.'", publisert = NOW()'; if(mysql_query($query)) { echo 'Innlegget er lagret.'; } else { echo 'En feil har oppstått.'; } Det fungerer ikkje, eg får berre opp " Parse error: syntax error, unexpected T_STRING in /Applications/MAMP/htdocs/xxx/filnamn.php on line xx" Linje "XX" er då den linja eg har satt inn SET NAMES 'utf8'; i.. Er relativt fersk med dette, og sett uruleg stor pris på hjelpa eg får av dykk!
JohndoeMAKT Skrevet 2. mai 2009 Skrevet 2. mai 2009 $sql = "SET NAMES 'utf8';"; mysql_query($sql); $sql = "INSERT WHATEVER INTO SOMEWHERE;"; mysql_query($sql);
4588pkdkrikue5c Skrevet 2. mai 2009 Forfatter Skrevet 2. mai 2009 Tusen takk! Du er dagens helt, no fungerer det heilt utmerka!
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå