Vraag over SQL injection

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Thomas van Broekhoven

Thomas van Broekhoven

07/05/2008 09:58:00
Quote Anchor link
Beste PHPers,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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);
?>


Is deze query te hacken dmv SQl injection?

Alvast bedankt!
Gewijzigd op 01/01/1970 01:00:00 door Thomas van Broekhoven
 
PHP hulp

PHP hulp

25/12/2024 03:32:29
 
Jacco Engel

Jacco Engel

07/05/2008 09:59:00
Quote Anchor link
Ik weet neit hoe maar weet wel DAT het kan :). Verder moet je backticks uit je query halen
 
Thomas van Broekhoven

Thomas van Broekhoven

07/05/2008 10:00:00
Quote Anchor link
Wat bedoel je daar mee dan?
 
Gerben G

Gerben G

07/05/2008 10:04:00
Quote Anchor link
backticks ` horen niet in een query. SQl injection tegengaan doe je d.m.v. mysql_real_escape_string.

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
 
Erwin Nieuwenhuis

Erwin Nieuwenhuis

07/05/2008 10:04:00
Quote Anchor link
dat je backticks moet weghalen: `

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
 
Jesper Diovo

Jesper Diovo

07/05/2008 10:05:00
Quote Anchor link
Variabelen die bezoekerinput ($_POST, $_GET, $_COOKIE [kun je wijzigen], etc.) bevatten moet je nooit vertrouwen. Jij kunt er misschien vertrouwelijk mee omgaan, maar je weet niet wat een bezoeker er mee doet. Je kunt in principe geen enkele bezoeker vertrouwen.

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.
 
Riemer

Riemer

07/05/2008 10:12:00
Quote Anchor link
Gebruik mysql_real_escape_string()

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
 
Thomas van Broekhoven

Thomas van Broekhoven

07/05/2008 10:30:00
Quote Anchor link
Bedankt voor de reacties ik heb bij mijn login nu mysql_real_escape_string()
 
Riemer

Riemer

07/05/2008 10:34:00
Quote Anchor link
Eigenlijk zou je het moeten doen voor alle gegevens die je gebruikt in queries die direct/indirect van de gebruikers komen.
 
Thomas van Broekhoven

Thomas van Broekhoven

07/05/2008 10:56:00
Quote Anchor link
Ja heb je gelijk in. Ben er mee bezig. Maar heb nog best veel queries xD
 
Jesper Diovo

Jesper Diovo

07/05/2008 11:03:00
Quote Anchor link
Of je doet het heel makkelijk. Je definieert de functie mysql_real_escape_array():
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
}

?>


En zet boven iedere pagina:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
if($_GET) {
  $_GET = mysql_real_escape_array($_GET);
}

if($_POST) {
  $_POST = mysql_real_escape_array($_POST);
}

if($_COOKIE) {
  $_COOKIE = mysql_real_escape_array($_COOKIE);
}

?>


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 ;-).
 
Thomas van Broekhoven

Thomas van Broekhoven

07/05/2008 21:47:00
Quote Anchor link
Thanks het werkt idd ;)
 
Danny K

Danny K

07/05/2008 22:02:00
Quote Anchor link
Simpel gezegd: vertrouw gewoon nooit data die ingevoerd is door een gebruiker!
 
Hipska BE

Hipska BE

07/05/2008 22:05:00
Quote Anchor link
Betere manier is om geen variabelen in je query te zetten, maar om te werken met parameters.

Staan tutorials hiervoor op phphulp.
 
Mark PHP

Mark PHP

07/05/2008 22:14:00
Quote Anchor link
Kortere versie van Djemo's methode:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
function mysql_real_escape_array($array) {
  if(is_array($array)) {
    return array_map(__FUNCTION__, $array);
  }

  return mysql_real_escape_string($value);
}

?>
Gewijzigd op 01/01/1970 01:00:00 door Mark PHP
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.