Bekijk Volledige Versie : WHERE = '$ID2' veranderd? door registerglobals?
Hallo,
Ik ben een PHP-scripje aan het overzetten naar een server waar
registerglobals off staan.
Nu heb ik de simpele query:
$sql = "SELECT * FROM NIEUWS WHERE ID = 'ID2'";
Link naar deze pagina is dan bijvoorbeeld: pagina.php?ID2=120
Maar dat werkt volgens mij niet meer, hoe moet ik WHERE aanpassen om het wel
te laten werken? of ligt het daar niet aan?
Marcel
John Bokma
22/03/05, 22:45
M@rcel wrote:
> Hallo,
>
> Ik ben een PHP-scripje aan het overzetten naar een server waar
> registerglobals off staan.
>
> Nu heb ik de simpele query:
>
> $sql = "SELECT * FROM NIEUWS WHERE ID = 'ID2'";
>
> Link naar deze pagina is dan bijvoorbeeld: pagina.php?ID2=120
>
> Maar dat werkt volgens mij niet meer,
Ik zou zo zeggen: heeft het ooit wel gewerkt? Dit geeft nl alle regels
waarvoor het ID gelijk is aan ID2.
> hoe moet ik WHERE aanpassen om
> het wel te laten werken? of ligt het daar niet aan?
Maak je edits eens ongedaan, en geef de oorspronkelijke code?
--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html
Rene Pijlman
22/03/05, 22:45
M@rcel:
>Link naar deze pagina is dan bijvoorbeeld: pagina.php?ID2=120
>
>Maar dat werkt volgens mij niet meer, hoe moet ik WHERE aanpassen om het wel
>te laten werken?
Gewoon, de URL-parameters opvragen zoals dat volgens de documentatie van
PHP moet. Wat is het probleem?
Je kunt natuurlijk ook kijken op
http://www.google.com/search?q=php+url+parameters+register_globals
Daar staat het vast wel bij.
--
René Pijlman
Wat wil jij leren? http://www.leren.nl
"John Bokma" <postmaster@castleamber.com> schreef in bericht
>>
>> $sql = "SELECT * FROM NIEUWS WHERE ID = 'ID2'";
>>
Moet zijn $sql = "SELECT * FROM NIEUWS WHERE ID = '$ID2'";
^^^^^^^^
> Ik zou zo zeggen: heeft het ooit wel gewerkt? Dit geeft nl alle regels
> waarvoor het ID gelijk is aan ID2.
Ja het heeft ooit gewerkt en het werkt nog steeds op een server met globals
on
Marcel
"Rene Pijlman" schreef in bericht
> M@rcel:
>>
>>Maar dat werkt volgens mij niet meer, hoe moet ik WHERE aanpassen om het
>>wel
>>te laten werken?
>
> Gewoon, de URL-parameters opvragen zoals dat volgens de documentatie van
> PHP moet. Wat is het probleem?
Dat is dus eigenlijk mijn vraag, hoe moet dat eigenlijk? Ik deed het altijd
op de beschreven manier...
Ik zat nu met iets als WHERE ID = $_GET['ID2'] maar dat werkt ook niet echt.
> Je kunt natuurlijk ook kijken op
> http://www.google.com/search?q=php+url+parameters+register_globals
> Daar staat het vast wel bij.
Heb zelf voordat ik iets postte ook al gezocht op Google maar kon niet echt
iets vinden.
Marcel
Rene Pijlman
22/03/05, 23:35
M@rcel:
>Rene Pijlman:
>> Gewoon, de URL-parameters opvragen zoals dat volgens de documentatie van
>> PHP moet. Wat is het probleem?
>
>Dat is dus eigenlijk mijn vraag, hoe moet dat eigenlijk?
Ja maar, ja maar... dat staat er toch!? Lees die documentatie dan!
Als wij dat stukje documentatie hier posten lees je het zeker ook niet?
>> Je kunt natuurlijk ook kijken op
>> http://www.google.com/search?q=php+url+parameters+register_globals
>> Daar staat het vast wel bij.
>
>Heb zelf voordat ik iets postte ook al gezocht op Google maar kon niet echt
>iets vinden.
Ja maar, ja maar... nu heb je het toch gevonden? Zie bovenstaande link.
--
René Pijlman
Wat wil jij leren? http://www.leren.nl
John Bokma
22/03/05, 23:45
M@rcel wrote:
>
> "John Bokma" <postmaster@castleamber.com> schreef in bericht
>
>>>
>>> $sql = "SELECT * FROM NIEUWS WHERE ID = 'ID2'";
>>>
>
> Moet zijn $sql = "SELECT * FROM NIEUWS WHERE ID = '$ID2'";
>
>
> ^^^^^^^^
Yup, belangrijke tip: tik *nooit* dingen over als je ze kan knippen /
plakken.
> Ja het heeft ooit gewerkt en het werkt nog steeds op een server met
> globals on
En nu is dus de truuk om $ID2 uit $_GET[ ... ] te halen *inclusief*
zorgvuldige controle.
--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html
John Bokma
22/03/05, 23:45
M@rcel wrote:
> Ik zat nu met iets als WHERE ID = $_GET['ID2'] maar dat werkt ook niet
> echt.
Stop nooit dingen uit een URL zomaar in een query. Check, check, and
reject.
--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html
> "John Bokma" schreef
>> M@rcel wrote:
>
>> Ik zat nu met iets als WHERE ID = $_GET['ID2'] maar dat werkt ook niet
>> echt.
Heb nu
$marcel = $_GET['ID2'];
$sql = "SELECT * FROM NIEUWS WHERE ID = $marcel";
Dat werkt op zich.
> Stop nooit dingen uit een URL zomaar in een query. Check, check, and
> reject.
Maar blijkbaar moet ik nog wat checken?
Ik ben zoals jullie al gemerkt hebben erg basic met PHP & MySQL
Marcel
Rene Pijlman
23/03/05, 00:45
M@rcel:
>Heb nu
>
>$marcel = $_GET['ID2'];
>
>$sql = "SELECT * FROM NIEUWS WHERE ID = $marcel";
>
>Dat werkt op zich.
Yep. En wat als iemand dit aanroept met in ID2:
"12 or id in (select ... from ...)"
en dergelijke?
Dit type probleem staat bekend als "SQL Injection". Google is je vriend.
>> Stop nooit dingen uit een URL zomaar in een query. Check, check, and
>> reject.
>
>Maar blijkbaar moet ik nog wat checken?
Input van buiten. Je kunt de client niet vertrouwen. Ongeacht of die
vanuit Nederland of Mexico post.
--
René Pijlman
Wat wil jij leren? http://www.leren.nl
John Bokma
23/03/05, 02:55
Rene Pijlman wrote:
> Input van buiten. Je kunt de client niet vertrouwen. Ongeacht of die
> vanuit Nederland of Mexico post.
ROTFLMAO :-D
--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html
John Bokma
23/03/05, 03:05
M@rcel wrote:
> Maar blijkbaar moet ik nog wat checken?
Yup, wat is een ID? Als het een getal is tussen 1 en 1000 zou ik zelf
kijken of:
is het gedefinieerd
is het 1 tot maximaal 4 getallen
valt het getal in het bereik 1-1000
Als het antwoord nee is, geef ik een fout (Undefined ID, Invalid ID, ID
out of range b.v.)
Een echte purist zou nog kunnen schieten als het getal voorloopnullen
heeft, b.v.
01 -> fout
1 -> goed
Het klinkt allemaal drastisch, maar: als je site goed gemaakt is, zitten
er geen fouten in, dus alles gaat door de controle
Als er een fout in zit, vind je die (als je alles slikt, en/of repareerd
zie je die over het hoofd)
Als iemand stoute dingen doet, dan krijgt hij/zij een fout (en zie je
dat ook in je log terug).
--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html
"John Bokma" <postmaster@castleamber.com> schreef in bericht
> M@rcel wrote:
>
>> Maar blijkbaar moet ik nog wat checken?
>
> Yup, wat is een ID? Als het een getal is tussen 1 en 1000 zou ik zelf
> kijken of:
>
> is het gedefinieerd
> is het 1 tot maximaal 4 getallen
> valt het getal in het bereik 1-1000
ja ID is inderdaad een getal met een onbeperkt bereik.
> Als het antwoord nee is, geef ik een fout (Undefined ID, Invalid ID, ID
> out of range b.v.)
Ok, maar hoe controleer ik zoiets: oftewel: helder leesvoer / voorbeelden /
tips ?
Is dit wat, onderstaand controleert toch of een bestand een getal is en zo
niet dan geeft het voor ID2 de waarde 1? of heb ik het niet goed begrepen?
$marcel = 1; // (default)
if (is_numeric($_GET['ID2']))
$marcel = $_GET['ID2'];
$sql = "SELECT * FROM NIEUWS WHERE ID=$marcel";
Marcel
Wat M@rcel schreef, bleek het
begin van iets moois; kijk zelf maar:
> $marcel = 1; // (default)
> if (is_numeric($_GET['ID2']))
> $marcel = $_GET['ID2'];
> $sql = "SELECT * FROM NIEUWS WHERE ID=$marcel";
Ik zit meer aan zoiets te denken:
${_GET_ID2} = (int) trim(${_GET['ID2']});
if ((${_GET_ID2} < 1) || (1e5 < ${_GET_ID2})) ${_GET_ID2} = 1;
$sql = "SELECT * FROM nieuws WHERE id=${_GET_ID2}";
O.a. omdat dit False is: is_numeric('321 ')
(en die '1e5' is natuurlijk maar een voorbeeld)
--
Affijn, Ruud ` - ?
+ ` ? *
? ` Jvr qvg yrrfg,
? = ` fgresg wbatre.
John Bokma
24/03/05, 05:15
Dr.Ruud wrote:
> Ik zit meer aan zoiets te denken:
>
> ${_GET_ID2} = (int) trim(${_GET['ID2']});
>
> if ((${_GET_ID2} < 1) || (1e5 < ${_GET_ID2})) ${_GET_ID2} = 1;
IMNSHO dus de meest foute methode (ok, op niks doen na dan)
--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html
John Bokma
24/03/05, 05:15
M@rcel wrote:
> "John Bokma" <postmaster@castleamber.com> schreef in bericht
>
>> M@rcel wrote:
>>
>>> Maar blijkbaar moet ik nog wat checken?
>>
>> Yup, wat is een ID? Als het een getal is tussen 1 en 1000 zou ik zelf
>> kijken of:
>>
>> is het gedefinieerd
>> is het 1 tot maximaal 4 getallen
>> valt het getal in het bereik 1-1000
>
> ja ID is inderdaad een getal met een onbeperkt bereik.
Weet je dat zeker? Hoe wordt het opgeslagen in de database?
>> Als het antwoord nee is, geef ik een fout (Undefined ID, Invalid ID,
>> ID out of range b.v.)
>
> Ok, maar hoe controleer ik zoiets: oftewel: helder leesvoer /
> voorbeelden / tips ?
http://mx2.php.net/manual/en/function.isset.php
http://mx2.php.net/manual/en/function.preg-match.php
> Is dit wat, onderstaand controleert toch of een bestand een getal is
> en zo niet dan geeft het voor ID2 de waarde 1? of heb ik het niet goed
> begrepen?
Niet goed begrepen, als het niet klopt, geef een fout, ga het niet
repareren.
--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html
Wat John Bokma schreef, bleek het
begin van iets moois; kijk zelf maar:
> Dr.Ruud:
>> Ik zit meer aan zoiets te denken:
>>
>> ${_GET_ID2} = (int) trim(${_GET['ID2']});
>>
>> if ((${_GET_ID2} < 1) || (1e5 < ${_GET_ID2})) ${_GET_ID2} = 1;
> IMNSHO dus de meest foute methode (ok, op niks doen na dan)
De defaultwaarde 1 nam ik over van M@rcel, blijkbaar heeft dat
voor hem een Doel. Maar leg eens uit?
--
Affijn, Ruud ` - ?
+ ` ? *
? ` Jvr qvg yrrfg,
? = ` fgresg wbatre.
"John Bokma" schreef in bericht
>
>> ja ID is inderdaad een getal met een onbeperkt bereik.
>
> Weet je dat zeker? Hoe wordt het opgeslagen in de database?
Als INT , primary key, auto_increment
>> Ok, maar hoe controleer ik zoiets: oftewel: helder leesvoer /
>> voorbeelden / tips ?
>
> http://mx2.php.net/manual/en/function.isset.php
> http://mx2.php.net/manual/en/function.preg-match.php
ga ik doornemen.
>> Is dit wat, onderstaand controleert toch of een bestand een getal is
>> en zo niet dan geeft het voor ID2 de waarde 1? of heb ik het niet goed
>> begrepen?
>
> Niet goed begrepen, als het niet klopt, geef een fout, ga het niet
> repareren.
Ok, maar als ik zeker weet dat waarde 1 altijd aanwezig is kan ik die code
dan ook niet toepassen?
Marcel
Trouwens: de berichten van dr. Ruud kan ik niet lezen, krijg de tekst:
Wat John Bokma schreef, bleek het en dan een bestand als bijlage.
(gebruik Outlook Express als nieuwslezer, zal daar wel aan liggen ;-)
Maarten Wierda
24/03/05, 14:45
Dr.Ruud wrote:
>>> ${_GET_ID2} = (int) trim(${_GET['ID2']});
>>>
>>> if ((${_GET_ID2} < 1) || (1e5 < ${_GET_ID2})) ${_GET_ID2} = 1;
>
>>IMNSHO dus de meest foute methode (ok, op niks doen na dan)
Hoezo de meest foute?
> De defaultwaarde 1 nam ik over van M@rcel, blijkbaar heeft dat
> voor hem een Doel. Maar leg eens uit?
if (isset($_GET["foo"]) && ereg("^[0-9]+$", $_GET["foo"]))
{
...
}
--
Cheers,
Maarten Wierda
"Shit happens. Then you wipe."
Wat Maarten Wierda schreef, bleek het
begin van iets moois; kijk zelf maar:
> Dr.Ruud:
>>>> ${_GET_ID2} = (int) trim(${_GET['ID2']});
>>>>
>>>> if ((${_GET_ID2} < 1) || (1e5 < ${_GET_ID2})) ${_GET_ID2} = 1;
>>> IMNSHO dus de meest foute methode (ok, op niks doen na dan)
> Hoezo de meest foute?
Ja, kom op John, leer ons!
>> De defaultwaarde 1 nam ik over van M@rcel, blijkbaar heeft dat
>> voor hem een Doel. Maar leg eens uit?
> if (isset($_GET["foo"]) && ereg("^[0-9]+$", $_GET["foo"]))
> {
> ...
> }
Wat voegt dat toe dan? En het vindt een praktische waarde
zoals '123 ' nog false ook.
--
Affijn, Ruud ` - ´
+ ` ´ *
´ ` Jvr qvg yrrfg,
´ = ` fgresg wbatre.
Maarten Wierda
24/03/05, 18:15
Dr.Ruud wrote:
> Wat Maarten Wierda schreef, bleek het
> begin van iets moois; kijk zelf maar:
Ik kijk me suf, maar wat bedoel je nou?
<snip>
>>if (isset($_GET["foo"]) && ereg("^[0-9]+$", $_GET["foo"]))
>
> Wat voegt dat toe dan? En het vindt een praktische waarde
> zoals '123 ' nog false ook.
Wat is er praktisch aan '123 '? Dat is toch geen integer?
--
Cheers,
Maarten Wierda
"Shit happens. Then you wipe."
Daniel Tryba
24/03/05, 18:25
Maarten Wierda <moart3nAT@chellodot.nl> wrote:
>>
>> Wat voegt dat toe dan? En het vindt een praktische waarde
>> zoals '123 ' nog false ook.
>
> Wat is er praktisch aan '123 '? Dat is toch geen integer?
Een vaak voorkomende typo, een goede reden om vrijwel altijd trim te
gebruiken.
John Bokma
24/03/05, 18:35
Daniel Tryba wrote:
> Maarten Wierda <moart3nAT@chellodot.nl> wrote:
>>>
>>> Wat voegt dat toe dan? En het vindt een praktische waarde
>>> zoals '123 ' nog false ook.
>>
>> Wat is er praktisch aan '123 '? Dat is toch geen integer?
>
> Een vaak voorkomende typo, een goede reden om vrijwel altijd trim te
> gebruiken.
Nee.
--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html
John Bokma
24/03/05, 18:35
M@rcel wrote:
> "John Bokma" schreef in bericht
>
>>> ja ID is inderdaad een getal met een onbeperkt bereik.
>>
>> Weet je dat zeker? Hoe wordt het opgeslagen in de database?
>
> Als INT , primary key, auto_increment
Dus het bereik is beperkt, zie de MySQL documentatie. En wellicht wil je
het zelf verder inperken.
> Trouwens: de berichten van dr. Ruud kan ik niet lezen, krijg de tekst:
Yup, ff Ctrl+F3 indrukken (view source). Als je veel op Usenet rondhangt
kan je beter iets als Xnews, Thunderbird, o.i.d. gaan gebruiken.
--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html
Maarten Wierda
24/03/05, 18:45
John Bokma wrote:
>>> Wat is er praktisch aan '123 '? Dat is toch geen
>>> integer?
>>
>> Een vaak voorkomende typo, een goede reden om vrijwel
>> altijd trim te gebruiken.
Normaliter worden dit soort GET-variabelen toch niet
handmatig ingetypt?
> Nee.
Verklaar je eens nader...
--
Cheers,
Maarten Wierda
"Shit happens. Then you wipe."
John Bokma
24/03/05, 18:55
Dr.Ruud wrote:
> Wat Maarten Wierda schreef, bleek het
> begin van iets moois; kijk zelf maar:
>> Dr.Ruud:
>
>>>>> ${_GET_ID2} = (int) trim(${_GET['ID2']});
>>>>>
>>>>> if ((${_GET_ID2} < 1) || (1e5 < ${_GET_ID2})) ${_GET_ID2} = 1;
>
>>>> IMNSHO dus de meest foute methode (ok, op niks doen na dan)
>
>> Hoezo de meest foute?
>
> Ja, kom op John, leer ons!
Ik wil het binnenkort wat uitgebreider op mijn site zetten, maar in het
kort:
[a] *specificeer* wat een ID is
[b] alles wat *niet* aan de specificatie voldoet -> error
en dus: *niet* repareren, trimmen, casten, etc.
Soms kan er een speciaal geval zijn, geen ID, en dan kan een default
gebruikt worden.
Dus voor de OP:
[1] heeft ID een waarde? Indien niet, wil je een default gebruiken?
(b.v. omdat je programma index.php heet), -> zet default waarde
en klaar. Indien die situatie er niet is, dan is het *altijd* fout.
[2] is het ID volledig een integer (dus geen gekke tekens wissen, etc.)
*en* valt het binnen de minimale en maximale *lengte*?
In Perl regexp lingo: ~ /^[1-9]\d{0,5}$/ (echter, zie onder) dus
minimaal 1 cijfer, maximaal 6 cijfers, geen voorloop nullen.
Indien nee -> geef fout
[3] valt het id binnen het gespecificeerde bereik ( dus [ min .. max ] )
Indien nee -> geef fout.
Kortom: als een ID niet voldoet is dat per definitie een fout. Ga nooit
zitten repareren, want zo zie je mogelijke fouten in je HTML of
programma over het hoofd...
--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html
John Bokma
24/03/05, 19:45
Maarten Wierda wrote:
> John Bokma wrote:
>
>>>> Wat is er praktisch aan '123 '? Dat is toch geen
>>>> integer?
>>>
>>> Een vaak voorkomende typo, een goede reden om vrijwel
>>> altijd trim te gebruiken.
>
> Normaliter worden dit soort GET-variabelen toch niet
> handmatig ingetypt?
Precies!
>> Nee.
>
> Verklaar je eens nader...
Hoezo, je hebt het al door :-D
--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html
Daniel Tryba
24/03/05, 20:05
Maarten Wierda <moart3nAT@chellodot.nl> wrote:
>>>> Wat is er praktisch aan '123 '? Dat is toch geen
>>>> integer?
>>>
>>> Een vaak voorkomende typo, een goede reden om vrijwel
>>> altijd trim te gebruiken.
>
> Normaliter worden dit soort GET-variabelen toch niet
> handmatig ingetypt?
Wellicht voor IDs, maar niet voor form data in een get.
Maar voor een query waar ID een int is doet de database zelf nog wel een
sanity check op de invoer.
Zowel bv MySQL als MSSQL retouneren het zelfde voor
select id from event where id=1;
of
select id from event where id='1';
en
select id from event where id='1 ';
mysql maakt het nog het nog bonter door ook id 1 terug te geven bij
select id from event where id='1z';
mssql weet te melden dat '1z' een varchar is en dat een int wordt
verwacht. Geen idee wat de sql specs hierover zeggen.