4588pkdkrikue5c Skrevet 18. april 2009 Del 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! Lenke til kommentar
Nidaroo Skrevet 18. april 2009 Del 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 Lenke til kommentar
4588pkdkrikue5c Skrevet 18. april 2009 Forfatter Del 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 Lenke til kommentar
TheClown Skrevet 19. april 2009 Del 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? Lenke til kommentar
Jonas Skrevet 19. april 2009 Del 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. Lenke til kommentar
Warz Skrevet 19. april 2009 Del 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'); ?> Lenke til kommentar
AlecTBM Skrevet 19. april 2009 Del 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 Lenke til kommentar
4588pkdkrikue5c Skrevet 19. april 2009 Forfatter Del 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? Lenke til kommentar
Warz Skrevet 19. april 2009 Del 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 Lenke til kommentar
JohndoeMAKT Skrevet 26. april 2009 Del 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. Lenke til kommentar
4588pkdkrikue5c Skrevet 1. mai 2009 Forfatter Del 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 Lenke til kommentar
Martin A. Skrevet 1. mai 2009 Del Skrevet 1. mai 2009 Er databasen/tabellen UTF-8? Lenke til kommentar
JohndoeMAKT Skrevet 2. mai 2009 Del Skrevet 2. mai 2009 Korleis "sett" eg det før eg legg data inn i databasen. SET NAMES 'utf8'; Lenke til kommentar
4588pkdkrikue5c Skrevet 2. mai 2009 Forfatter Del 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! Lenke til kommentar
JohndoeMAKT Skrevet 2. mai 2009 Del Skrevet 2. mai 2009 $sql = "SET NAMES 'utf8';"; mysql_query($sql); $sql = "INSERT WHATEVER INTO SOMEWHERE;"; mysql_query($sql); Lenke til kommentar
4588pkdkrikue5c Skrevet 2. mai 2009 Forfatter Del Skrevet 2. mai 2009 Tusen takk! Du er dagens helt, no fungerer det heilt utmerka! Lenke til kommentar
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å