abonnement Unibet Coolblue Bitvavo
pi_30184032
Pak nou eens dit:

' OR 1 OR ''='

Wat krijg je dan? Juist:

SELECT * FROM table WHERE iets='' OR 1 OR ''=''
pi_30184078
quote:
Op donderdag 1 september 2005 23:07 schreef Swetsenegger het volgende:
$_GET['id'] is geen string, maar een variable, met in dit geval een integer en geen string.
Snap nou eens dat als je $_GET['id'] tussen quotes zet in een query, je er dan een string van maakt je query gaat dan vervolgens de kolom 'id' vergelijken met een string.
pi_30184141
quote:
Op donderdag 1 september 2005 23:07 schreef Swetsenegger het volgende:
Door het ontbreken van quotes echter, is de boel eerder onveiliger.
Door de intval() toevoeging weet je zeker dat de waarde een getal is en zijn quotes niet meer nodig! Quotes zijn niet heilig! bovendien kun je in de rest van je script werken met een waarde die je ook in je query hebt meegegeven
  FOK!-Schrikkelbaas donderdag 1 september 2005 @ 23:17:25 #54
1972 Swetsenegger
Egocentrische Narcist
pi_30184244
quote:
Op donderdag 1 september 2005 23:11 schreef JeRa het volgende:
Pak nou eens dit:

' OR 1 OR ''='

Wat krijg je dan? Juist:

SELECT * FROM table WHERE iets='' OR 1 OR ''=''
1
2
3
<?php
$query
="SELECT * FROM table WHERE iets='' OR 1 OR ''=''";
?>

Prachtige sql fout

-edit- hmmmmmzzzz...
  FOK!-Schrikkelbaas donderdag 1 september 2005 @ 23:17:45 #55
1972 Swetsenegger
Egocentrische Narcist
pi_30184258
quote:
Op donderdag 1 september 2005 23:13 schreef JeRa het volgende:

[..]

Snap nou eens dat als je $_GET['id'] tussen quotes zet in een query, je er dan een string van maakt je query gaat dan vervolgens de kolom 'id' vergelijken met een string.
en je voorkomt injection
  FOK!-Schrikkelbaas donderdag 1 september 2005 @ 23:18:20 #56
1972 Swetsenegger
Egocentrische Narcist
pi_30184279
quote:
Op donderdag 1 september 2005 23:14 schreef JeRa het volgende:

[..]

Door de intval() toevoeging weet je zeker dat de waarde een getal is en zijn quotes niet meer nodig! Quotes zijn niet heilig! bovendien kun je in de rest van je script werken met een waarde die je ook in je query hebt meegegeven
Waarom kan ik dat niet in de rest van mijn script? $_GET['id'] veranderd niet opeens magisch
pi_30184344
quote:
Op donderdag 1 september 2005 23:17 schreef Swetsenegger het volgende:

[..]
[ code verwijderd ]

Prachtige sql fout
Heb je 'm uitgeprobeerd? Hier werkt die query gewoon hoor...
pi_30184398
Oke, we hebben:

1
2
3
<?php
$query
="SELECT * FROM table WHERE iets='".$_GET['id']."'";
?>


We hebben een url: http://example.com/foobar(...)WHERE+'foo'+%3D+'foo

(%60 is ` en %3D is = en + is een spatie, zie b.v. hier voor een encode / decode scriptje )
Wat krijgen we vervolgens in $query?

1
2
3
<?php
$query
== "SELECT * FROM table WHERE iets='0' UNION SELECT * FROM `auth` WHERE 'foo' = 'foo'";
?>


De enige maar die hier aan hangt is het eventueel aan staan van de magic_quotes settings waarbij php bij alle $_GET variabelen ' vervangt door \'
In dat geval werkt het niet helemaal zo.

Blijft inderdaad overeind dat je een heel eind moet gokken naar de database structuur, dat is waar. Maar vaak hebben dat soort tabellen hele logische namen.
Ieder verhaal eindigt gelukkig, als je er maar vroeg genoeg mee stopt. - Annie M.G. Schmidt -
pi_30184415
quote:
Op donderdag 1 september 2005 23:17 schreef Swetsenegger het volgende:

[..]

en je voorkomt injection
Doe dat dan op een andere manier, je voorkomt zo alleen injection als je magic_quotes_gpc op On hebt staan maar op jouw methode moet er vanalles gecast gaan worden door MySQL alvorens die kan gaan checken. Dit is gewoon überfout:

SELECT * FROM table WHERE 1 = '1'

Maar dat is feitelijk wat je nu doet
pi_30184462
quote:
Op donderdag 1 september 2005 23:22 schreef JeRa het volgende:
Dit is gewoon überfout:

SELECT * FROM table WHERE 1 = '1'

Maar dat is feitelijk wat je nu doet
Een 'echte' sql server zou het niet eens goedkeuren als je een numerieke kolom vergelijkt met een string... Maar mysql reken ik dan even niet tot de echten.
Ieder verhaal eindigt gelukkig, als je er maar vroeg genoeg mee stopt. - Annie M.G. Schmidt -
  FOK!-Schrikkelbaas donderdag 1 september 2005 @ 23:25:17 #61
1972 Swetsenegger
Egocentrische Narcist
pi_30184520
quote:
Op donderdag 1 september 2005 23:20 schreef JeRa het volgende:

[..]

Heb je 'm uitgeprobeerd? Hier werkt die query gewoon hoor...
Zag je mijn edit?
Ja hij werkt.

Maar goed, zowel jouw als mijn antwoord was onvolledig.
Dus hierbij voor de volledigheid voor de originele vraagsteller....

ALTIJD je user input controleren.
pi_30184533
quote:
Op donderdag 1 september 2005 23:23 schreef Vloris het volgende:

[..]

Een 'echte' sql server zou het niet eens goedkeuren als je een numerieke kolom vergelijkt met een string... Maar mysql reken ik dan even niet tot de echten.
Daarom is het eigenlijk ook volstrekt hilarisch dat PHP & MySQL de meest gebruikte combinatie is...ze laten allebei enorm veel fouten toe m.b.t. types waardoor een hoop mensen het verkeerd gaan doen
  FOK!-Schrikkelbaas donderdag 1 september 2005 @ 23:27:15 #63
1972 Swetsenegger
Egocentrische Narcist
pi_30184609
quote:
Op donderdag 1 september 2005 23:22 schreef JeRa het volgende:

[..]

Doe dat dan op een andere manier, je voorkomt zo alleen injection als je magic_quotes_gpc op On hebt staan maar op jouw methode moet er vanalles gecast gaan worden door MySQL alvorens die kan gaan checken. Dit is gewoon überfout:

SELECT * FROM table WHERE 1 = '1'

Maar dat is feitelijk wat je nu doet
Een beetje server heeft magic_quotes_gpc gewoon aan staan.
En leeg eens uit waarom dat uberfout zou zijn?

'gewoon' is wel erg magere uitleg.
pi_30184651
quote:
Op donderdag 1 september 2005 23:25 schreef JeRa het volgende:
Daarom is het eigenlijk ook volstrekt hilarisch dat PHP & MySQL de meest gebruikte combinatie is...ze laten allebei enorm veel fouten toe m.b.t. types waardoor een hoop mensen het verkeerd gaan doen
Dat ben ik helemaal met je eens. En wat mij betreft laten we het hierbij, het was absoluut niet mijn bedoeling jou bewering helemaal onderuit te halen, ik wou alleen maar aantonen hoe het eventueel misbruikt zou kunnen worden.

Ondertussen zijn er ook al een aantal goeie oplossingen gevonden.

Ik ga weer verder met postgres (en de PEAR::DB package, die snapt tenminste transactions) icm php.
Ieder verhaal eindigt gelukkig, als je er maar vroeg genoeg mee stopt. - Annie M.G. Schmidt -
pi_30184683
quote:
Op donderdag 1 september 2005 23:25 schreef Swetsenegger het volgende:

[..]

Zag je mijn edit?
Aan mijn post te zien, niet
quote:
Ja hij werkt.

Maar goed, zowel jouw als mijn antwoord was onvolledig.
Dus hierbij voor de volledigheid voor de originele vraagsteller....

ALTIJD je user input controleren.
En voor de volledigheid van mijn kant geef ik ook even aan wat ik bedoelde met het type dat je kunt gebruiken in de rest van je script:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
//User input ophalen en omzetten naar het gewenste type
$id = intval($_GET['id']);
$naam = trim($_GET['naam']);

//Validatie
if ($id &lt;= 0) {
    ...
fout!
}
if (
$naam == '') {
    ...
fout!
}

//Afhandeling in script kan nu gedaan worden met $id en $naam, die zowel gevalideerd zijn als in het goede type zijn gezet, en pas in de query ge-escaped worden (indien nodig)
$query = 'SELECT * FROM `blaat` WHERE `id` = ' . $id . ' AND `naam` = \'' . mysql_real_escape_string($naam) . '\'';
?>


edit: dit gaat er trouwens vanuit dat magic_quotes_gpc uit staat, wat ik doe is controleren of magic_quotes_gpc aan staat en indien dit zo is alle request variabelen strippen van hun slashes

[ Bericht 3% gewijzigd door JeRa op 01-09-2005 23:42:53 ]
pi_30184816
quote:
Op donderdag 1 september 2005 23:27 schreef Swetsenegger het volgende:

[..]

Een beetje server heeft magic_quotes_gpc gewoon aan staan.
En leeg eens uit waarom dat uberfout zou zijn?

'gewoon' is wel erg magere uitleg.
Een beetje server heeft dat inderdaad, maar een hoop servers hebben dat niet. In mijn scripts heb ik altijd helemaal vooraan een stukje code die alle input omzet naarmate magic_quotes_gpc aan of uit staat.

Dat is überfout omdat 1 een getal is en '1' een string is. Als je een kolom van type UNSIGNED INT hebt, en je deze met een string gaat vergelijken, zou een goede DB een foutmelding produceren zoals Vloris al zei. Dat MySQL dat toestaat is tot daaraan toe, maar het hoort niet en MySQL moet zo eerst de string naar een INT casten voordat het er iets mee kan.
pi_30185615
Ik wil graag alles wat met een a begint uit een mysql db kunnen selecteren maar ik heb geeb flauw idee wat voor myswl qeury ik moet maken dan. Iemand een idee (kan het ook niet vinden op mysql.com)
pi_30186156
Even een voorbeeld; als je een tabel hebt met een id (unieke waarde) en een kolom waar je op wilt selecteren, dan kun je zoiets doen:

SELECT `id` FROM `table` WHERE `kolom` LIKE 'a%'

Het procentteken is in een LIKE-clause een wildcard, het resultaat van deze query komt dus overeen met alle IDs van de records waarvan die kolom met een a begint (en wat daarna komt maakt niet uit).
pi_30186305
Ach wat ben ik dom!
Dat had ik zelf kunnen bedenken!
  vrijdag 2 september 2005 @ 02:24:13 #70
71919 wonderer
Hung like a My Little Pony
pi_30189385
Ik heb duidelijk op het verkeerde moment mijn probleem gepost
"Pain is my friend. I can trust pain. I can trust pain to make my life utterly miserable."
"My brain is too smart for me."
"We don't need no education." "Yes you do, you just used a double negative."
pi_30191996
quote:
Op donderdag 1 september 2005 23:27 schreef Swetsenegger het volgende:

[..]

Een beetje server heeft magic_quotes_gpc gewoon aan staan.
En leeg eens uit waarom dat uberfout zou zijn?

'gewoon' is wel erg magere uitleg.
O wat haat ik die "feature" van php. Het slaat echt helemaal nergens op om alle binnenkomende get/post/cookie data te voorzien van slashes omdat het misschien in een sql statement gebruikt gaat worden. Je hebt er alleen maar last van als je iets anders met de data wil doen; een preview van een post, validatie van een string op lengte, of gewoon elk willekeurige actie die niets met mysql te maken heeft.

Overigens staat in php.ini-recommended magic_quotes_gpc = off.
Een beetje server heeft magic_quotes_gpc dus uit staan.
Wil iedereen die in telekinese gelooft nu mijn hand op steken?
| Foto's van toen en nu | Icons | Whatpulse keyboard | .NET developer? |
pi_30192842
quote:
Op vrijdag 2 september 2005 07:34 schreef SuperRembo het volgende:
Overigens staat in php.ini-recommended magic_quotes_gpc = off.
Een beetje server heeft magic_quotes_gpc dus uit staan.
Ze geven twee redenen in php.ini voor de keuze om magic_quotes_gpc standaard op Off te zetten. De ene is performance (PHP hoeft dan niet langer alle request variabelen te voorzien van slashes) en de tweede is het feit dat je dan zogenaamd alles direct in database kunt stoppen, alleen moet je volgens PHP dan wel addslashes() gebruiken die opmerking vind ik dan weer wat vreemd.

Niet alleen omdat je dan dus niét zomaar alles in een table kunt stoppen, maar ook omdat addslashes() geen rekening houdt met de character set van de database, wat nog wel eens het geval kan zijn bij de latere versies van bv. MySQL. De eigenlijke functies die bedoeld zijn om data te escapen die in een query moet, zijn: mysql_real_escape_string(), mysqli_real_escape_string() en pg_escape_string(). Deze functies worden boven addslashes() geprefereerd, al is het alleen maar omdat er misschien verschil komt in de manier van escapen of omdat er een character set gewijzigd wordt.
pi_30252388
Overigens is het handig om al je input te zuiveren van dit magic_quotes gedoe (met behulp van strip_slashes), en dan zélf bewust, bijvoorbeeld in een Database Access Layer, netjes te escapen / te validaten .

[edit]Idd in het geval van de onmogelijkheid tot het gebruik van het aanpassen van de config, of dat nu in de file of via .htaccess is

[ Bericht 21% gewijzigd door idontlikepizza op 04-09-2005 13:07:39 (Geen reden tot een nieuwe post :)) ]
pi_30255103
quote:
Op zondag 4 september 2005 10:27 schreef idontlikepizza het volgende:
Overigens is het handig om al je input te zuiveren van dit magic_quotes gedoe (met behulp van strip_slashes), en dan zélf bewust, bijvoorbeeld in een Database Access Layer, netjes te escapen / te validaten .
Als je zelf de server config niet kan wijzigen, dan kan je 't uitschakelen met een regeltje in een .htaccess file:

1php_flag magic_quotes_gpc off
Wil iedereen die in telekinese gelooft nu mijn hand op steken?
| Foto's van toen en nu | Icons | Whatpulse keyboard | .NET developer? |
  zondag 4 september 2005 @ 15:00:06 #75
71610 Black-Hole
Deep in my soul
pi_30258667
Via phpmyadmin heb ik 1 van mijn databases geexporteerd. Nu is het geexporteerde bestand 7,51mb groot terwijl de database in phpmyadmin 10,7mb groot is.

Het geexporteerde bestand is niet gecomprimeerd maar toch zit er een verschil in

Klopt dat of die ik iets fout? De geexporteerde database is die van mijn forum (Invision PowerBoard), misschien geef ik zo nog net iets meer info.

Edit: screendump van hoe ik het gedaan heb:

abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')