Beste Scripters,
Al een tijdje gebruik ik de functie
om alle gebruiker input clean te maken voordat het wordt weggeschreven.PHP Code:
mysql_real_escape_string()
Voor cijfers gebruik ik ook nog een controle namelijkMijn vraag:PHP Code:
is_numeric()
Is de functie
echt 100% waterdicht? Of moet ik nog ergens anders rekening mee houden?PHP Code:
mysql_real_escape_string()
Groeten,
Ben
- anti sql injectie
-
06-12-2011, 10:20 #1
- Berichten
- 442
- Lid sinds
- 16 Jaar
anti sql injectie
-
In de schijnwerper
-
06-12-2011, 10:33 #2
- Berichten
- 651
- Lid sinds
- 17 Jaar
Re: anti sql injectie
Het is waterdicht. Al zijn er wel een aantal extra dingen waarop gecheckt kan worden.
Zorg bijvoorbeeld dat alle velden een maximale input hebben van bijvoorbeeld 100 characters, check dan door middel van PHP of het ook echt maximaal 100 characters zijn. Je kunt de input checken met empty(), isset() en (idd) is_numeric().
Daarnaast nooit in één keer de waardes in de database zetten, maar eerst door al die checks laten gaan. Wat ook goed is om te doen, is het gebruik van htmlentities().
-
06-12-2011, 10:41 #3
- Berichten
- 442
- Lid sinds
- 16 Jaar
Re: anti sql injectie
Hoi Stefan, ik controleer inderdaad altijd eerst of de verplichte velden wel ingevuld zijn.
htmlentities gebruik ik eigenlijk alleen op textarea velden zodat eventuele speciale tekens normaal worden weergeven op de site.
Gelukkig is het waterdicht. Kan ik met een gerust hart verder werken ;-)
Bedankt.
Aanvulling:
Ik gebruik de functie op deze manier:
PHP Code:
foreach($_POST AS $key => $value){
$_POST[$key] = mysql_real_escape_string($value);
}
##functie van het systeem
UpdateTask($_GET['id'],
$_POST['omschrijving'],
$_POST['tijd_totaal'],
$_POST['index_view']);
Misschien dat andere er ook nog wat aan hebben
$_GET['id'] word trouwens wel apart gecontroleerd.Laatst aangepast door Ben F. : 06-12-2011 om 10:49 Reden: code
-
06-12-2011, 13:53 #4
- Berichten
- 115
- Lid sinds
- 13 Jaar
Re: anti sql injectie
Let er wel op dat je de data tussen enkele quotes zet (')
Voorbeeld:
PHP Code:$query = "UPDATE tabel SET veld='". mysql_real_escape_string($_POST['test']) ."'";
-
07-12-2011, 09:14 #5
- Berichten
- 442
- Lid sinds
- 16 Jaar
Re: anti sql injectie
Hoi Peter, bedankt voor de tip. Ik doe mijn querys altijd op deze manier:
PHP Code:$Query = mysql_query(sprintf("SELECT * FROM tabel WHERE veld= '%s'",$variable));
-
07-12-2011, 09:44 #6
- Berichten
- 756
- Lid sinds
- 16 Jaar
Re: anti sql injectie
nummerieke waardes hoef je niet te quoten en ook niet door mysql_real_escape_string() te halen.
(int)$_GET['id'] is in dat geval voldoende en sneller.
Echter, als je ergens mysql_real_escape_string() gebruikt, moet je ook rekening houden met magic_quotes.
Zelf doe ik het op deze manier:
PHP Code:<?php
$q = "SELECT field FROM table WHERE id=".(int)$_GET['id'];
$q2 = "SELECT field FROM table WHERE id=".Quote($_GET['id'],"int");
$q3 = "SELECT field FROM table WHERE name=".Quote($_GET['name'],"text");
$q4 = "INSERT INTO table (`name`,`html`)VALUES(".Quote($_POST['name'],"text").",".Quote($_POST['html'],"html").")";
function Quote($theValue, $theType="text", $sReturnQuotes=TRUE){
$theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
$theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);
if($theType!="html"){
$theValue = htmlspecialchars($theValue,ENT_COMPAT,'UTF-8');
}
switch($theType){
//int
case "int":
return ($theValue != "") ? intval($theValue) : "NULL";
break;
//html,text,date
default:
if(!$sReturnQuotes){
//quotation disabled (LIKE queries etc)
return ($theValue != "") ? $theValue : "NULL";
}
return ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
}
}
?>
-
07-12-2011, 09:54 #7
- Berichten
- 1.470
- Lid sinds
- 19 Jaar
Re: anti sql injectie
Beter gebruik je ctype_digit ipv is_numeric
-
07-12-2011, 10:05 #8
- Berichten
- 442
- Lid sinds
- 16 Jaar
Re: anti sql injectie
@Z Tas
Bedankt! Maar wat houd het precies in? ik had de volgende functie gevonden:
PHP Code:function cleanuserinput($dirty){
if (get_magic_quotes_gpc()) {
$clean = mysql_real_escape_string(stripslashes($dirty));
}else{
$clean = mysql_real_escape_string($dirty);
}
return $clean;
}
de functie mysql_escape_string is wel een oude die alleen voorkomt in php 4, voor al mijn applicaties is sowieso php 5 vereist.
@I. van Zon
Wat is precies het verschil tussen deze 2?
-
07-12-2011, 10:21 #9
- Berichten
- 756
- Lid sinds
- 16 Jaar
Re: anti sql injectie
Of get_magic_quotes_gpc aanstaat verschilt per server.
Als het aanstaat wordt de data ge-escaped.
mysql_real_escape_string zal dit nogmaals escapen en dit geef de nodige problemen.
Vandaar dat je eerst stripslashes() moet toepassen (als get_magic_quotes_gpc aanstaat).
De functie die je zelf voorsteld komt deels overeen, maar dan moet je de quotes handmatig afhandelen en er wordt geen rekening gehouden met XSS injection (database niveau) en eventuele NULL waardes.
@Z Tas
Bedankt! Maar wat houd het precies in? ik had de volgende functie gevonden:
PHP Code:function cleanuserinput($dirty){
if (get_magic_quotes_gpc()) {
$clean = mysql_real_escape_string(stripslashes($dirty));
}else{
$clean = mysql_real_escape_string($dirty);
}
return $clean;
}
de functie mysql_escape_string is wel een oude die alleen voorkomt in php 4, voor al mijn applicaties is sowieso php 5 vereist.
@I. van Zon
Wat is precies het verschil tussen deze 2?
-
07-12-2011, 10:55 #10
- Berichten
- 57
- Lid sinds
- 19 Jaar
Re: anti sql injectie
nummerieke waardes hoef je niet te quoten en ook niet door mysql_real_escape_string() te halen.
-
07-12-2011, 11:15 #11
- Berichten
- 158
- Lid sinds
- 14 Jaar
Re: anti sql injectie
Wanneer je de basis PHP onder de knie hebt, is het handig om gebruik te maken van een PHP framework. Die doet al een heleboel werk voor jou en je hebt een beter begrijpbaar stukje code.
-
07-12-2011, 11:31 #12
- Berichten
- 442
- Lid sinds
- 16 Jaar
Re: anti sql injectie
Ik werk nu al 4 jaar met PHP. De reden waarom ik dit topic open is omdat er de laatste tijd veel in het nieuws is dat websites worden gehackt door middel van een SQL injectie. ik vroeg me af of ik het wel goed doe allemaal want als het inderdaad zo makkelijk is om het te voorkomen is het toch wel raar dat zelfs overheid instanties via deze manier gehackt kunnen worden.
-
07-12-2011, 11:59 #13
64BitsWebhosting.EU
- Berichten
- 2.085
- Lid sinds
- 18 Jaar
Re: anti sql injectie
Ik werk nu al 4 jaar met PHP. De reden waarom ik dit topic open is omdat er de laatste tijd veel in het nieuws is dat websites worden gehackt door middel van een SQL injectie. ik vroeg me af of ik het wel goed doe allemaal want als het inderdaad zo makkelijk is om het te voorkomen is het toch wel raar dat zelfs overheid instanties via deze manier gehackt kunnen worden.
Jantje komt van school met basic skills, gaat werken bij een it bedrijf en wordt met een sluier van zogenaamde skills en functietitels bij een klant (overheid) gedetacheerd.
Overheid heeft van de salespik alleen een mooi verhaal en een dikke uur prijs gekregen en neemt voor het gemak even aan dat de salespik niet liegt... (duh...).
Vervolgens heb je een duur mannetje met low skils in een nieuwe job. Jantje denk 'uh, ik verdien maar 20 euro per uur'... klant denkt 'dat mannetje is goed want het kost 100 euro per uur'.
Voila, een ideale mix om een it project te krijgen dat voor 90% uit gebakken lucht en fixes bestaat.
-
07-12-2011, 12:56 #14
- Berichten
- 442
- Lid sinds
- 16 Jaar
Re: anti sql injectie
Daar heb je wel een punt inderdaad, ik heb zelf bij een bedrijf stage gelopen dat voor een belachelijk hoog uurtarief website laat ontwikkelen door mbo studenten die nog net de basis van PHP of andere script talen beheersen. Alleen leek het me toch wel dat de overheid budget genoeg heeft om een professioneel bedrijf met goeie recensies/referenties in te schakelen voor het ontwikkelen van een website als digid.
-
07-12-2011, 13:06 #15
64BitsWebhosting.EU
- Berichten
- 2.085
- Lid sinds
- 18 Jaar
Re: anti sql injectie
Daar heb je wel een punt inderdaad, ik heb zelf bij een bedrijf stage gelopen dat voor een belachelijk hoog uurtarief website laat ontwikkelen door mbo studenten die nog net de basis van PHP of andere script talen beheersen. Alleen leek het me toch wel dat de overheid budget genoeg heeft om een professioneel bedrijf met goeie recensies/referenties in te schakelen voor het ontwikkelen van een website als digid.
Plaats een
- + Advertentie
- + Onderwerp
Marktplaats
Webmasterforum
- Websites algemeen
- Sitechecks
- Marketing
- Domeinen algemeen
- Waardebepaling
- CMS
- Wordpress
- Joomla
- Magento
- Google algemeen
- SEO
- Analytics
- Adsense
- Adwords
- HTML / XHTML
- CSS
- Programmeren
- PHP
- Javascript
- JQuery
- MySQL
- Ondernemen algemeen
- Belastingen
- Juridisch
- Grafisch ontwerp
- Hosting Algemeen
- Hardware Info
- Offtopic