Page 1 of 1

[ProjDB] Belangrijk: Beschermen tegen SQL Injection

Posted: Tue Nov 27, 2012 11:10 pm
by Glenn
Hallo allemaal,

Bij deze wil ik iedereen die het vak programming project databases volgt er willen op wijzen dat ze hun applicatie moeten beschermen tegen de bekendste database attack, namelijk SQL injection. Blijkbaar kwam dit vorig jaar niet aan bod in deze cursus, wat dus zou betekenen dat er informatici kunnen afstuderen die applicaties maken die vatbaar zijn voor SQL Injection.

Om te weten wat SQL injection is, lees: http://en.wikipedia.org/wiki/SQL_injection

Je beschermen tegen SQL Injection kan je op twee manieren:

1) Maak gebruik van een functie die 'gevaarlijke' karakters wegfiltert uit een reeks user input. In PHP kan dit bijvoorbeeld met de functie mysql_real_escape_string() die speciaal gemaakt is om SQL injectie te verhinderen. Roep deze functie op op elke user input die je gebruikt in een query. Ook als de input bijvoorbeeld een niet gevaarlijke operatie is zoals bijvoorbeeld het opvragen van details over een bepaald product in een webshop.

2) De eerste optie is niet altijd mogelijk in elke programmeertaal. Een andere optie is gebruik maken van prepared statements. Door een prepared statement aan te maken, ligt de structuur van je query vast, zodat deze via een SQL injection attack niet kan aangepast worden. Op deze manier ben je evengoed beveiligd tegen SQL injection.

Bij deze zou ik willen vragen of van deze post een sticky kan gemaakt worden. Deze informatie is essentieel voor iedereen die programmeert met databases. Anders zouden er afgestudeerde bachelor/master-studenten kunnen zijn die applicaties schrijven voor een bedrijf waarvan de database direct gehackt kan worden.

Daarnaast zou ik willen vragen dat elk jaar deze informatie verspreid wordt onder de 2de jaar informatica (via facebook, vertellen tegen elkaar, ...). Deze informatica is echt essentieel voor iedereen die programmeert met databases. De post kan verwijderd worden indien deze topic terug tot het bachelorcurriculum zou behoren.

Groeten,
Glenn

Re: [ProjDB] Belangrijk: Beschermen tegen SQL Injection

Posted: Wed Nov 28, 2012 8:02 am
by Bob
Ik heb vermoedens omtrent wat een prepared statement is maar zou het moeten opzoeken om zeker te zijn. Kan je dit kort toelichten nog?

Re: [ProjDB] Belangrijk: Beschermen tegen SQL Injection

Posted: Wed Nov 28, 2012 12:21 pm
by Glenn
Een prepared statement is een statement waarvan je op voorhand door je query processor de structuur laat maken. Pas nadat de structuur is aangemaakt, geef je de input-waarden mee aan de query. Hieronder een voorbeeld van een prepared statement in Java en PHP (overgenomen van wikipedia).

Java:

Code: Select all


java.sql.PreparedStatement stmt = connection.prepareStatement(
"SELECT * FROM users WHERE USERNAME = ? AND ROOM = ?");
stmt.setString(1, username);
stmt.setInt(2, roomNumber);
stmt.executeQuery();
PHP:

Code: Select all


$stmt = $dbh->prepare("SELECT * FROM users WHERE USERNAME = ? AND PASSWORD = ?");
$stmt->execute(array($username, $password));
Meer informatie kan je vinden op: http://en.wikipedia.org/wiki/Prepared_statement.

Re: [ProjDB] Belangrijk: Beschermen tegen SQL Injection

Posted: Wed Nov 28, 2012 10:20 pm
by PowerToTheUsers
Glenn wrote:Een prepared statement is een statement waarvan je op voorhand door je query processor de structuur laat maken. Pas nadat de structuur is aangemaakt, geef je de input-waarden mee aan de query. Hieronder een voorbeeld van een prepared statement in Java en PHP (overgenomen van wikipedia).

Java:

Code: Select all


java.sql.PreparedStatement stmt = connection.prepareStatement(
"SELECT * FROM users WHERE USERNAME = ? AND ROOM = ?");
stmt.setString(1, username);
stmt.setInt(2, roomNumber);
stmt.executeQuery();
als username dan zoiets met " ' DROP TABLE" is, hebt ge toch nog altijd een probleem?

Re: [ProjDB] Belangrijk: Beschermen tegen SQL Injection

Posted: Wed Nov 28, 2012 11:18 pm
by Glenn
Een prepared statement is veilig ze. Die maakt gewoon die structuur om die query te processen op voorhand aan, zodat er geen DROPS etc. meer kunnen gebeuren. Die heeft gewoon al een structuur aangemaakt (een manier waarop hij de query moet processen) en die manier ligt al vast. Als er geen DROP zat in de structuur die je had opgesteld, zal je prepared statement nooit kunnen droppen.

Om het met de woorden van wikipedia te zeggen:
Prepared statements are resilient against SQL injection, because parameter values, which are transmitted later using a different protocol, need not be correctly escaped. If the original statement template is not derived from external input, SQL injection cannot occur.

Re: [ProjDB] Belangrijk: Beschermen tegen SQL Injection

Posted: Mon Dec 16, 2013 7:51 pm
by racekakje
Glenn wrote: Blijkbaar kwam dit vorig jaar niet aan bod in deze cursus, wat dus zou betekenen dat er informatici kunnen afstuderen die applicaties maken die vatbaar zijn voor SQL Injection.
MIND = BLOWN

Re: [ProjDB] Belangrijk: Beschermen tegen SQL Injection

Posted: Tue Dec 17, 2013 8:51 am
by Joachimvdh
PowerToTheUsers wrote:
Glenn wrote:Een prepared statement is een statement waarvan je op voorhand door je query processor de structuur laat maken. Pas nadat de structuur is aangemaakt, geef je de input-waarden mee aan de query. Hieronder een voorbeeld van een prepared statement in Java en PHP (overgenomen van wikipedia).

Java:

Code: Select all


java.sql.PreparedStatement stmt = connection.prepareStatement(
"SELECT * FROM users WHERE USERNAME = ? AND ROOM = ?");
stmt.setString(1, username);
stmt.setInt(2, roomNumber);
stmt.executeQuery();
als username dan zoiets met " ' DROP TABLE" is, hebt ge toch nog altijd een probleem?
Nee, want die query is op dat moment al uitgevoerd :)

Re: [ProjDB] Belangrijk: Beschermen tegen SQL Injection

Posted: Fri Jan 10, 2014 8:58 am
by slimmy
Johan toch!