MySQL injection
Zo ja, hoe kan ik het oplossen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?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.';
}
?>
$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.';
}
?>
Gewijzigd op 01/01/1970 01:00:00 door PHP Newbie
maar dan krijg ik allemaal van die slashes, hoe haal ik die weg bij het uitlezen?
stripslashes
Gewijzigd op 01/01/1970 01:00:00 door - wes -
oke, dus ik moet altijd mysql_real_escape_string() gebruiken en bij het aanroepen van de database altijd stripslashes
Offtopic: Wanneer je $datum = date("r"); niet meer gebruikt, gooi dit dan nog even uit de code. Maakt het overzichtelijker.
Voor zover ik weet zijn de quotes ( " en ' ) het probleem bij mysql injection en dus moet je daar bescherming tegen bieden, iets wat dat eventueel wel doet is:
htmlentities($sText, ENT_QUOTES);
maar mysql_real_escape_string is standaard ingebouwd en bied bescherming, dus waarom deze niet gebruiken? :P
Ik begin het te leren ;-)
gebruikt haalt ie alle gevaarlijke tekens weg: ' en " en dan nog een aantal ma wat nouw als je deze tekens in een topic titel wilt hebben?
Dan is mysql_real_escape_string
niet zo handig dan zou je zoals boaz zij
htmlentities kunnen gebruiken ma nouw weet ik niet of dit 100% garantie geeft tegen sql injection
Zo ik denk wat het beste is wat je zou kunnen doen als je het van bijde niet zeker weet zelf een functie maken die bepaalde karakters wel toelaat en andere weer niet:)
Na das er ook weer uit:)
GR. mebus!
maar strip tags veranderd ' toch in ", dus dan ie toch weg, of klopt dat niet
Ik gebruik momenteel dit:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
public function escapeString($p_sStr){
return mysql_real_escape_string(htmlspecialchars($p_sStr, ENT_QUOTES));
}
?>
public function escapeString($p_sStr){
return mysql_real_escape_string(htmlspecialchars($p_sStr, ENT_QUOTES));
}
?>
zet eerst alle html+quotes om en haalt er vervolgens nog eens mysql_real_escape_string over.
Nadeel is, dat als je html uit je database wil hebben, je alles weer terug om moet zetten (kost tijd), maar omdat ik meestal geen html als output wil beschouw ik dit niet als een probleem.
|| 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!
Na dan weet ik dat ook weer:)
Dankje!
GR. mebus!
|| en OR heeft vervolgens weinig nut want je kan de query niet meer afkappen.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?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"]);
?>
$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:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?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'])));
?>
$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:
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.
Gewijzigd op 01/01/1970 01:00:00 door Bo az
Arjan:
(...)
|| en OR heeft vervolgens weinig nut want je kan de query niet meer afkappen.
|| en OR heeft vervolgens weinig nut want je kan de query niet meer afkappen.
Wat nou als ik mijn query zo opstel:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$query= "SELECT wachtwoord FROM tabel WHERE gebruikersnaam = " .$gebruikersnaam;
?>
$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:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$query = "SELECT wachtwoord FROM tabel WHERE gebruikersnaam = Jan OR 1 = 1";
?>
$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...
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$query = "SELECT wachtwoord FROM tabel WHERE gebruikersnaam = '" .$gebruikersnaam. "'";
?>
$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:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$query = "SELECT wachtwoord FROM tabel WHERE gebruikersnaam = 'Jan OR 1 = 1'";
?>
$query = "SELECT wachtwoord FROM tabel WHERE gebruikersnaam = 'Jan OR 1 = 1'";
?>
Edit: UBB-fix :c)
Gewijzigd op 01/01/1970 01:00:00 door Eric Cartman
In een query zal je bij een string altijd quotes moeten gebruiken anders loopt het weer in de soep bij spaties.
fiets' --> fiets\' in de query, maar in de database komt --> fiets'
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.
Quote:
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...klopt het dat men daarmee dan ook wachtwoorden kan achterhalen
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.
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:
1x raden wat er gebeurd... Alle records in de tabel 'tabelnaam' worden weggegooid!
Gewijzigd op 01/01/1970 01:00:00 door Frank -