[php] doorgeven van ' en " en andere rare tekens

Pagina: 1
Acties:
  • 366 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • hobbeldebobbel
  • Registratie: Februari 2001
  • Laatst online: 15-02-2023
ik zit met het volgende probleem, maar voordat ik die tentoon stel eerst een opzet vijn mijn systeem.

Ik heb een database met daarin een hele reut gegevens. in die gegevens kunnen dus ook bijvoorbeeld single quotes en bijvoorbeeld &'s tevoorschijnkomen.
Tevens gebruik ik met PHP-GET mogelijkheden om dingen die rechtstreeks uit de database komen direct in een linkje te gooien zodat mensen door kunnen klikken.
Natuurlijk moeten die mensen wel een campell's soup zien en geen campell%27s+soup of andere rare tekens.

mijn vraag is dan, hoe moet ik mijn gegevens opslaan in de database, met die rare tekens erin of met de veranderde tekens, dus die %27 of wat is hiervoor de standaard?

ik kan met url-encode en decode natuurlijk gaan werken, maar ik weet niet of dit 'de manier' is zeg maar... kan iemand mij dat vertellen...


ps: het gaat om bijvoorbeeld deze zoekmachine: http://archipics.sturb.nl/Pboom.php >projectnaam en dan cambell's soup. de dbase heeft 1 foto ervan inzich staan. Toch geeft het getalletje 0 aan dat het fout is.... want hij zoekt op die %27....

moet ik dan de input-scherm voor de database allemaal urlencode?

bedankt alvast voor jullie hulp

[ Voor 11% gewijzigd door hobbeldebobbel op 13-03-2006 23:16 ]

hier zou een slimme opmerking kunnen staan
maar die staat er niet


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

hobbeldebobbel schreef op maandag 13 maart 2006 @ 23:15:
mijn vraag is dan, hoe moet ik mijn gegevens opslaan in de database, met die rare tekens erin of met de veranderde tekens, dus die %27 of wat is hiervoor de standaard?
gewoon opslaan zoals het is, dus een " als een "
pas zodra je die gegevens weer uitleest en naar bijvoorbeeld html om wilt zetten gebruik je htmlentitites, wil je het in een url gebruiken dan doe je urlencode etc
op die manier kan je altijd de data eenvoudig converten naar het formaat dat je nodig hebt :)

Acties:
  • 0 Henk 'm!

  • hobbeldebobbel
  • Registratie: Februari 2001
  • Laatst online: 15-02-2023
ok, maar dan staat erin mijn veld van de dbase Cambell's soup met een ' dus.
Als ik daar een query van maak dan zal die ' een groot probleem opleveren, aangezien de variabele dan niet meer klopt:
code:
1
$sql = "SELECT * FROM archi_foto WHERE veld = 'waarde1' AND veld2 = 'Cambell's soup'";

die campell's soup komt meot ik dan escapen....toch? enzoja hoedan?

hier zou een slimme opmerking kunnen staan
maar die staat er niet


Acties:
  • 0 Henk 'm!

  • TheBorg
  • Registratie: November 2002
  • Laatst online: 20-09 18:24

TheBorg

Resistance is futile.

Gebruik bijv.:
addslashes
mysql_real_escape_string

voor je het in de db stopt. Vaak is is in de php.ini al ingesteld all POST variablen te escapen.

[ Voor 50% gewijzigd door TheBorg op 13-03-2006 23:26 ]


Acties:
  • 0 Henk 'm!

  • twanvl
  • Registratie: Februari 2005
  • Laatst online: 22-08 11:42
Bij de database functies zit ook een escape functie. Voor mysql is dit bijvoorbeeld mysql_escape_string.

Acties:
  • 0 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 17-09 10:39

Cloud

FP ProMod

Ex-moderatie mobster

Voor het opslaan naar de Database gebruik ik zelf vaak mysql_escape_string. Deze escaped de string zodat MySQL (en andere DB's) niet op hun smoeltje gaan :) Als je de string uitleest gebruikt PHP dezelfde escapes en zie je de tekst ook gewoon zoals je het erin gestopt hebt. Dan kun je eventueel ook nog HTML entities toepassen en andere functies, maar het escapen is dan al klaar.

edit:
enkele seconden te laat...

[ Voor 6% gewijzigd door Cloud op 13-03-2006 23:26 ]

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

TheBorg schreef op maandag 13 maart 2006 @ 23:25:
Gebruik bijv.:
addslashes
mysql_real_escape_string

voor je het in de db stopt. Vaak is is in de php.ini al ingesteld all POST variablen te escapen.
liever die magic quotes uitzetten, heb je alleen maar last van imo

Acties:
  • 0 Henk 'm!

  • hobbeldebobbel
  • Registratie: Februari 2001
  • Laatst online: 15-02-2023
ok....
dat zou mooi zijn in theorie, ware het nu dat er steeds meer slashes zeg maar te voorschijn komen voor de speciale tekens... alsof dat wat geescaped word, ook geescaped wordt.

Ik heb nu in iederelink: urlencode() om de php-variabelen gezet. En om iedere argument in een mysql query mysql_escape_string().

en toch grrr ik wordt er kriegel van

hier zou een slimme opmerking kunnen staan
maar die staat er niet


Acties:
  • 0 Henk 'm!

  • TheBorg
  • Registratie: November 2002
  • Laatst online: 20-09 18:24

TheBorg

Resistance is futile.

Kijk eens met
PHP:
1
echo get_magic_quotes_gpc();

of er al automatisch geëscaped wordt.

Met set_magic_quotes_runtime is dit eventueel uit te schakelen.

http://nl2.php.net/manual/en/security.magicquotes.php

[ Voor 16% gewijzigd door TheBorg op 13-03-2006 23:50 ]


Acties:
  • 0 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 17-09 10:39

Cloud

FP ProMod

Ex-moderatie mobster

hobbeldebobbel schreef op maandag 13 maart 2006 @ 23:40:
ok....
dat zou mooi zijn in theorie, ware het nu dat er steeds meer slashes zeg maar te voorschijn komen voor de speciale tekens... alsof dat wat geescaped word, ook geescaped wordt.

Ik heb nu in iederelink: urlencode() om de php-variabelen gezet. En om iedere argument in een mysql query mysql_escape_string().

en toch grrr ik wordt er kriegel van
Ik weet niet precies wat je fout doet, maar in principe hoef je maar 1 keer te escapen. Ik raad je overigens wel aan de gehele query string in 1 keer te escapen, in plaats van alle delen los. :) Escape je niet per ongeluk ook nog alles wat je uit de DB haalt?

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

TheBorg schreef op maandag 13 maart 2006 @ 23:43:
Kijk eens met
PHP:
1
echo get_magic_quotes_gpc();

of er al automatisch geëscaped wordt.

Met set_magic_quotes_runtime is dit eventueel uit te schakelen.
magic_quotes_runtime is wel wat anders dan gpc, maar je wilt ze allebei iig niet imo, geeft alleen maar gedonder met extra slashes. Ik vind dan ook persoonlijk dat PHP gewoon van mijn input af moet blijven, ik regel dat zelf wel :)

Acties:
  • 0 Henk 'm!

  • hobbeldebobbel
  • Registratie: Februari 2001
  • Laatst online: 15-02-2023
dit is een van de drie zelfde stukjes code...

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
$omzet = array( 'soort foto' => 'deel',
        'soort project' => 'proj_soort',
        'project naam' => 'proj_naam',
        'project locatie' => 'proj_loc',
        'project jaar' => 'proj_jaar',
        'project buro' => 'proj_buro'       
        );

                    print " <a href=\"Pboom.php\"><b>".$_GET['s1'] . "</b></a><BR>";
                    //nu distinct waardes laten zien van 
                    $sql = "SELECT distinct ".mysql_real_escape_string($omzet[$_GET['s1']])." FROM archi_foto ORDER BY ".mysql_real_escape_string($omzet[$_GET['s1']])." ASC";
                    $res = mysql_query($sql) or die(mysql_error());
                    while($arr = mysql_fetch_array($res)){
                        if(!empty($arr[$omzet[$_GET['s1']]])){
                            ?>
                            &nbsp; > <a href="Pboom.php?s1=<?=urlencode($_GET['s1'])?>&q1=<?=urlencode($arr[$omzet[$_GET['s1']]])?>">
                            <?
                                if($omzet[$_GET['s1']] == 'deel'){
                                    ?><?=urldecode(str_replace('-', ' ', substr($arr[$omzet[$_GET['s1']]],2, strlen($arr[$omzet[$_GET['s1']]]))))?><?
                                
                                }else{
                                    ?><?=urldecode($arr[$omzet[$_GET['s1']]])?><?
                                }
                                $s2 = "SELECT bestand FROM archi_foto WHERE ".mysql_real_escape_string($omzet[$_GET['s1']])." = '".mysql_real_escape_string($arr[$omzet[$_GET['s1']]])."'";
                                $r2 = mysql_query($s2) or die (mysql_error());
                                $a2 = mysql_num_rows($r2);
                                
                            ?></a> (<?=$a2?>) <br>
                            <?
                        }else{
                            //niet gespecificeerd
                            $s2 = "SELECT bestand FROM archi_foto WHERE ".mysql_real_escape_string($omzet[$_GET['s1']])." = '".mysql_real_escape_string($arr[$omzet[$_GET['s1']]])."'";
                            $r2 = mysql_query($s2) or die (mysql_error());
                            $a2 = mysql_num_rows($r2);
                            print "&nbsp; > niet gespecificeerd (".$a2.")<br>";
                            
                        };
                    };
                }else{
                    //er is een keuze geselecteerd voor nummer1
                    if($_GET['s1'] == 'soort foto'){
                        print " <a href='Pboom.php?s1=".urlencode($_GET['s1'])."'><b>";
                        print urldecode(substr($_GET['q1'],2, strlen($_GET['q1'])));
                        print "</b></a> >>><BR>";
                    }else{
                        print " <a href='Pboom.php?s1=".urlencode($_GET['s1'])."'><b>".stripslashes($_GET['q1']) . "</b></a> >>><BR>";
                    };
                };

denk dat er wel het een en ander aan fout is... heb in mijn gekkigheid hier en daar dingenaangepast....
als het over 10 minuten niet opgelost is dan gaat de computert uit en gaat ikslapen.. bah bah om echt gek van te worden...

[ Voor 22% gewijzigd door hobbeldebobbel op 13-03-2006 23:51 ]

hier zou een slimme opmerking kunnen staan
maar die staat er niet


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Ik heb een aantal keer naar je code gekeken en ik kan er geen soep van maken. Mijn eerste advies is daarom om het nog eens netjes uit te typen. Daar heb je zelf ook wat aan wanneer je volgende week een aanpassing wil doen.

Het tweede advies is weer meer ontopic en heeft te maken met hoe een programmeertaal met gegevens omgaat. Gegevens van het string type kunnen in principe alle karakters bevatten. Dat houdt in dat er ook tekens in kunnen staan die betekenis hebben in de syntax van de taal waarin je werkt. Dit werpt het probleem op dat het voor de compiler/interpreter onmogelijk wordt om te bepalen waar een variabele van het string type eindigt. Als afgesproken is dat een " (quote) een string omsluit zou je dat teken niet kunnen gebruiken in een string variabele.
Om dit probleem op te lossen wordt er gebruik gemaakt van zgn. escape tekens. Zo'n escape teken houdt in dat het teken erna letterlijk moet worden geïnterpreteerd en dus geen onderdeel uitmaakt van de syntax. Als het escape-teken een \ (backslash) is en het teken dat een een string afbakend een " (quote) betekent dat dus dat we met deze string "\"" een enkele quote aanduiden. Door een escape-teken voor het escape-teken te plaatsen verliest het tweede escape-teken zijn bijzondere betekenis. Met "\\" kunnen we dus een enkele backslash aanduiden.

Zodra je met de ene taal (PHP) een opdracht opstelt in een andere taal (SQL) moet je dus zorgen dat alle bijzondere tekens op juiste maniet escaped worden. In het geval van PHP en MySQL is de beste functie hiervoor mysql_real_escape_string(). Belangrijkste reden daarvoor is dat deze functie aan MySQL zelf vraagt hoe er geëscaped moet worden, itt tot addslashes() dat een standaardroutine volgt.
Omdat escapen een vrij normale business is hebben de PHP-developers ooit bedacht dat het het handig zou zijn om variabelen die binnenkomen van buitenaf alvast voor jou te escapen. Hiervoor zijn de zgn. magic-quotes instellingen. Wanneer deze aanstaan dan komt bijvoorbeeld een GET variabele met alleen een " (quote) je script binnen als \" (een escaped quote). Het probleem met deze instelling is dat veel mensen (vooral beginners) de draad kwijt raken. Er verschijnen "opeens" extra escape-tekens. Daarnaast staat deze instelling niet bij elke hoster aan, als je script er op vertrouwt en het staat uit dan staat je script gelijk open voor een aanval. Zonder het escape teken kan een kwaadwillende immers je string variabele afbreken en code invoeren.

Het advies is dus om te zorgen dat je altijd werkt met de letterlijke variabelen in je script. Zet magic_quotes uit en zorg dat de escape-tekens gestript worden als het wel aanstaat. Nu heb je altijd de controle om te zorgen dat de waarde bij het opslaan in de database wordt geëscaped met mysql_real_escape_string(). Bij het weergeven in een HTML pagina kun je met htmlentities()/htmlspecialchars() de gegevens goed worden gecodeerd voor HTML-overdracht en last but not least kun je urlencode() gebruiken om de variabele in een URL te gebruiken.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • hobbeldebobbel
  • Registratie: Februari 2001
  • Laatst online: 15-02-2023
wow T-Mob hartelijk dank voor deze uitleg.... nog een keer wow.

het is me helemaal duidelijk. Ik denk dus dat bij mijn host magic quotes aanstaan, vandaar het te voorschijn komen van verschillende escape characters en escaped-esape characters.

Ik ga denk ik maar even mijn code opnieuw schrijven. In iedergeval de plekken waar code vanuit de database bekeken wordt.

ik heb nog nooit rekening gehouden met dat escaped characters... beetje jammer...en om nou al mijn code te gaan herzien... hmmmm

[ Voor 8% gewijzigd door hobbeldebobbel op 14-03-2006 10:18 ]

hier zou een slimme opmerking kunnen staan
maar die staat er niet

Pagina: 1