[php] dbal insert problemen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • josvane
  • Registratie: Oktober 2002
  • Laatst online: 09-09 13:03
Voor een systeem wat ik aan het bouwen maak ik gebruik van DBAL welke ook in phpbb gebruikt wordt.
Als je een insert wilt doen zou dat op de volgende manier kunnen.

PHP:
1
2
3
4
5
6
7
8
$sql_ary = array(
        'id_session' => session_id(),
        'challenge' =>  $challenge,
        'timestamp' => (int) time()+360); 
        debug($sql_ary,'sql_ary');
        $sql = 'INSERT INTO ' . TABLE_LOGINS . ' ' . $db->sql_build_array('INSERT', $sql_ary);
        debug($sql_ary,'sql');
        $db->sql_query($sql);


Het probleem is alleen dat dit niet volledig lijkt te werken. De $sql_ary blijft in de INSERT INTO regel gedeeltelijk leeg.

Zoals te zien is heb ik ook een debug functie gemaakt. Welke de inhoud geeft van de meegegeven waarde.

Het resultaat van
PHP:
1
debug($sql_ary,'sql_ary');

code:
1
2
3
[id_session] => 0a787ba3f5af0f166da9cfff33df4e33
[challenge] => cca6a0b3888c5b55e2b46fb7294576e74b1f23ce0a64aea0cd8e590359c137ad
[timestamp] => 1324657530


Alle waardes zijn gewoon aanwezig, en toch wordt het niet in de database verwerkt.

Als $sql debug krijg ik
code:
1
INSERT INTO jstl_logins (id_session, challenge, timestamp) VALUES ('', '', 1324658869)


Hier is dus te zien dat id_session en challenge leeg zijn.
Om te controleren of er iets is wat het zootje beïnvloedt heb ik als laatste nogmaals
PHP:
1
debug($sql_ary,'sql_ary');
gedaan.
Je raadt het al, de waardes zijn gewoon aanwezig.

Heeft iemand een idee wat dit kan zijn.

Acties:
  • 0 Henk 'm!

  • vorlox
  • Registratie: Juni 2001
  • Laatst online: 02-02-2022

vorlox

I cna ytpe 300 wrods pre miute

Kun je zien wat er gebeurt binnen die
code:
1
->sql_build_array


Hij checkt niet toevallig of de waardes ook toegelaten zijn per veld type?

Acties:
  • 0 Henk 'm!

  • josvane
  • Registratie: Oktober 2002
  • Laatst online: 09-09 13:03
Toch weer een schopje, het probleem zit in mysqli_real_escape_string. Los van dit probleem probeer ik te achterhalen wat deze functie doet met de gegevens. Daarom heb ik dit gemaakt.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$mysqli = new mysqli("localhost", "user", "****", "cms");
/* check connection */
if (mysqli_connect_errno()) {
   printf("Connect failed: %s\n", mysqli_connect_error());
   exit();
}

$name = "Jaap 'aap'";
$name = $mysqli->real_escape_string($name);


/* this query with escaped $city will work */
if ($mysqli->query("INSERT into jstl_config (config_name,config_value) VALUES ('$name',NOW())")) {
   printf("%d Row inserted.\n", $mysqli->affected_rows);
}


Als ik vervolgens in mijn DB ga kijken is er gewoon Jaap 'aap' toegevoegd. Ik twijfelde of dit goed was en heb daarom het volgende gedaan.
PHP:
1
print $mysqli->real_escape_string($name);


Het volgende wordt dan getoond : Jaap \\\'aap\\\'

Hoor ik dit dan ook niet terug te zien in mijn DB?

Ik heb uiteraard ook http://nl.php.net/manual/en/mysqli.real-escape-string.php bekeken.Maar daar staat
Characters encoded are NUL (ASCII 0), \n, \r, \, ', ", and Control-Z.
maar niet wat er daadwerkelijk gebeurt.

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Escapen gebeurt door een \ ervoor te zetten. De vraag is dus of je die print voor of na regel 9 doet.

Acties:
  • 0 Henk 'm!

  • josvane
  • Registratie: Oktober 2002
  • Laatst online: 09-09 13:03
Na regel 9, anders toont
PHP:
1
print $mysqli->real_escape_string($name);

geen Jaap \\\'aap\\\'

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Na regel 9 stop je $name in je database, dus moet je ook print $name doen.

Acties:
  • 0 Henk 'm!

  • josvane
  • Registratie: Oktober 2002
  • Laatst online: 09-09 13:03
Als ik print $name doe (na regel 9) dan komt er Jaap \'aap'\ uit. Hierna doe ik pas de insert naar de DB maar daar zijn de slashes weer verdwenen.

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
josvane schreef op zaterdag 31 december 2011 @ 13:52:
Als ik print $name doe (na regel 9) dan komt er Jaap \'aap'\ uit. Hierna doe ik pas de insert naar de DB maar daar zijn de slashes weer verdwenen.
en zo hoor het, dat is escaping
net als dat echo "aaa"bbb" niet werkt, maar echo "aaa\"bbb" wel en dat je de \ niet ziet.

Acties:
  • 0 Henk 'm!

  • josvane
  • Registratie: Oktober 2002
  • Laatst online: 09-09 13:03
Ja, wat escaping doet snap ik wel, maar dan hoor ik die slashes toch ook terug te zien in de DB. daar staan namelijk gewoon Jaap 'aap' zonder slashes

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
josvane schreef op zaterdag 31 december 2011 @ 14:00:
Ja, wat escaping doet snap ik wel, maar dan hoor ik die slashes toch ook terug te zien in de DB. daar staan namelijk gewoon Jaap 'aap' zonder slashes
Nee want dat is hetzelfde principe. Draai eens mysql van de command line en draai wat queries:
INSERT INTO jstl_logins (id_session) VALUES ('aaa'bbb'); // werkt niet
INSERT INTO jstl_logins (id_session) VALUES ('aaa\'bbb'); // werkt wel, er komt aaa'bbb in de database

Acties:
  • 0 Henk 'm!

  • josvane
  • Registratie: Oktober 2002
  • Laatst online: 09-09 13:03
Aha, okey dat is dus ook de reden dat mysqli beter beveiligd is tegen sql injection.

Thanks...

Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 17-09 14:28
josvane schreef op zaterdag 31 december 2011 @ 14:05:
Aha, okey dat is dus ook de reden dat mysqli beter beveiligd is tegen sql injection.

Thanks...
Nee, dat komt door de support van 'parameterized queries'.
Pagina: 1