Testen tegen SQL Injection

Status
Niet open voor verdere reacties.

ariecade

Gebruiker
Lid geworden
5 jun 2019
Berichten
146
Hallo,

Ik wil een bepaalde url testen tegen SQL injection, weet iemand daar een online tool voor?
Het gaat dus bijvoorbeeld een url als deze: www.example.nl/product/item.php?id=1

Mijn query is dat zoiets: SELECT * FROM table WHERE id =".(int)$id

Nu doe ik dus wel een controle of id een nummer is maar ben niet 100% overtuigd of dat dit voldoende is.
Ik weet dat dit met Prepared Statements een betere oplossing is maar dat heeft voor nu een te grote impact om dat om te zetten dus ik zoek eigenlijk de ene beste oplossing om het veilig te maken :D

mod. url aangepast in example.nl
 
Laatst bewerkt door een moderator:
zet sowieso je waarde tussen strings, en escape het met mysqli_real_escape_string() of in OO $db->real_escape_string
PHP:
<?php
$id = $db->real_escape_string($_GET['id']);
$result = $db->query("SELECT * FROM table WHERE id ='".$id."'");
?>

.... of gebruik prepared statements. ;)

Testen kan door er wat verboden tekens in te gooien. Als die niet geescaped worden is je query dus stuk, en moet je dus een foutmelding laten zien.

Ikzelf heb in mijn site een errorhandler gebouwd die aan de hand van een sub-class (extend) op MySQLi een error als exception toont.
Als de debug-stand in mijn siteconfiguratie aanstaat is de error zichtbaar, en anders staat er een algemene gebruiksvriendelijke error en wordt er buiten de webroot de error opgeslagen in een tekstbestand.
 
Laatst bewerkt:
Bedankt voor je snelle reactie maar blijf toch nog met een paar vragen zitten ...... :D

Waarom is mysqli_real_escape_string beter dan int als ik zeker weet dat een correct id een nummer moet zijn?

Wat bedoel jij met "zet sowieso je waarde tussen strings", bedoel je daar "zet sowieso je waarde tussen quotes / accolades"?

En nu we toch bezig zijn, is FROM table WHERE id ='".$id."' beter dan FROM table WHERE id =".$id." ? Je hoeft toch niet perse een getal tussen enkele accolades te zetten?

En als laatste, hoe kan ik controleren of de url wel of niet escaped wordt?
 
Met (int) typecast je je string naar een integer. Als je een teksst hebt, dan wordt dit 0. En dat lijkt me ook niet de bedoeling.
Het enige wat je wilt is correct je invoer escapen, dus gebruik daarom de juiste manier met mysqli_real_escape_string.

Verder zijn de single-quotes altijd aan te bevelen, tenzij je een goede invoervalidatie hebt met ctype_digit.
 
Bedankt weer, toevallig in mijn geval maakt het niet echt uit als id 0 wordt maar ik begrijp nu het verschil en zal mysqli_real_escape_string gebruiken.

En de tip over het altijd quoten zal ik ook meenemen, ik lees links en rechts dat dat inderdaad wel verstandig is om dat altijd te doen.

Maar om nog even op de eerste vraag terug te komen ....... weet jij of iemand een online test om voor de zekerheid de url te testen op kwestbaarheden?
 
Je kan SQLmap gebruiken.
Maar als je test door ergens ' in te voeren, dan moet je zelf ook wel merken of het fout gaat.
 
Ok, bedankt voor de tip okver SQLmap, ik zal daar eens induiken.

Daarnaast heb ik het even getest met een '

ik heb dus item.php?id=23 en maak daar in de adresbalk item.php?id=23' van en type op Enter. Ik krijg dan nog steeds item 23 te zien en in de adresbalk staat item.php?id=23%27

Dat lijkt mij dan correct?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan