Snap nou eens dat als je $_GET['id'] tussen quotes zet in een query, je er dan een string van maaktquote: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.
Door de intval() toevoeging weet je zeker dat de waarde een getal is en zijn quotes niet meer nodig! Quotes zijn niet heilig!quote:Op donderdag 1 september 2005 23:07 schreef Swetsenegger het volgende:
Door het ontbreken van quotes echter, is de boel eerder onveiliger.
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 ''=''"; ?> |
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 maaktje query gaat dan vervolgens de kolom 'id' vergelijken met een string.
Waarom kan ik dat niet in de rest van mijn script? $_GET['id'] veranderd niet opeens magischquote: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
Heb je 'm uitgeprobeerd? Hier werkt die query gewoon hoor...quote:Op donderdag 1 september 2005 23:17 schreef Swetsenegger het volgende:
[..]
[ code verwijderd ]
Prachtige sql fout
1 2 3 | <?php $query="SELECT * FROM table WHERE iets='".$_GET['id']."'"; ?> |
1 2 3 | <?php $query == "SELECT * FROM table WHERE iets='0' UNION SELECT * FROM `auth` WHERE 'foo' = 'foo'"; ?> |
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:quote:
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.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
Zag je mijn edit?quote:Op donderdag 1 september 2005 23:20 schreef JeRa het volgende:
[..]
Heb je 'm uitgeprobeerd? Hier werkt die query gewoon hoor...
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 doenquote: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.
Een beetje server heeft magic_quotes_gpc gewoon aan staan.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
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.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
Aan mijn post te zien, nietquote:
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: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.
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 <= 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) . '\''; ?> |
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.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.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.
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() gebruikenquote: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.
Als je zelf de server config niet kan wijzigen, dan kan je 't uitschakelen met een regeltje in een .htaccess file: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.
1 | php_flag magic_quotes_gpc off |
Zou goed kunnen hoor, ik doe het ook maar voor het eerstquote:Op zondag 4 september 2005 15:30 schreef idontlikepizza het volgende:
Het ene opslagformaat kan toch ook gewoon efficiënter zijn?. En als je het wil testen importeer je de zut toch?
Het is allemaal gelukt, wel mat wat knip- en plakwerk omdat de file groter was dan 1,5mb.quote:Op zondag 4 september 2005 15:38 schreef idontlikepizza het volgende:
Volgens mij wel. Maar het importeren in een test-database kost niet echt veel moeite, lijkt me? Zeker met die grootte..
is een beetje ala "ik wil een andere auto want volgens mijn buurman is mijn huidige niet goed".quote:Op dinsdag 6 september 2005 13:06 schreef Godlike02 het volgende:
Ik heb op dit moment Mambo maar veel menesen vertellen me dat die te zwaar is en niet helemaal ideaal.
Draaid prima.quote:Op dinsdag 6 september 2005 16:01 schreef devzero het volgende:
Waarom wil je eigenlijk van mambo af? Heb je er problemen mee of draait je machine niet lekker?
[..]
is een beetje ala "ik wil een andere auto want volgens mijn buurman is mijn huidige niet goed".
Ja, dat zie ik ook vaak. of een check op e-mail adres met alleen @. Gebruik dan strstr...quote:Op woensdag 7 september 2005 16:37 schreef JeRa het volgende:
Helaas wordt preg_replace vaak te overijverig gebruikt. Zoiets als
$tekst = preg_replace('/blaat/', 'taalb', $tekst);
is iets wat veel mensen gebruiken om een stuk tekst te vervangen, terwijl
$tekst = str_replace('blaat', 'taalb', $tekst);
toch vele malen sneller is
Regexps zuigen als je niet goed weet hoe ze werken :Squote:
Ik heb een powerpointpresentatie ooit eens via dit topic gekregen. Daar staat het best helder in (ik heb het nog niet zoveel gebruikt, dus ik weet niet of het diep genoeg gaat voor wat lastigere regexps )quote:Op woensdag 7 september 2005 17:57 schreef ViPeRII het volgende:
[..]
Regexps zuigen als je niet goed weet hoe ze werken :S
Iemand nog eens een duidelijke "nederlandse" handleiding hiervoor?
1 2 3 4 5 6 7 8 9 | This is a multi-part message in MIME format. --===============1077165900== Content-Type: text/plain; charset=\"us-ascii\" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit utnzpw --===============1077165900==-- |
e107.orgquote:Op dinsdag 6 september 2005 13:06 schreef Godlike02 het volgende:
Ja collega´s en mede fokkers.
Even geen zin om nieuw topic te openen.
Maar ik ben ok zoek naar een mooie portal voor mijn website.
Ik heb op dit moment Mambo maar veel menesen vertellen me dat die te zwaar is en niet helemaal ideaal.
Kan iemand me helpen met wat tips?
Tnx
Voor zover ik weet wel, maar het wordt wellicht een probleem als ze de boundary makkelijk kunnen raden. Als ze die kunnen raden en in hun message zetten heb je het probleem dat ze vervolgens wél headers kunnen opgeven.quote:Op woensdag 7 september 2005 19:48 schreef Swetsenegger het volgende:
Is dit correct? In de body variabelen kunnen ze MIME types, boundry en content type injecteren wat ze willen, en zal toch niet resulteren in mails naar ontvangers welke je niet wil?
Ik ben niet zo into mails.quote:Op woensdag 7 september 2005 21:11 schreef JeRa het volgende:
[..]
Voor zover ik weet wel, maar het wordt wellicht een probleem als ze de boundary makkelijk kunnen raden. Als ze die kunnen raden en in hun message zetten heb je het probleem dat ze vervolgens wél headers kunnen opgeven.
Nee met preg_match check ik gewoon voor een geldig e-mail adres en daar horen enters niet inquote:Ook moet je er dus op letten dat dingen als naam, e-mailadres, etc die in de mailheaders komen géén ongeldige tekens mogen bevatten zoals een enter, want dan kun je ook extra headers opgeven.
Hoeft niet, zolang je maar op de headers blijft lettenquote:
Boundaries worden gebruikt om een multipart e-mail (HTML-email bijvoorbeeld) op te delen in verschillende segmenten met verschillende headers (mime-type etc). Aangezien alleen een unieke boundary aan kan geven dat er een nieuw stuk (mét nieuwe headers) begint, moet je ervoor zorgen dat die ook echt uniek zal zijn. Waarschijnlijk heeft het verder geen gevolgen voor mailinjectie, aangezien de headers daar niet meer van toepassing zijn op de ontvanger.quote:Ik doe zelf niets met boundry., voorzover ik weet. Het is toch niet zo dat elke mail een boundry heeft?
[..]
Dan zit je wrs al gebakkenquote:Nee met preg_match check ik gewoon voor een geldig e-mail adres en daar horen enters niet in
Je doet dit waarschijnlijk via phpMyAdmin? Die heeft de beperking van HTTP file uploads, enkele MB's dus. Wat je kunt doen:quote:Op woensdag 7 september 2005 22:02 schreef wonderer het volgende:
Ik wil graag backupbestanden van 200000 records terugzetten... hoe kan ik dat het beste doen? Uploaden via SQL gaat niet...
1 2 3 | <?php include "header.php?pagina=homepage"; ?> |
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |