Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[PHP] insert d.m.v. PDO en negeren Magic Quotes

Pagina: 1
Acties:

Verwijderd

Topicstarter
Sinds gisteren ben ik bezig met mijn eerste PDO queries. Op de webserver die ik gebruik staan de Magic Quotes aan. Ik was eerst in de veronderstelling dat het hele PDO verhaal buiten die magic quotes om ging, maar dat blijkt niet zo te zijn, want als ik een naam invoer met quotes dan krijg ik er in de database toch elke keer een \ voor. Dus moest ik de magic quotes escapen en dat doe ik met het onderstaande IF statement. Dan komt alles precies zo in de database zoals ik het invoer.

Ik vroeg me alleen af of ik door dat IF statement met die stripslashes nog wel veilig bezig ben. Dus dat ze nu niet via SQL injection toch iets kunnen doen. Overige op- en aanmerkingen zijn natuurlijk ook welkom. :)


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php 

include("_checkuser.php");

if (get_magic_quotes_gpc() === 1)
{
    $_GET = json_decode(stripslashes(json_encode($_GET, JSON_HEX_APOS)), true);
    $_POST = json_decode(stripslashes(json_encode($_POST, JSON_HEX_APOS)), true);
    $_COOKIE = json_decode(stripslashes(json_encode($_COOKIE, JSON_HEX_APOS)), true);
    $_REQUEST = json_decode(stripslashes(json_encode($_REQUEST, JSON_HEX_APOS)), true);
}

include("connect.inc");

$klant_nummer = $_POST['klant_nummer'];
$klant_naam = $_POST['klant_naam'];

$sql = "INSERT INTO klant (klant_nummer, klant_naam) VALUES (:klant_nummer, :klant_naam)";
$q = $pdo->prepare($sql);
$q->execute(array(':klant_nummer'=>$klant_nummer, ':klant_naam'=>$klant_naam));

?>

  • spone
  • Registratie: Mei 2002
  • Niet online
Ongerelateerd van je daadwerkelijke vraag: Ik zou van regel 13 connect.inc.php maken. Dikke kans dat als je connect.inc opvraagt, de webserver je deze zo geeft en je databasegegevens zichtbaar zijn :)

i5-14600K | 32GB DDR5-6000 | RTX 5070 - MacBook Pro M1 Pro 14" 16/512


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Had je http://php.net/manual/en/security.magicquotes.disabling.php gelezen?

Het hele idee van parameterized queries is dat de slashes in een string niet meer uitmaken. Dus nee, SQL-injectie gaat geen probleem zijn als je netjes je queries schrijft.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
@ spone: Nee, dat had ik al gechecked, gelukkig niet. :) Maar het is natuurlijk wel een php pagina. Dus ik heb het verbeterd inmiddels. Thanks. :)

@ NMe: Dank je. Yep, die pagina heb ik inderdaad gezien en vluchtig gelezen. Maar ik heb ook van diverse mensen op dit forumonderdeel vernomen dat niet alles heilig is wat op php.net staat, zeker niet de commentaren. Maar goed, het komt er blijkbaar op neer dat ik in mijn geval de .htaccess kan aanpassen of het met een IF statement bovenin mijn pagina's kan zetten (of includen). Als dat laatste okee is, en mijn voorbeeld ook goed is, dan zou ik die optie liever hebben dan de .htaccess file aan te passen. Ik zou het wel graag in 1 keer goed willlen doen want eigenlijk begin ik nu helemaal opnieuw met alles in PDO, dus beter meteen goed dan half. :)

  • Cartman!
  • Registratie: April 2000
  • Niet online
spone schreef op zondag 06 oktober 2013 @ 15:18:
Ongerelateerd van je daadwerkelijke vraag: Ik zou van regel 13 connect.inc.php maken. Dikke kans dat als je connect.inc opvraagt, de webserver je deze zo geeft en je databasegegevens zichtbaar zijn :)
Los van dat je php files beter altijd op .php kunt laten eindigen moet je bestanden met configs sowieso nooit binnen je webroot zetten maar erbuiten. Zelfs al zou je het config.txt noemen dan maakt het niet meer uit.

Verwijderd

Topicstarter
Nu we toch bezig zijn, zijn er misschien nog op- en aanmerkingen over de gebruikte connectie? Hieronder is te zien hoe ik de connectie maak vanuit de connectfile. Geplukt vanaf http://stackoverflow.com/tags/pdo/info.

code:
1
2
3
4
5
6
7
8
9
10
<?php

$dsn = "mysql:host=localhost;dbname=databasenaam;charset=utf8";
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$pdo = new PDO($dsn,'databasegebruiker','databasewachtwoord', $opt);

?>

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
json_decode(stripslashes(json_encode
WTF?

Ik zou NMe's post eens bekijken en/of zoiets doen:

PHP:
1
2
if (get_magic_quotes_gpc())
  throw new Exception("Magic quotes are enabled on this host; fix this or find another decent host if you can't change this setting.");

[ Voor 81% gewijzigd door RobIII op 06-10-2013 16:46 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
RobIII schreef op zondag 06 oktober 2013 @ 16:40:
[...]

WTF?

Ik zou NMe's post eens bekijken en/of zoiets doen:

PHP:
1
2
if (get_magic_quotes_gpc())
  throw new Exception("Magic quotes are enabled on this host; fix this or find another decent host if you can't change this setting.");
Wat WTF? :) Niet goed? Het is een voorbeeld dat ik op StackFlow zag en het werkt (voor zover ik kan zien). Is dit niet een goede manier?

Nee, ik wil niet van host veranderen, ik ben uiterst tevreden over mijn host al staat het aan. Dus dan toch maar de .htaccess file aanpassen?

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op zondag 06 oktober 2013 @ 17:10:
Wat WTF? :) Niet goed? Het is een voorbeeld dat ik op StackFlow zag en het werkt (voor zover ik kan zien). Is dit niet een goede manier?
Ik zie niet wat encoding/decoding naar JSON hiermee te doen heeft. Misschien werkt 't wel (ben te lam om er over na te denken) maar je bent nu een spijker in de muur aan 't meppen met een glazen fles.
Verwijderd schreef op zondag 06 oktober 2013 @ 17:10:
Dus dan toch maar de .htaccess file aanpassen?
Als dat een optie is: ja. En dan nog steeds als "guard" die check en exception die ik voorstelde in je code opnemen als één van de eerst uitgevoerde regels code (in je "app startup" zeg maar ergens); mocht je ooit per abuis de .htaccess vernachelen of je hoster gaat funky dingen doen of... dan kom je er in ieder geval niet na 3 maanden achter dat je weer "opeens" allerlei slashes en meuk in je DB hebt staan.

[ Voor 4% gewijzigd door RobIII op 06-10-2013 17:14 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
Ah, dan lijkt me dat inderdaad niet de beste manier. Ik had er al zo mijn twijfels over vandaar mijn post. :)

Okee, that makes sense. Ik heb je raad opgevolgd en dat IF statement eruit gehaald, een .htaccess file aangemaakt en die guard zal ik er ook in zetten. Dankje!

Verwijderd

Topicstarter
Hmmm, het is toch wel effe wennen al die PDO varianten... Ik zou bijvoorbeeld willen weten hoeveel records er uit een bepaalde query rollen. Nu zou je dat zo kunnen doen:
code:
1
2
$result = $pdo->query(" SELECT COUNT(*) FROM artikel WHERE artikel_naam = '$artikel' ");
$aantalrecords = $result->fetchColumn();

Maar als er dan in $artikel quotes zitten dan hangt het systeem daarop. En 'veilige' strings met al dan niet quotes erin was juist de reden dat ik naar PDO de overstap maak. Dus moet ik waarschijnlijk zoiets doen:
code:
1
2
3
4
$sql = " SELECT COUNT(*) FROM artikel WHERE artikel_naam = :artikel ";
$q = $pdo->prepare($sql );
$q->execute(array(':artikel'=>$artikel));
$aantalrecords = $q->fetchColumn();

Maar helaas, dit blijkt niet te werken, althans, niet als er een quote in de waarde $artikel voorkomt. Ziet iemand misschien wat ik fout doe hier?

[ Voor 3% gewijzigd door Verwijderd op 06-10-2013 21:39 ]


  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 16:26
Die tweede variant doet het prima. Ik denk dat het record niet bestaat.

Verwijderd

Topicstarter
Oeps, hij hing ergens anders op, ik deed verderop nog ongeveer zo'n query die nog verkeerd stond. :F

Bedankt voor het meekijken rutgerw! _/-\o_ Ik zag het zelf even niet meer zo scherp blijkbaar...
Pagina: 1