Vraag over SQL injection
Ik zou graag mijn DB functie's willen beveiligen tegen SQL-injection. Ik heb al heel wat tutorials gelezen maar snap nog niet echt de manier hoe je het nou het best kan beveiligen. Als voorbeeld heb ik bijvoorbeeld deze query:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$sql3 = "INSERT INTO `blog` (`door_id`, `schrijver`, `berichtklein`, `berichtgroot`, `datum`, `titel`) VALUES ('" . $user_id . "', '". $_SESSION['user']. "', '". $_POST['berichtklein']. "', '". $_POST['berichtgroot']. "', '". $_POST['datum']. "', '". $_POST['titel']. "')";
$sql3;
$verzenden = mysql_query($sql3);
?>
$sql3 = "INSERT INTO `blog` (`door_id`, `schrijver`, `berichtklein`, `berichtgroot`, `datum`, `titel`) VALUES ('" . $user_id . "', '". $_SESSION['user']. "', '". $_POST['berichtklein']. "', '". $_POST['berichtgroot']. "', '". $_POST['datum']. "', '". $_POST['titel']. "')";
$sql3;
$verzenden = mysql_query($sql3);
?>
Is deze query te hacken dmv SQl injection?
Alvast bedankt!
Gewijzigd op 01/01/1970 01:00:00 door Thomas van Broekhoven
Ik weet neit hoe maar weet wel DAT het kan :). Verder moet je backticks uit je query halen
Wat bedoel je daar mee dan?
En uiteraard ga je ook je input controleren voor dat je het in de database gooit.
Gewijzigd op 01/01/1970 01:00:00 door Gerben G
en dat je dat wel kunt hacken, vraag me niet hoe. vraag google :)
mysql_real_escape_string()
Edit:
ik was al te laat... :-(
Gewijzigd op 01/01/1970 01:00:00 door Erwin Nieuwenhuis
Ze kunnen bijvoorbeeld quotes in je query gaan gebruiken (mede door die gebruikerinput) en zo je database naar de knoppen helpen. Hoe en wat precies weet ik ook niet, (gelukkig) nog nooit mee te maken gehad. Ook een direct kwetsbare query kan ik zo niet even voorschotelen, maar je kunt er een boel mee aanrichten, dat weet ik wel.
mysql_real_escape_string() beveiligt quotes d.m.v. backslashes, maar zorgt ervoor dat deze niet zo in de database gezet worden. Daardoor heb je eigenlijk altijd geldige input en output, zonder al die slashes.
Deze 'escaped' karakters die volgens de verbinding karakterset worden gebruikt voor tekens die iets aanduiden (bijv ' om strings van elkaar te onderscheiden).
In feite is de genoemde query gevoelig voor sql injection ja. Alhoewel je geen 2 queries uit kan voeren (via een limiet gesteld via php kant geloof ik), een hacker kan je query syntax verkloten die een waarschuwing levert in php en als je die niet goed afhandeld ligt er misschien gevoelige data op straat.
Verder haal die ` tekens eruit, is niet geweldig netjes te noemen en kan voor rare bugs zorgen.
Edit: Pff, wat ben ik pas laat ;)
Gewijzigd op 01/01/1970 01:00:00 door Riemer
Bedankt voor de reacties ik heb bij mijn login nu mysql_real_escape_string()
Eigenlijk zou je het moeten doen voor alle gegevens die je gebruikt in queries die direct/indirect van de gebruikers komen.
Ja heb je gelijk in. Ben er mee bezig. Maar heb nog best veel queries xD
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
function mysql_real_escape_array($array) {
if(is_array($array)) {
foreach($array as $key => $value) {
if(is_array($value)) {
$array[$key] = mysql_real_escape_array($array);
} else {
$array[$key] = mysql_real_escape_string($value);
}
}
} else {
$array = mysql_real_escape_string($array);
}
return $array;
}
?>
function mysql_real_escape_array($array) {
if(is_array($array)) {
foreach($array as $key => $value) {
if(is_array($value)) {
$array[$key] = mysql_real_escape_array($array);
} else {
$array[$key] = mysql_real_escape_string($value);
}
}
} else {
$array = mysql_real_escape_string($array);
}
return $array;
}
?>
En zet boven iedere pagina:
Code (php)
Zo kun je gewoon $_POST en $_GET in je queries gebruiken, maar worden ze toch 'veilig gemaakt'. Het zorgt ook voor niet al te veel omzet werk ;-).
Thanks het werkt idd ;)
Simpel gezegd: vertrouw gewoon nooit data die ingevoerd is door een gebruiker!
Staan tutorials hiervoor op phphulp.