Als je weet dat ergens een getal in moet dan kun met idd met bijvoorbeeld intval() zorgen dat er een getal in gaat. Maar als ergens een string in moet dan heb je mysql_real_escape_string nodig. Als je strings niet controleert maakt het nauwelijks nog uit hoe goed je integers controleert, een ketting maar zo sterk als de zwakste schakel.quote:Op dinsdag 30 september 2008 21:48 schreef NikkelCobalt het volgende:
[..]
Bij het doorgeven van id's vooraf controleren of het daadwerkelijk een getal is, is al een prima oplossing.
Nee, blind addslashes() gebruiken is niet genoeg. Dat helpt alleen bij strings, niet bij numerieke waarden.quote:Op dinsdag 30 september 2008 21:17 schreef Likkende_Lassie het volgende:
elke mysql query voorzien van addslashes() (magic quotes kan dan op off toch), verhelpt dat het gehele mysql injectie probleem? Of zijn er nog meer dingen om rekening mee te houden?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | PHP function quote_smart($value, $type = false, $NULL = false) { if ($NULL AND (!$value OR $value == '')){ return NULL; }else{ if ($type == 'num'){ if (is_numeric($value)){ return $value; }else{ return ''; } }else{ if (get_magic_quotes_gpc()) { $value = stripslashes($value); } if(version_compare(phpversion(),"4.3.0") == "-1") { return mysql_escape_string($value); } else { return mysql_real_escape_string($value); } } } } ?> |
1 2 3 | mysql_query("INSERT INTO blabla ('name') VALUES ('".quote_smart($_POST['name'])."')"); ?> |
1 2 3 | mysql_query("SELECT name FROM blabla WHERE id = '".quote_smart($id, 'num')."' LIMIT 1"); ?> |
Ik zeg ook niet dat je strings niet moet controleren. Als je het verhaal gelezen had wat ik quotte dan stond daar ook in dat hij naar meer aanvullingen zocht bovenop het escapen.quote:Op dinsdag 30 september 2008 21:56 schreef Light het volgende:
[..]
Als je weet dat ergens een getal in moet dan kun met idd met bijvoorbeeld intval() zorgen dat er een getal in gaat. Maar als ergens een string in moet dan heb je mysql_real_escape_string nodig. Als je strings niet controleert maakt het nauwelijks nog uit hoe goed je integers controleert, een ketting maar zo sterk als de zwakste schakel.
1 2 3 | function quote_smart($value, $type, $NULL) { ?> |
1 2 3 | function quote_smart($value, $type = false, $NULL = false) { ?> |
True. Maar je moet die gegevens er ook een keer instoppen.quote:Op dinsdag 30 september 2008 22:15 schreef NikkelCobalt het volgende:
Overigens zijn mijn ervaringen met databasegestuurde applicaties zijn dat in 90% van de gevallen je gegevens ophaalt (!) aan de hand van een id.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | PHP function quote_smart($value, $type = false, $NULL = false) { if ($NULL AND (!$value OR $value == '')){ return NULL; }else{ if ($type == 'num'){ if (is_numeric($value)){ return $value; }else{ return ''; } }else{ if (get_magic_quotes_gpc()) { $value = stripslashes($value); } if(version_compare(phpversion(),"4.3.0") == "-1") { return mysql_escape_string($value); } else { return mysql_real_escape_string($value); } } } } ?> |
1 2 3 | mysql_query("INSERT INTO blabla ('name') VALUES ('".quote_smart($_POST['name'])."')"); ?> |
1 2 3 | mysql_query("SELECT name FROM blabla WHERE id = '".quote_smart($id, 'num')."' LIMIT 1"); ?> |
Als ik verwacht een numerieke waarde terug te krijgen, verwacht ik geen lege string.quote:Op woensdag 1 oktober 2008 11:25 schreef Chandler het volgende:
Omdat dat de type moet weergeven als in de functie die er boven staat weergegeven
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | PHP function quote_smart($value, $type = false, $NULL = false) { if ($NULL AND (!$value OR $value == '')){ return NULL; }else{ if ($type == 'num'){ if (is_numeric($value)){ return $value; }else{ return 0; } }else{ if (get_magic_quotes_gpc()) { $value = stripslashes($value); } if(version_compare(phpversion(),"4.3.0") == "-1") { return mysql_escape_string($value); } else { return mysql_real_escape_string($value); } } } } ?> |
1 2 3 | mysql_query("INSERT INTO blabla ('name') VALUES ('".quote_smart($_POST['name'])."')"); ?> |
1 2 3 | mysql_query("SELECT name FROM blabla WHERE id = '".quote_smart($id, 'num')."' LIMIT 1"); ?> |
quote:Op woensdag 1 oktober 2008 11:10 schreef GlowMouse het volgende:
Waarom zet je in je tweede query een integer tussen quotes?
Het gaat om dit blokje code:quote:Op woensdag 1 oktober 2008 11:25 schreef Chandler het volgende:
Omdat dat de type moet weergeven als in de functie die er boven staat weergegeven :)
1 2 3 4 5 6 7 8 | if ($type == 'num'){ if (is_numeric($value)){ return $value; }else{ return ''; } ?> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | function quote_smart($value, $type = false, $NULL = false) { $value = trim($value); if (strlen($value)) { # We have something if ($type == 'num'){ if (is_numeric($value)){ return $value; } else { trigger_error(sprintf("%s: '%s' is not a number!", __FUNCTION__, $value), E_USER_ERROR); return null; } } } else { if ($NULL) { return null; } } return $value; } var_dump(quote_smart(0, 'num', true)); # Hier breekt je huidige code blok op var_dump(quote_smart("Bla", 'string', true)); var_dump(quote_smart(" ", 'string')); var_dump(quote_smart("Bla", 'num', true)); # Error ?> |
De functie heet "quote_smart", maar er wordt niets ge-quote. Het is een encoding functie.quote:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | function secureValue($value, $html){ if (!$html){ $value = strip_tags($value, '<b>,<a>,<i>,<u>,<img>'); }else{ $value = htmlnumericentities($value); } if (!$value){ $value = NULL; } switch (gettype($value)) { case 'boolean': return $value ? '1' : '0'; case 'integer': case 'double': return (string)$value; case 'string': return "'".addslashes($value)."'"; case 'array': case 'object': return "'".addslashes($value)."'"; default: //'resource', 'NULL', 'unknown type' return 'NULL'; die(); } } ?> |
Niet alleen integers zijn numeriek. Ook floats zijn dat, om eens een voorbeeld te noemen.quote:Op woensdag 1 oktober 2008 12:06 schreef slacker_nl het volgende:
Ik zou een trigger_error gebruiken, aangezien er duidelijk wat mis is als je een integer verwacht, maar het er geen is.
Dat het mag en dat het werkt wil niet zeggen dat het good programming practice is en ook niet dat we er geen opmerkingen over mogen maken.quote:En je mag een integer gewoon binnen quotes plaatsen, dus op zich is er niks aan de hand.
Goed punt. Al vraag ik me af of alle hosters PDO ondersteunen.quote:Overigens zou ik PDO gebruiken voor dit soort shit, maar iedereen leest gewoon over SR's post heen. Dan heb je een deel van deze code niet nodig..
Wat doe je dan bij een float?quote:Ik zou je functie zo schrijven..
[ code verwijderd ]
https://devzone.zend.com/(...)revent-SQL-Injection
http://www.phpro.org/tutorials/Introduction-to-PHP-PDO.html
In reactie op je nieuwe code, ipv if is_numeric else return 0, dan kan je gelijk intval gebruiken, zie de documentatie hiervan: The integer value of var on success, or 0 on failure.
Dan gebruik je is_int().. of je retouneert intval($value);quote:Op woensdag 1 oktober 2008 17:01 schreef Light het volgende:
Niet alleen integers zijn numeriek. Ook floats zijn dat, om eens een voorbeeld te noemen.
Dit punt vervalt als je PDO gebruikt (en dat gebruik ik alleen maar icm prepared statements). Of ik nou id = '1' of id = 1 invul, zal me verder jeuken.. En je mag er wat van zeggen, maar ik mag toch ook zeggen dat het niet zo hinderlijk is als iemand het doet aangezien het gewoon verwerkt wordt (zonder warning of wat dan ook..).quote:Dat het mag en dat het werkt wil niet zeggen dat het good programming practice is en ook niet dat we er geen opmerkingen over mogen maken.
Andere hoster zoeken die wel met de tijd meegaat.quote:Goed punt. Al vraag ik me af of alle hosters PDO ondersteunen.
Zie hierboven, desnoods breidt is z'n functie uit zodat ie alle verschillende datatypes kan checken..quote:Wat doe je dan bij een float?
1 2 | $sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12); |
Oe.. dat zou wel flex wezen.. Ben ik ook wel benieuwd naar..quote:Op donderdag 2 oktober 2008 13:05 schreef Chandler het volgende:
Weet iemand een tootlje om 2 databases met elkaar te vergelijken en dan de verschillen in een statement kan zetten die ik kan gebruiken om een database aan te passen?
Ik ben altijd wel huiverig met software waarbij de laatste release datum al erg lang geleden is..quote:Op zaterdag 4 oktober 2008 20:21 schreef spaceninjapirate het volgende:
Ik weet niet of het om de inhoud van de tabel of om de structuur gaat, maar ik heb ver in het verleden deze wel eens gebruikt:
http://www.mysqldiff.org/index.php
quote:Version 1.5.0 (10/01/2004)
http://mirrors.kernel.org/gnu/patch/quote:Op zondag 5 oktober 2008 00:05 schreef ursel het volgende:
[..]
Ik ben altijd wel huiverig met software waarbij de laatste release datum al erg lang geleden is..
[..]
Je kunt je natuurlijk afvragen of het nog wel doet wat het moet doen. MySQL is in de afgeloen vier jaar ook behoorlijk veranderd.quote:Op zondag 5 oktober 2008 00:20 schreef GlowMouse het volgende:
[..]
http://mirrors.kernel.org/gnu/patch/
Als het doet wat het moet doen, is er weinig reden om het versienummer maar te verhogen om maar een nieuwe versie te hebben.
Als je PDO gebruikt, moet je dan nog dingen als mysql_real_escape_string gebruiken?quote:Op dinsdag 30 september 2008 21:58 schreef SuperRembo het volgende:
[..]
Nee, blind addslashes() gebruiken is niet genoeg. Dat helpt alleen bij strings, niet bij numerieke waarden.
Je kan beter geparameteriseerde query's gebruiken, bijvoorbeeld met behulp van PDO.
Als je zelf een sql string aan elkaar zou plakken dan moet dat nog steeds. Maar met PDO kan je ook geparameteriseerde query's gebruiken, en dan wordt de waarde die je aan de parameter geeft automatisch op de juiste manier verwerkt.quote:Op maandag 6 oktober 2008 00:22 schreef Tijn het volgende:
[..]
Als je PDO gebruikt, moet je dan nog dingen als mysql_real_escape_string gebruiken?
Ik ben niet zo bekend met transactions, maar zijn dit niet heel veel extra (en onnodige) handelingen per pagina? Op zich is een extra query per pagina niet zo'n ramp natuurlijk, maar je wilt ook niet teveel onnodige dingen gaan doen op iedere pageloadquote:Op maandag 6 oktober 2008 22:39 schreef Light het volgende:
Wat je wel kunt doen is transactions gebruiken (en dus innodb tables). Autocommit moet dan uiteraard uit. Eerst met een select kijken hoeveel rijen er zijn, als er 25 (of meer) zijn het laagste id deleten. Daarna kun je altijd weer een rij toevoegen, en daarna de commit doen.
Ja, dat dusquote:Op maandag 6 oktober 2008 22:39 schreef Light het volgende:
Maar waarom zou je niet gewoon alles opslaan? Je kunt bij het tonen wel instellen dat alleen de 25 laatste entries worden getoond. Als iemand z'n cookies weggooit (om wat voor reden dan ook) is je telling toch in de war. Tenzij je ook alles gaat wissen op basis van leeftijd, bijvoorbeeld alles ouder dan een week.
Extra voordeel van alles bewaren is dat je er ook weer leuke statistiekjes uit kunt halen over welke pagina's veel worden bezocht enzo.
Zie je de forums als admin wel? Zo ja, zijn ze alleen zichtbaar voor ingelogde leden bijvoorbeeld?quote:Op maandag 6 oktober 2008 22:52 schreef AC4WHEELS.NL het volgende:
Hallo allemaal.
Sinds kort heb ik een forum gemaakt: www.legotechnicfans.nl. Nu wil ik de forums aanmaken alleen worden deze niet zichtbaar op de site. Iemand een idee hoe dit op te lossen is?
En nog iets: Hoe krijg ik die letters 'proFormell' uit mijn banner?
Dank je wel.
Die letters zijn er in 'gepojecteerd'. De forums zijn nu zichtbaar, waren toch verkeerde instellingen,.quote:Op maandag 6 oktober 2008 23:10 schreef Xcalibur het volgende:
[..]
Zie je de forums als admin wel? Zo ja, zijn ze alleen zichtbaar voor ingelogde leden bijvoorbeeld?
Beetje meer info mag wel
Die letters weghalen zal niet simpel wezen, kan je niet een ander logo regelen?
Ik ga gewoon het script eruit knallenquote:Op maandag 6 oktober 2008 23:18 schreef Xcalibur het volgende:
Oh, ik zie het al ja... die tekst is het logo, die over de achtergrond heenstaat kennelijk...
Kan je het logo niet vervangen (vanuit het admin deel wellicht, of anders gewoon het bestand) met een transparante GIF of PNG? Dan is ie nog steeds clickable maar wel onzichtbaar
Het levert wel extra overhead op, al was het maar door de extra queries. En door transactions te gebruiken wordt het als atomair blok behandeld, maar dat wil ook zeggen dat de volgende query moet wachten tot de vorige klaar is. In dat opzicht kan het nog vertragend werken ook (maar daar heb je vast niet veel last van met maar weinig bezoekers tegelijkertijd).quote:Op maandag 6 oktober 2008 23:08 schreef Xcalibur het volgende:
[..]
Ik ben niet zo bekend met transactions, maar zijn dit niet heel veel extra (en onnodige) handelingen per pagina? Op zich is een extra query per pagina niet zo'n ramp natuurlijk, maar je wilt ook niet teveel onnodige dingen gaan doen op iedere pageload
True. Maar er is niets mis met meedenken. En zeker als iets lastig uitvoerbaar is, moet je je afvragen of het wel wenselijk en de beste optie is.quote:Ja, dat dus
Maar dat is de vraag niet, en dat is lang niet zo'n interessante discussie
Dan ben je best uniek. MySQL 5.2 bestaat helemaal nietquote:Op dinsdag 7 oktober 2008 16:22 schreef Chandler het volgende:
[3 Oct 20:32] Konstantin Osipov
IPV6 support was added to MySQL v.6.0
Helaas draai ik nog 5.2 oid maar andere vraag dan want die zag ik niet beantwoord worden, zal dezelfde functie INET_ATON ook gaan werken voor IPV6?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | function UploadImage($file, $to_url, $allowed_types = NULL, $allowed_ext = NULL, $sizes = NULL) { $lastid = DAL_VraagAanbod::GetLastID(); if(is_uploaded_file($file["tmp_name"])) { list($x, $y, $image_type) = getimagesize($file["tmp_name"]); list($gx, $gy, $ctype) = $sizes; $split_name = explode(".", $file["name"]); $split_name[0] = $lastid->vra_id; //veranderen naar laatste Id $file_name = "vra_".$split_name[0] . "." . $split_name[1]; //in else ifs splitten om foutmelding mee te sturen if((($sizes == NULL) || (($ctype == MAX_SIZE) && (($x <= $gx) && ($y <= $gy))) || (($ctype == MIN_SIZE) && (($x >= $gx) && ($y >= $gy))) || (($ctype == EXACT_SIZE) && (($x == $gx) && ($y == $gy)))) && (($allowed_types == NULL) || (array_search($image_type, $allowed_types, true) !== false)) && (($allowed_ext == NULL) || (array_search(strtolower($split_name[count($split_name) - 1]), $allowed_ext) !== false))) { move_uploaded_file($file["tmp_name"], ($to_url . $file_name)); return $file_name; } } return false; } //IN DE CONTROLLER $insertedID = DAL_VraagAanbod::GetLastID(); define("MAX_SIZE", 1); define("MIN_SIZE", 2); define("EXACT_SIZE", 3); $allowed_types = array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_JPG); // array(types van: http://nl3.php.net/manual/nl/function.exif-imagetype.php) $allowed_ext = array("jpg", "png", "gif", "jpeg", "JPG", "PNG", "GIF", "JPEG"); // array(ext1, ext2, ext3) $path = "Images/"; // Str: waar die geupload moet worden. $global = $_FILES["vra_image"]; // De global. if($filename = UploadImage($global, $path, $allowed_types, $allowed_ext, $sizes)) { $split_name = explode(".", $_FILES["vra_image"]["name"]); $split_name[0] = $insertedID->vra_id; //veranderen naar laatste Id $file_name = "vra_".$split_name[0] . "." . $split_name[1]; $Merged->vra_image = $file_name; DAL_VraagAanbod::Insert($Merged); $lastId=DAL_VraagAanbod::LastId(); $obj=DAL_VraagAanbod::GetByPK($lastId); $msg=array(); $msg[]=GetMessage('VRAAGAANBOD','SAVEOK'); $crit=array('vra_id'=>$obj->id); GUI_VraagAanbod::ShowReadOnly($obj,$msg); } ?> |
Btw, plaatje wordt wel met de juiste bestandsnaam in de database opgeslagen.. lokaal werkt alles zoals ik vermeldequote:Op donderdag 9 oktober 2008 00:15 schreef Sjoe538 het volgende:
Vraagje,
Zit er verschil in de methode om plaatjes te uploaden wanneer dit lokaal of naar op een ftp server gebeurt?
Lokaal werkt mijn script namelijk wel, op mn ftp zijn alle bestanden indentiek, maar hier kan ik niet uploaden..
[ code verwijderd ]
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |