[PHP] Escape problemen met PHP i.c.m. databases

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
In de FAQ staat dit: P&W FAQ - PHP

Dus nou wil ik het goed doen ook. Maar met drm's functie aldaar gaat het bij mij niet goed. Toen heb ik vanalles geprobeerd, maar telkens krijg ik die string
code:
1
' \' '' \\' \\\' " \" "" \\" \\\" ` \` `` \\` \\\`
niet goed in mijn MySQL db. Het beste resultaat is telkens
code:
1
\' \\\' \'\' \\\\\' \\\\\\\' \


Mijn PHP-instellingen:
magic_quotes_gpc On On
magic_quotes_runtime Off Off
magic_quotes_sybase Off Off

Maar ik wil dat wel server-onafhankelijk hebben, dus met magic_quotes uit (maakt voor mij dus niets uit):
PHP:
1
set_magic_quotes_runtime(0);


Hier voor het gemak maar even de relevante code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
define ( 'QUOTE_SINGLE',      39 );
define ( 'QUOTE_DOUBLE',      34 );
define ( 'QUOTE_BACKTICK',    96 );

function mysql_escape ( $string, $quote_char_code = QUOTE_SINGLE ) {
   $quote_char = chr ( $quote_char_code );
   
   return
      $quote_char .
         str_replace (
            array ( '\\', $quote_char ),
            array ( '\\\\', '\\' . $quote_char ),
            $string
         ) . $quote_char;      
}

$query = 'INSERT INTO test (test) VALUES('.mysql_escape($_GET['string']).');';


Dus mijn vraag: hoe kan ik dit het beste doen?

offtopic:
Er staat een fout in function mysql_escape() in de FAQ: aan het eind van regel 13 of aan het begin van regel 14 moet nog een .. :) Zie hierboven.

Acties:
  • 0 Henk 'm!

  • Schonhose
  • Registratie: April 2000
  • Laatst online: 17-09 20:01

Schonhose

Retro Icoon

Waarom zo moeilijk?

addslashes
mysql_escape_string

volgens mij kunnen deze standaard functies het wel...

[edit]
uit de faq:
Maar waarom gebruik je nou in vredesnaam die add- en stripslashes functies niet?

Het probleem met die functies is dat er soms dingen escaped worden die niet ge-escaped hoeven te worden naast dingen die wel escaped moeten worden. Als er dus data ingevoerd die opzichzelf een escape-sequence is, wordt die data in eerste instantie escaped voor bijv. MySQL, maar bevat hij bij uitlezen weer diezelfde escape-sequence die ingevoerd is. Als je daar vervolgens een stripslashes () overheenhaalt, ben je een escape sequence kwijt. Vandaar dat de bovengenoemde testcase de beste is om na te gaan of er niet teveel of te weinig escapes uitgevoerd worden
Dat was nieuw voor mij. :+

[ Voor 66% gewijzigd door Schonhose op 06-10-2004 11:58 ]

"The thing under my bed waiting to grab my ankle isn't real. I know that, and I also know that if I'm careful to keep my foot under the covers, it will never be able to grab my ankle." - Stephen King
Quinta: 3 januari 2005


Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Vergeet niet de extra slashes alsnog te strippen als je per keer de magic_quotes_runtime(0) gebruikt:

PHP:
1
2
3
4
5
6
7
8
9
if ( get_magic_quotes_gpc () ) {
   foreach ( $_POST as $key => $value ) {
      $_POST [ $key ] = stripslashes ( $value );
   }
   foreach ( $_GET as $key => $value )
   {
        $_GET [ $key ] = stripslashes ( $value );
   }
}

Sundown Circus


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
RedRose schreef op 06 oktober 2004 @ 12:01:
Vergeet niet de extra slashes alsnog te strippen als je per keer de magic_quotes_runtime(0) gebruikt:
PHP:
1
Ja klopt :) Het komt inderdaad al veel beter in de buurt, maar het is nog niet goed:
code:
1
' \' '' \\' \\\' " \" "" \\" \

Het zou moeten worden:
code:
1
' \' '' \\' \\\' " \" "" \\" \\\" ` \` `` \\` \\\`


Dus hij breekt de string af bij \\\" (maar niet bij \\\').

Acties:
  • 0 Henk 'm!

  • SvMp
  • Registratie: September 2000
  • Niet online
Een laat antwoord, maar toch een reactie omdat ik precies hetzelfde probleem heb gehad en heb opgelost.

Oorzaak bleek bij mij het HTML-formulier te zijn.
Stap1: Invoer velden met submit naar volgende stap.
Stap2: De invoer wordt netjes op een rijtje getoond. Aan de gebruiker wordt gevraagd of hij/zij de invoer wil inzenden of nog dingen wil wijzigen. Inzenden = submit naar stap 3.
Stap 3: Zooi wordt de database in gejaagd en de gebruiker krijgt bevestiging.

Het bleek mis te gaan bij stap 2. In stap 2 sla ik de invoer op in een stel hidden inputs, zodat het opnieuw gesubmit kan worden naar stap 3 als de gebruiker alles ok vindt. PHP poept dus een stel velden uit die er als volgt uit zien: <INPUT TYPE=HIDDEN VALUE="het verhaaltje dat ik heb ingevoerd...">. Hoe goed je escapes naar de database toe ook zijn, een " wordt verkeerd opgevat binnen die form-tag. Escape reeksen worden daarin niet herkend.

Dit is de oplossing:
code:
1
2
3
function invoer_hidden($naam,$value) {
   echo "<input type=\"hidden\" name=\"FORM_$naam\" value=\"" . str_replace('"',"&#34",$value) . "\">\n";
}


Die " vervangen door &#34 zodat de HTML niet in de war raakt. Als er toch rechtsteekse " in voorkomen, dan wordt de string afgebroken.

In mijn geval trad het probleem op met hidden inputs, maar precies hetzelfde probleem krijg je als je zichtbare inputs van het type TEXT of PASSWORD gebruikt die vanuit de database al gevuld worden, bijvoorbeeld om bepaalde zaken te kunnen wijzigen als gebruiker zijnde. Zodra er in de database velden " voorkomen dan kan de het wel keurig ge-escaped worden, maar HTML snapt geen escape reeksen. Daar moet rekening mee gehouden worden door het kritieke teken " te vervangen door &#34 zodra je data in HTML FORM-inputs stopt. Sinds ik dat zo doe, doorstaat mijn code de escape-teststring uit de FAQ glansrijk :)

[ Voor 8% gewijzigd door SvMp op 18-12-2004 15:51 ]


Acties:
  • 0 Henk 'm!

  • Rotjeknor
  • Registratie: April 2001
  • Laatst online: 01-04-2023
Ik heb de FAQ voor dat stuk ook eens doorgelezen, ik vind het nogal omslachtig, dus hier maar eens mijn methode, wellicht dat daar juist weer mensen commentaar cq kritiek ophebben, in mijn geval werkt het nu perfect. Ook het voorbeeld in de FAQ wordt prima overgenomen in mn db.

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
function gpc_override()
{
  function strip($var)
  {
    reset($var);
    if (is_array($var))
    {
      foreach($var as $key => $value)
      {
        $var[$key] = is_array($value) ? strip($value) : stripslashes($value);
      }
    }
    else
    {
      $var = stripslashes($var);
    }
    return $var;
  }

  if (get_magic_quotes_gpc())
  {
    $_GET    = strip($_GET);
    $_POST   = strip($_POST);
    $_COOKIE = strip($_COOKIE);
  }
}

Waarbij gpc_override() op elke pagina wordt aangesproken. Vervolgens staat in elke mysql insert of update query een addslashes, bv:
PHP:
1
2
3
4
5
6
7
8
9
10
$query = "insert into
            news
          (
            title
          )
          values
          (
            '".addslashes($title)."'
          )
          ;";

Ook Knor is aangestoken met het ligfietsvirus!


Acties:
  • 0 Henk 'm!

Verwijderd

Rotjeknor schreef op zaterdag 18 december 2004 @ 16:05:
Ik heb de FAQ voor dat stuk ook eens doorgelezen, ik vind het nogal omslachtig, dus hier maar eens mijn methode, wellicht dat daar juist weer mensen commentaar cq kritiek ophebben, in mijn geval werkt het nu perfect. Ook het voorbeeld in de FAQ wordt prima overgenomen in mn db.
De kritiek die ik hierop heb, is dat je geen "patch" moet schrijven als je het met een simpele configuratie-verandering voor elkaar kunt krijgen. Gewoon een .htaccess met de regel php_flag magic_quotes_gpc off.

Acties:
  • 0 Henk 'm!

  • Rotjeknor
  • Registratie: April 2001
  • Laatst online: 01-04-2023
Verwijderd schreef op zaterdag 18 december 2004 @ 16:08:
[...]

De kritiek die ik hierop heb, is dat je geen "patch" moet schrijven als je het met een simpele configuratie-verandering voor elkaar kunt krijgen. Gewoon een .htaccess met de regel php_flag magic_quotes_gpc off.
Vooropgesteld dat je die file inderdaad aan kan maken heb je gelijk.

Ook Knor is aangestoken met het ligfietsvirus!

Pagina: 1