Is dit veilig voor sql-injectie?
ik heb hier voor mijn script gebruikt zonder mysql_real_escape_string en deze is gehackt geweest
ik hoop dat dit nu veilig is
met dank
PHP Code:
<?php
$id = mysql_real_escape_string($_GET['id']);
$query = "SELECT * FROM `subpaginas` WHERE `id` = " .$id;
$result = mysql_query($query) or trigger_error( mysql_error() );
$rij = mysql_fetch_assoc($result);
?>
<h1><?php echo $rij['naam'] ?></h1>
<?php echo $rij['tekst'] ?>
- is dit veilig sql-injectie
-
05-05-2012, 14:08 #1
- Berichten
- 161
- Lid sinds
- 13 Jaar
is dit veilig sql-injectie
-
-
05-05-2012, 14:17 #2
- Berichten
- 20
- Lid sinds
- 13 Jaar
Re: is dit veilig sql-injectie
Ik zou controlleren of het id wel een getal is.?
PHP Code:<?php
if(ctype_digit($_GET['id']))
{
$sql = "
SELECT
*
FROM
subpaginas
WHERE
id = '".mysql_real_escape_string($_GET['id'])."'
";
if(!$res = mysql_query($sql))
{
trigger_error(mysql_error().'<br />In query: '.$sql);
}
elseif(mysql_num_rows($res) == 0)
{
echo 'Geen resultaten gevonden';
}
else
{
while($row = mysql_fetch_assoc($res))
{
echo "<h1>".$rij['naam']."</h1>";
echo $rij['tekst'];
}
}
}
?>
-
05-05-2012, 14:20 #3
- Berichten
- 161
- Lid sinds
- 13 Jaar
Re: is dit veilig sql-injectie
alvast bedankt ruben
-
05-05-2012, 14:22 #4
- Berichten
- 690
- Lid sinds
- 15 Jaar
Re: is dit veilig sql-injectie
of gewoon $id=(int)$_GET["id"];
Dan convert php m naar een nummer. Als iemand iets wazigs invoert zullen ze een 404 krijgen
-
05-05-2012, 14:31 #5
64BitsWebhosting.EU
- Berichten
- 2.085
- Lid sinds
- 18 Jaar
Re: is dit veilig sql-injectie
- trigger_error() is een funktie die TRUE kan opleveren en daardoor je expressie zal evalueren als TRUE en dus een fallthrough veroorzaken met nog meer errors indien je query om e.o.a. reden zou mislukken.
- Op het moment dat 'id' niet is meegegeven zal je query ook kunnen mislukken aangezien een mysql_rea...() weinig zin heeft op een variabele die er niet is. Als je in je query een integer wilt gebruiken, moet je zorgen dat het ook een integer is. Een simpele (int)$GET['id'] should do the trick al is het mooier als je een niet ingevulde waarde als fout zou behandelen. Mysql_real..() is niet nodig als je 'id' al gecast hebt naar een 'int' en 'id' zal dan (indien leeg) '0' zijn in tegenstelling tot het gebruik van mysql_re..().
- Het tonen daarna van de waarden uit de database kan diverse effecten hebben van wacky output tot diverse 'hacks', afhankelijk van de mogelijkheid van externe users om ooit iets in 'naam' of 'tekst' in te vullen. Kijk eens naar funkties zoals htmlentities etc om dit te voorkomen.
Dus concreet is dit stukje allesbehalve goed/veilig, maar de kans op een sql-injectie is wel erg klein omdat je mysql_re..() uiteraard wel gebruikt. (Ook al kan dat issues in de rest van de code opleveren).
-
05-05-2012, 14:32 #6
- Berichten
- 161
- Lid sinds
- 13 Jaar
Re: is dit veilig sql-injectie
alvast bedankt voor de hulp allemaal
is deze even veilig $id=(int)$_GET["id"]; als deze <?php
if(ctype_digit($_GET['id']))
-
05-05-2012, 14:35 #7
64BitsWebhosting.EU
- Berichten
- 2.085
- Lid sinds
- 18 Jaar
Re: is dit veilig sql-injectie
Het zijn 2 verschillende dingen:
(int)$var is een cast van een variabele met onbekende inhoud naar type integer.
ctype_digit() is een test om te kijken of de inhoud uit digits bestaat. En dat is beter dan met de botte bijl casten naar een int.
-
05-05-2012, 15:37 #8
- Berichten
- 690
- Lid sinds
- 15 Jaar
Re: is dit veilig sql-injectie
Hoezo? Als dit om pagina's gaat, dan zal je nooit een 404 tegen komen, maar als je iets raars in de URL zet dan krijg je gewoon een 404, omdat de query niks terug geeft (of een pagina met ID 0 ), dat klopt toch?
-
05-05-2012, 16:29 #9
64BitsWebhosting.EU
- Berichten
- 2.085
- Lid sinds
- 18 Jaar
Re: is dit veilig sql-injectie
Maar als je mysql_real_escape om een lege waarde zet dan blijft ie leeg.
Wegens gebrek aan quotes om de var in de query krijgt je dan een mysql syntax error.
Edit: Wat ik bedoelde is:
var_dump ($x); // NULL
$y = (int)$x;
var_dump($y); // 0
$z = 'select blabla .... id = ' . mysql_real_escape_string($x);
echo "*$z*"; // *select blabla .... id = *Laatst aangepast door John Timmer : 05-05-2012 om 16:40
-
05-05-2012, 17:05 #10
- Berichten
- 106
- Lid sinds
- 15 Jaar
Re: is dit veilig sql-injectie
Als je SQL injection wilt voorkomen, dan is het gebruik van prepared statements het beste.
-
05-05-2012, 17:51 #11
- Berichten
- 1.483
- Lid sinds
- 16 Jaar
Re: is dit veilig sql-injectie
In bovenstaande case zou ik voor een Ternary Operator gaan (vervangt ook meteen de vele if / else statements):
PHP Code:// als $_GET['id'] niet bestaat OF geen geldige waarde bevat (ctype_digit uiteraard) krijg je de waarde 0
$id = (!isset($_GET['id']) || !ctype_digit($_GET['id'])) ? 0 : $_GET['id'];
$id kun je nu zonder quotes opnemen in je statement:
PHP Code:$sql = "WHERE `id` = ".$id;
-
05-05-2012, 18:11 #12
- Berichten
- 106
- Lid sinds
- 15 Jaar
Re: is dit veilig sql-injectie
Correct. Vind ik ook het handigste werken.
In bovenstaande case zou ik voor een Ternary Operator gaan (vervangt ook meteen de vele if / else statements):
PHP Code:// als $_GET['id'] niet bestaat OF geen geldige waarde bevat (ctype_digit uiteraard) krijg je de waarde 0
$id = (!isset($_GET['id']) || !ctype_digit($_GET['id'])) ? 0 : $_GET['id'];
$id kun je nu zonder quotes opnemen in je statement:
PHP Code:$sql = "WHERE `id` = ".$id;
-
05-05-2012, 18:24 #13
- Berichten
- 161
- Lid sinds
- 13 Jaar
Re: is dit veilig sql-injectie
Het gebruik van PDO vindt ik altijd nog het beste: http://php.net/manual/en/pdo.prepared-statements.php
-
05-05-2012, 20:50 #14
- Berichten
- 1.483
- Lid sinds
- 16 Jaar
Re: is dit veilig sql-injectie
Het gebruik van PDO vindt ik altijd nog het beste: http://php.net/manual/en/pdo.prepared-statements.php
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