Is dit script vatbaar voor mysql injection?

Zo ja, hoe kan ik het oplossen:

<?php
$email = strip_tags($_POST["email"]);
$naam = strip_tags($_POST["naam"]);
$onderwerp = strip_tags($_POST["onderwerp"]);
$bericht = strip_tags($_POST["bericht"]);
$datum = date("r");

$insert = "INSERT INTO
gastenboek(
onderwerp,
datum,
naam,
email,
bericht)
VALUES (
'".$onderwerp."',
NOW(),
'".$naam."',
'".$email."',
'".$bericht."')";

$voerin = mysql_query($insert);

if(mysql_errno() == 1062)
{
$melding2 = 'Precies ditzelfde bericht is al eerder gepost, dit kan geen toeval zijn.';
}
?>
en deze tekens dan:

|| ook wel OR

Dan ken je nog steeds user 1 tot en met oneindig tonen

Als ie dan in een while lus staat natuurlijk

GR. mebus!
o oké dommu dommu ik dan toch:p

Na dan weet ik dat ook weer:)

Dankje!

GR. mebus!
Striptags haalt niks weg, het zorgt er alleen voor dat gevaarlijke tekens geescaped (\) worden.

|| en OR heeft vervolgens weinig nut want je kan de query niet meer afkappen.
Databas in:

<?php
$email = mysql_real_escape_string($_POST["email"]);
$naam = mysql_real_escape_string($_POST["naam"]);
$onderwerp = mysql_real_escape_string($_POST["onderwerp"]);
$bericht = mysql_real_escape_string($_POST["bericht"]);
?>

database uit:

<?php
$row['onderwerp'] = stripslashes(htmlentities(strip_tags($row['onderwerp'])));
$row['naam'] = stripslashes(htmlentities(strip_tags($row['naam'])));
$row['datum'] = stripslashes(htmlentities(strip_tags($row['datum'])));
$row['email'] = stripslashes(htmlentities(strip_tags($row['email'])));
$row['onderwerp'] = stripslashes(htmlentities(strip_tags($row['onderwerp'])));
?>

Goed of fout?
Arjan Kapteijn schreef op 18.08.2006 16:09
Striptags haalt niks weg, het zorgt er alleen voor dat gevaarlijke tekens geescaped () worden.


Dat is toch niet waar? striptags stipt toch gewoon html en php tags?

jij bedoeld mysql_real_escape_string ?

Edit:
@PHP newbie ik zou die strip_tags weglaten, htmlentities() lijkt me voldoende.
Arjan Kapteijn schreef op 18.08.2006 16:09
(...)

|| en OR heeft vervolgens weinig nut want je kan de query niet meer afkappen.


Wat nou als ik mijn query zo opstel:

<?php

$query= "SELECT wachtwoord FROM tabel WHERE gebruikersnaam = " .$gebruikersnaam;

?>


en er voor '$gebruikersnaam' is ingevuld 'Jan OR 1 = 1' (zonder de enkele quotes)? Dan kun je dat lezen als:

<?php

$query = "SELECT wachtwoord FROM tabel WHERE gebruikersnaam = Jan OR 1 = 1";

?>


Het gevolg is, dat alle wachtwoorden worden geselecteerd. . .

Daarom moet je eigenlijk in je query altijd quotes gebruiken. Zelfs bij integers...

<?php

$query = "SELECT wachtwoord FROM tabel WHERE gebruikersnaam = '" .$gebruikersnaam. "'";

?>


Als er nu 'Jan OR 1 = 1' is ingevuld voor '$gebruikersnaam', zal er (waarschijnlijk) een fout worden weergeven:

<?php

$query = "SELECT wachtwoord FROM tabel WHERE gebruikersnaam = 'Jan OR 1 = 1'";

?>


Edit: UBB-fix :c)
bij een integer moet je gewoon altijd controleren in PHP of het wel een integer is.

In een query zal je bij een string altijd quotes moeten gebruiken anders loopt het weer in de soep bij spaties.
mysql_real_escape_string vereist geen stripslashes bij het uitlezen!

fiets' --> fiets\' in de query, maar in de database komt --> fiets'
Maar WAT is MySQL injection nu precies.

Klopt het dat daarmee mijn hele database leeg gegooit kan worden, en klopt het dat men daarmee dan ook wachtwoorden kan achterhalen.

En HOE gebeurd dit dan.
klopt het dat men daarmee dan ook wachtwoorden kan achterhalen
Wanneer jij md5 of sha1 gebruikt (met een salt) dan is dit vrijwel onmogelijk. Doe je dat niet, dan ben je stom bezig en moet je niet zeuren dat de boel gejat is...

SQL-injection betekent dat er stukken SQL in jouw database worden geinjecteerd die er niet thuis horen. Het wordt dus door de gebruiker in de query gezet en niet door de programmeur.


DELETE FROM tabelnaam WHERE id = $_POST['id'];

Jij verwacht dat $_POST['id'] bv. de waarde 23 heeft, maar wat als een grappenmaker daar van maakt:
23 or id > 0
De query die naar de database wordt gestuurd, komt er dan alsvolgt uit te zien:

DELETE FROM tabelnaam WHERE id = 23 or id > 0;

1x raden wat er gebeurd... Alle records in de tabel 'tabelnaam' worden weggegooid!

Reageren