[mysql+php] slashes bij ' en "

Pagina: 1
Acties:

  • DPLuS
  • Registratie: April 2000
  • Niet online
Ik snap er even niets van:

Als ik data in de db gooi met een ' of " dan zou PHP er toch normaal van die magic quotes voor zetten?

Dit is de config van onze server:
; Magic quotes
magic_quotes_gpc = On ; magic quotes for incoming GET/POST/Cookie data
magic_quotes_runtime= On ; magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
Dus dat zou moeten betekenen dat als ik data IN de DB zet, dat er dan automatisch zo'n \ voor komt te staan.
Dus via zo'n input type=text geval, als je daar bijv: blaat's invult, komt in de DB [b]blaat\'s[\b] te staan.

Maar zie hier:
mysql> select CompanyName from telemarketing;
+---------------------+
| CompanyName |
+---------------------+
| Blaat |
| frits & co |
| Greg's 's avondeten |
+---------------------+
4 rows in set (0.00 sec)
In de database zijn die apostrophes niet ge-"quote".
Terwijl ze in html daarna (via php) WEL weer gequote zijn:
Greg\'s \'s avondeten
Wat moet ik nou doen als ik niet wil dat 'ie slashes zet bij het INVOEREN in de DB, en ook niet als ik ze met PHP eruit wil halen.

Gewoon stripslashes() bij het invoeren al gebruiken?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22:25

Janoz

Moderator Devschuur®

!litemod

De reden dat de quotes geslashed (ge-escaped) worden is niet om ze met een slash ervoor in de db te krijgen!!.. Stel jij bent een DB, en je krijgt een comando als
code:
1
INSERT INTO blaat SET foo='JanoZ' textje'

Waar eindigd die string nu? Achter JanoZ of achter textje?? Daarom zijn die dingen uitgevonden, gewoon om aan te geven dat de quotes deel van een string zijn. Die magic quote dingen zorgen er juist voor dat die slashes worden toegevoegd tijdens het parsen van een script zodat bij het doorgeven van die strings niet zomaar problemen kunnen ontstaan..

[edit] Oeps.. antwoord vergetenn .... Stripslashes uitvoeren voordat je de boel in je html zet, niet voordat je het naar de DB stuurt...

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


  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Je moet dus stripslashes doen als je de data uit de pagina heb gehaald.

  • DPLuS
  • Registratie: April 2000
  • Niet online
Ik lees nu net het volgende op http://nl.php.net/manual/nl/function.addslashes.php:
php@NO_SPAMj-w3.com
02-Apr-2001 09:18

As mentioned, magic_quotes_gpc automatically adds slashes to POST and GET
data and these slashes don't go in the database. BUT, be careful of this.
If you have a form with an error check, make sure you strip the slashes if
your form remembers the OK fields, so the user doesn't view these
automagically added slashes.
Wat ik hieruit opmaak is dat de slashes tijdens POST + GET toegevoegd worden, maar niet rechtstreeks in de DB gezet worden, TENZIJ je nog een error-check pagina hebt (of een andere pagina waar je nog met die data gaat spelen).
Dat is dus precies het probleem dat ik had:
Soms stond er bij een apostrophe WEL een quote voor, en soms ook niet.
Dat zal dan wel komen door dat extra php-script dat ik soms aanroep om te kijken of alle velden wel zijn ingevuld, in dit script zou ik dus in principe WEL stripslashes moeten gebruiken (toch?)

Dus voorbeeld:

Ik heb een php-pagina:
PHP:
1
2
3
4
5
6
<?
    echo "<FORM ACTION=\"$PHP_SELF\" METHOD=\"POST\">";
    echo "Company Name:<br>";
    echo "<input type=\"text\" name=\"CompanyName\" size=\"50\"><p>";
    echo "<INPUT TYPE=\"submit\" NAME=\"AddDB\" VALUE=\"Add This Company!\"></FORM>";
?>

Stel dat ik hierna de volgende code uitvoer:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?
if (isset($AddDB))

{
mysql_connect("$DBHost","$DBUser","$DBPass");

mysql("$DBName","INSERT INTO table VALUES('$CompanyName')");

header("Location: $PHP_SELF");

}
?>

Dan zou de $CompanyName nu ZONDER slashes in de DB staan...

Maar als ik nu i.p.v. bovenstaande code dit scriptje had aangeroepen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?
if (isset($AddDB))

{
if ($CompanyName=='')    {
echo "Niets ingevuld" 
}
else
{
Header("Location $PHP_SELF?add_to_database=yes&amp;CompanyName=$CompanyName");
}
?>

En hierna pas die $CompanyName in de DB zou zetten, zou 'ie er dus WEL slashes voor zetten...

En door die
magic_quotes_runtime= On ; magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
worden alle slashes die al in de DB staan, nog eens ge-quote.

Klopt dit verhaal een beetje?

  • [ti]
  • Registratie: Februari 2000
  • Niet online
Nee je verhaal klopt niet echt. Wat jouw probleem oplost is

magic_quotes_runtime = Off;
magic_quotes_gpc = On;

Als server configuratie. Met magic_quotes_runtime op "On" gaat PHP bij elke string die ie vanuit sql-queries/exec/etc vandaan haalt automagisch de boel escapen. Wil je dus niet. magic_quotes_gpc wil je waarschijnlijk wel zodat je zelf niet op hoeft te letten als je data uit een post/get/cookie haalt of er quotes instaan die je query zouden kunnen vernagellen.

Ik heb ooit ergens 'n topic [php] Secure Programming op got gepost, en als de search 't zou doen had je nu 'n link gekregen :P

  • HenkS
  • Registratie: Mei 2000
  • Laatst online: 18:59

HenkS

Da_king alias HenkS

ehmm mis ik nu iets? volgens mij begrijp ik het niet helemaal, maar je moet gewoon VOOR je query
PHP:
1
2
3
<?
$companyname = addslashes($companyname);
?>

en dan is het altijd goed, doe je daarna een select, doe je dit:
PHP:
1
2
3
<?
$companyname = stripslashes($companyname);
?>

  • DPLuS
  • Registratie: April 2000
  • Niet online
OK,
maar door deze instellingen:
; Magic quotes
magic_quotes_gpc = On ; magic quotes for incoming GET/POST/Cookie data
hoef ik bij het INVOEREN van data in de db geen addslashes te doen, dat gebeurt dus al automatisch...
Pagina: 1