mysql_escape_string() beter sig olika

Tråden skapades och har fått 11 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • Stockholm
  • 2004-03-02 08:43

Hej!

Jag har ett nyhetsscript som arbetar mot en mysql-databas.
Jag känner att jag inte har full koll på hur brödtexten skall kodas innan man trycker in den i databasen.
Dom får använda html-taggar om de vill så jag struntar i att koda om strängen med htmlspecialchars() men däremot så verkar det krävas någon kodning för att de ska kunna citera i inläggen.

Jag har läst om mysql_escape_string() och det fungerade precis som jag ville. Tills jag laddade upp det på den skarpa servern.

Jag testar försöka mata in strängen
<a href="hej">hej</a>
och på den publika(skarpa) servern blir resultatet (det som sparas i databasen)
<a href=\"hej\">hej</a>

men på min lokala server så får jag in exakt det som jag skrev först. Dvs den escap'ar bara tecknet vid själva query-frågan och inte så att backslashes sparas i databasen...

Idéer någon?

  • Medlem
  • Stockholm
  • 2004-03-02 09:12
// när du matar in till db'n
$string = addslashes($string);

// när du plockar ut
$string = stripslashes($string);
  • Medlem
  • Stockholm
  • 2004-03-02 09:19
Ursprungligen av Linus:
// när du matar in till db'n
$string = addslashes($string);

// när du plockar ut
$string = stripslashes($string);

hmm.
Du undviker frågan lite
Om jag ska mata in strängen <a href="hej">hej</a> så kan jag ju göra det genom att skriva (precis som addslashes() gör, eller mysql_escape_string())

$string = "<a href=\"hej\">hej</a>";
mysql_query("INSERT INTO news (message)
VALUES($string)");

men det lustiga är (som jag märkte nu... är att den sparar faktiskt strängen korrekt, men när den hämtar ut strängen så addar den slashes på servern, men inte på min lokala server. Är det en global inställning?

  • Medlem
  • Stockholm
  • 2004-03-02 09:34
function updateNews($news) {

    if(!validNews($news))
        return false;

	if($news == "-1")	
		return false;
	// don't use htmlspecialchars since they are allowed to use html-tags.
	//$header		=	mysql_escape_string($news['header']);
	//$message	=	mysql_escape_string($news['message']);
	$header    = $news['header'];
	$message   = $news['message'];
	$id			=	$news['id'];

	$query = mysql_query("	UPDATE news
							SET
								date_created = date_created,
								header = '$header',
								message = '$message'
							WHERE
								id = '$id'
						") or die("updateNews(): " . mysql_error());
	
	if(mysql_affected_rows() == 1)
		return true;
	else
		return false;
}

Ja, humm. På min lokala webbserver så fungerade koden när jag använde mysql_escape_string()
Det konstiga är att på min lokala server så kan jag klicka "Spara nyhet" och den svarar med "Ingenting hade ändrats, nyheten sparades ej" och nyheten står kvar i sin <textarea> men på den skarpa servern så skrivs nyheten ut i sin <textarea> fast backslashad !! men ej sparad i databasen då.... hur sjutton?

  • Medlem
  • Stockholm
  • 2004-03-02 09:43

Japp.
Den som söker den skall finna.

http://se.php.net/manual/sv/function.stripslashes.php

Citat:

An example use of stripslashes() is when the PHP directive magic_quotes_gpc is on (it's on by default), and you aren't inserting this data into a place (such as a database) that requires escaping. For example, if you're simply outputting data straight from an HTML form.

http://se.php.net/manual/sv/ref.info.php#ini.magic-quotes-gpc

Citat:

magic_quotes_gpc boolean

Sets the magic_quotes state for GPC (Get/Post/Cookie) operations. When magic_quotes are on, all ' (single-quote), " (double quote), \ (backslash) and NUL's are escaped with a backslash automatically.

Not: If the magic_quotes_sybase directive is also ON it will completely override magic_quotes_gpc. Having both directives enabled means only single quotes are escaped as ''. Double quotes, backslashes and NUL's will remain untouched and unescaped.

See also get_magic_quotes_gpc()

Så, lösningen blev

if(get_magic_quotes_gpc()==1) {
        $news['header'] = stripslashes($news['header']);
        $news['message'] = stripslashes($news['message']);
    }

så att utskriften blev korrekt.

  • Medlem
  • Stockholm
  • 2004-03-02 09:49

Här undviks inga frågor
Man ska alltid escapea datan och det är på det sättet jag gör (du gör på annat sätt?) och det har alltid fungerat bra.
Vari ligger ditt problem? Att något fungerar lokalt men inte online? Kolla skillnader i settings med phpinfo() så blir du säkert klokare.

  • Medlem
  • Stockholm
  • 2004-03-02 09:54
Ursprungligen av Linus:

Här undviks inga frågor
Man ska alltid escapea datan och det är på det sättet jag gör (du gör på annat sätt?) och det har alltid fungerat bra.
Vari ligger ditt problem? Att något fungerar lokalt men inte online? Kolla skillnader i settings med phpinfo() så blir du säkert klokare.

Det var precis det som var problemet!
Och det lär gälla alla att man ska kolla magic_quotes_gpc innan man escapar sin data.

Jag har också använt addslashes() och stripslashes().... använde det för just det här jobbet men blev förvånad över att den verkade lägga in sina slashes permanent så de sparades i databasen. och det var ju precis det som hände, därför magic_quotes_gpc var påslaget.

Vi skulle kunna leda in den här diskussionen på skillnaden mellan mysql_escape_string() och addslashes() istället..
vad sjutton är skillnaden?

  • Medlem
  • Stockholm
  • 2004-03-02 09:56

Ivar, som jag förstår det escapear du inte sakerna du skickar in i db'n?
Ha som vana att alltid göra det, undantagslöst, är mitt förslag.

  • Medlem
  • Stockholm
  • 2004-03-02 09:58
Ursprungligen av Linus:

Ivar, som jag förstår det escapear du inte sakerna du skickar in i db'n?
Ha som vana att alltid göra det, undantagslöst, är mitt förslag.

ja, det ska jag verkligen ha för vana. Har inte använt det jämt, men sedan några månader tillbaks använder jag det undantagslöst.

Jag använder i dagsläget mysql_escape_string() .. och undrar om det är någon skillnad mot addslashes()

  • Medlem
  • Stockholm
  • 2004-03-02 09:58

Ingen aning, det finns massor av sätt att göra olika saker på. Addslashes är vad jag kör, för att det var det första jag lärde mig.

  • Medlem
  • Stockholm
  • 2004-03-02 10:13

mysql_escape_string calls MySQL's library function of the same name,
which prepends slashes to the following characters: NUL (\x00), \n, \r, \,
', " and \x1a.

AddSlashes escapes NUL, ', " and \.

  • Medlem
  • Stockholm
  • 2004-03-03 11:55

Allright.

Jag slashar för att använda strängen i en databasfråga så då verkar mysql_escape_string lämpa sig för mina syften.

Skönt att ha rett ut det här

1
Bevaka tråden