Gå til innhold

Sikker fjerning av data med MySQL


Anbefalte innlegg

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
Videoannonse
Annonse

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
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

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

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 av Warz
Lenke til kommentar

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 av steffenz
Lenke til kommentar

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...