[PHP] quotes, backslashes, escapes

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Maniakje
  • Registratie: Februari 2001
  • Laatst online: 12-09 17:48
Ik ben een news-scriptje aan het maken. Het is de bedoeling dat de gebruiker ook allerlei apparte tekens kan gebruiken, die zo ook weer in de newspost terugkomen. Dus als de gebruiker een ' of \ tikt, moet in de newspost een ' of \ staan. En als hij \\ of \' tikt, moet in de newspost respectievelijk \\ of \' staan (en dus niet of ').

Het punt is dat dit scriptje moet werken, ongeacht of magic_quotes_gpc aanstaat. Ik heb daarvoor de volgende code (schematisch weergegeven):

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function addnews {
  // user vult wat in in tekstvak 'contents'
  // klikt submit, wordt verstuurd naar 'preview'
}

function preview {
  $contents = $_POST['contents'];
  if (get_magic_quotes_gpc() == 1) $contents = stripslashes($contents);
  // preview wordt getekend (werkt perfect)
  // tekstvak wordt gevuld met $contents (werkt perfect)
  // user verandert eventueel iets in tekstvak
  // submit --> wordt verstuurd naar 'post'
}

function post {
  $contents = $_POST['contents'];
  if (get_magic_quotes_gpc() == 0) $contents = addslashes($contents);
  // $contents wordt naar database geschreven
}

function shownews {
  // $contents wordt ingelezen van database
  echo $contents;
  // ik hoef niet te strippen want dat gebeurt al bij het invoegen in de database??
}

Wanneer magic_quotes_gpc aanstaat werkt dit prima. Als de gebruiker een ' invult, wordt in de database ' opgeslagen. Bij het weergeven van de newspage wordt die weer gestript en wordt er weer netjes de ' weergegeven. Ook een backslash werkt goed.

Het gaat pas fout wanneer magic_quotes_gpc uit staat. De preview is gewoon goed, maar de newspost niet. De quotes doet ie dan goed, een ' wordt ' in de database en ' in de newspost. Maar de backslashes zijn een probleem. \' wordt '. Er wordt dus stiekum één backslash gestript als magic_quotes_gpc uit staat. Maar waar? Wat doe ik hier fout?

[ Voor 21% gewijzigd door Maniakje op 03-11-2003 23:40 ]

The sentence below is true.
The sentence above is false.


Acties:
  • 0 Henk 'm!

  • Jurgle
  • Registratie: Februari 2003
  • Laatst online: 24-06 00:27

Jurgle

100% Compatible

en als je ze nou een urlencode()-ed post?

My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant


Acties:
  • 0 Henk 'm!

  • BetuweKees
  • Registratie: Januari 2003
  • Laatst online: 15-07 20:53

BetuweKees

Flipje uit Tiel

indien geen magic quotes addslashes doen voordat je naar de database stuur lijkt me..

Through meditation I program my heart to beat breakbeats and hum basslines on exhalation -Blackalicious || *BetuweKees was AFK; op de fiets richting China en verder


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Magic quotes zijn ranzig. Ik raad je aan om deze uit te zetten in bijvoorbeeld php.ini, httpd.conf of .htaccess (ligt er een beetje aan waar je bij kunt)

Als je er niet bij kunt, of als je je scripts wil laten werken ongeacht die setting, dan kun je ook met de hand even alle variabelen ontdoen van hun slashes. Gewoon even alle $_POST, $_GET, $_COOKIE etc. langs lopen, en stripslashes doen.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if (get_magic_quotes_gpc ())
{
    if (isset ($_GET))
    {
        foreach ($_GET as $key => $val)
            $_GET[$key] = stripslashes ($val);
    }
    
    if (isset ($_POST))
    {
        foreach ($_POST as $key => $val)
            $_POST[$key] = stripslashes ($val);
    }
    
    if (isset ($_COOKIE))
    {
        foreach ($_COOKIE as $key => $val)
            $_COOKIE[$key] = stripslashes ($val);
    }
}


Als je dit als eerst doet, dan ben je er gewon van gegarandeerd dat de input variabelen niet geescaped zijn. Je moet ze natuurlijk wel even met de hand escapen voor je ze een database ingooit.

[ Voor 12% gewijzigd door .oisyn op 04-11-2003 02:20 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • GambitRS
  • Registratie: Juni 2001
  • Laatst online: 13-06-2013

GambitRS

w00t

lijkt me dat hij liever addslashes gebruikt, als er 1 slash wordt weggehaald door de parser (die extra slash) dan staat de originele text er. Met stripslashes haal je uit de text de slashes en dat is nou precies wat de TS niet wil.

[ Voor 4% gewijzigd door GambitRS op 04-11-2003 02:35 ]

MechWarrior || Monsters Game


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Het is imho beter om zekerheid te hebben over een bepaalde waarde, dan dat je voor elke keer dat je 'm gebruikt moet kijken wat de waarde van get_magic_quotes_gpc () is, om vervolgens een add of stripslashes te doen.

Dat hele automatische escapen van input variabelen is gewoon ranzig en dat moeten ze afschaffen. Het zorgt alleen maar voor extra bugs en frustraties. Want zeg nou zelf, als dat hele magic_quotes gedoe er niet was geweest, had de TS dan zijn topic hoeven openen? :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Maniakje
  • Registratie: Februari 2001
  • Laatst online: 12-09 17:48
BetuweKees schreef op 04 november 2003 @ 01:18:
indien geen magic quotes addslashes doen voordat je naar de database stuur lijkt me..
Dat doe ik toch ook. :)
PHP:
1
 if (get_magic_quotes_gpc() == 0) $contents = addslashes($contents);


.oisyn, de code die jij geeft is een betere manier dan die ik gebruik, in die zin dat jouw code alles get/post/cookies stript, en de mijne alleen maar de variabele waar het me (in dit geval) om gaat. De methode is echter gewoon hetzelfde. Jouw code doet voor $contents hetzelfde als mijn regels:
PHP:
1
2
$contents = $_POST['contents']; 
if (get_magic_quotes_gpc() == 1) $contents = stripslashes($contents);
Het is dus geen oplossing voor mijn probleem.

Je hebt gelijk wanneer je zegt dat ik wel even eerst moet slashen voordat ik het in de database zet, maar dat doe ik ook. Dat wordt verzorgt door de code in de functie post(). Alleen heb ik het daar omgedraaid: in plaats van eerst alles te strippen zodat je zeker weet dat het niet geslashed is, en daarna slashes toe te voegen heb ik ervoor gekozen om gewoon alleen slashes toe te voegen als magic quotes uit staat. Dat komt op hetzelfde neer. :)

---

Ik zal even mijn probleem herformuleren. Ik zorg er aan het begin van iedere functie voor dat de variabele gestript is. Dat gebeurt ook met de code in mijn openingspost. Alleen bij de functie post() wordt addslashes uitgevoerd voordat $contents in de database wordt gezet.

In theorie moet dit gewoon werken (volgens mij). Even stap voor stap uitwerken. Ik zal de letter b schrijven voor een backslash, want anders begint de php van GoT te flippen. Ik had daar ook nogal moeite mee bij het editten van mijn openingspost.

Magic quotes AANMagic quotes UIT

addnews()
user voert in: bbb
user klikt submit
via post method naar preview()

preview()
$_POST is nu bbbbbb
$contents = $_POST geeft...
...$contents := bbbbbb
get_magic=on ==> stripslashes doen...
...maakt ervan $contents := bbb
echo $contents; geeft op scherm bbb (de preview)
user klikt submit
via post method naar post()

post()
$_POST is nu bbbbbb
$contents = $_POST geeft $contents := bbbbbb
get_magic=on ==> geen addslashes doen...
... dus $contents blijft bbbbbb
SQL: INSERT in database

database()
Value in database: bbb

shownews
echo $contents; geeft op scherm bbb

addnews()
user voert in: bbb
user klikt submit
via post method naar preview()

preview()
$_POST is nu bbb
$contents = $_POST geeft $contents := bbb
get_magic=off ==> geen stripslashes doen
... $contents blijft bbb
echo $contents; geeft op scherm bbb (de preview)
user klikt submit
via post method naar post()

post()
$_POST is nu bbb
$contents = $_POST geeft $contents := bbb
get_magic=off ==> addslashes doen...
...daardoor $contents := bbbbbb
SQL: INSERT in database

database()
Value in database: bbb

shownews
echo $contents; geeft op scherm bbb


Dit is dus wat er in theorie moet gebeuren. De linker kolom (magicquotes=on) gaat goed, maar de rechter kolom (magicquotes=off) niet. Wat ik zo vreemd vind (zoals in de openingspost al staat) is dat het met magicquotes=off wel werkt voor quotes, maar niet voor backslashes.

Ik hoop dat het een beetje duidelijk is wat ik bedoel, want het is nogal een verwarrend geheel. Tussen twee haakjes, volgens mij zit GambitRS ook een heel eind in de goede richting met zijn opmerking.

The sentence below is true.
The sentence above is false.


Acties:
  • 0 Henk 'm!

  • Maniakje
  • Registratie: Februari 2001
  • Laatst online: 12-09 17:48
Wat ik trouwens ook niet snap, is dat ik in shownews() de tekst niet meer hoef te strippen wanneer ik hem op het scherm zet. Dat terwijl de tekst wel ge'addslashed (wat een woord) is toen ik hem in de database zette. Wordt het soms ook al door SQL gestript bij de INSERT clausule?

The sentence below is true.
The sentence above is false.


Acties:
  • 0 Henk 'm!

Verwijderd

Worden \ wel geescaped door addslashes?

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

kort: Ja.
Was @ maniakje, maar het geld ook voor trebel




@Duthcmega

Dan heb je of nooit goed getest (probeer eens "Janoz' test" of ("c:\nieuwemap") in te vullen) of je bent slachtoffer van slashesgemakzucht die ontstaat doordat er van alles automatisch gebeurt (todat je sites een keer op een server zonder magic quotes draait)

[ Voor 145% gewijzigd door Janoz op 04-11-2003 16:32 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Dutchmega
  • Registratie: September 2001
  • Niet online
Waarom eerst slashes toevoegen voordat je het in de db stopt>? ik stop altijd alles zonder (extra) slashes in de db en werkt prima :S?

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

De beste manier blijft gewoon alles zo te escapen dat er niets meer gestripped hoeft te worden zodra je het de database uithaalt.

Dus (schematisch):
[code]
als get_magic_quotes_.... ()
stripslashes waar nodig

escape strings pas bij inserten door
' te vervangen door ''
\ te vervangen door \[/code]
als je dan weer uit de database leest hoef je helemaal niets te strippen of iets dergelijks. Overigens staat dit niet voor niets in de FAQ.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Maniakje: zeg nou zelf, vind je het niet heel erg vervelend om overal in je code maar weer te kijken naar wat de huidige setting van magic_quotes is?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1