Mysql Injectie Bescherming
Code (php)
1
2
2
$gebruikersnaam = mysql_real_escape_string(stripslashes($_POST['user']));
$wachtwoord = mysql_real_escape_string(stripslashes(md5($_POST['password'])));
$wachtwoord = mysql_real_escape_string(stripslashes(md5($_POST['password'])));
Doe ik dit op deze manier goed? Of gaat dit fouten opleveren?
Gewijzigd op 25/05/2010 19:47:34 door Sander de Vos
Het resultaat van md5() is altijd veilig om in een query te stoppen.
stripslashes() is alleen nodig als de PHP instelling "Magic Quotes" aan staat op de server. Maar stripslashes() heb je niet nodig om de waarde veilig te maken om in een query te stoppen dat doet mysql_real_escape_string().
Gewijzigd op 25/05/2010 19:50:48 door Martijn B
Je moet magic quotes uitzetten (want die verneuken je data), dan hoef je ook geen stripslashes. Ook zou ik het niet zo doen, want mysql_real_escape_string voegt dingen als \r enzo toe (geloof ik).
Maar doe ik de "mysql_real_escape_string" en "stripslashes" op deze manier goed?
Edit:
Van "\r" heb ik nog niks gemerkt/gehoord.
Heb net het wachtwoord en de gebruikersnaam even ge-echo-ed maar ik zag geen \r.
Gewijzigd op 25/05/2010 19:53:04 door Sander de Vos
Nee, je moet dus alleen mysql_real_escape string gebruik, en geen stripslashes, al helemaal niet als magic quotes uit staat. En die horen uit te staan.
Bedankt voor de snelle reacties!
Gewijzigd op 25/05/2010 20:22:28 door Sander de Vos
Heb ik vele malen gelezen in berichten van "specialisten"
Correct me if I am wrong.
Klopt. En Sander, je kan voor het wachtwoord de escape weghalen, MD5 is altijd "veilig" om in een database te zetten.
Ja, je doet pas mysql_real_escape_string (of type casten naar int bijv.) als je het in de query stopt.
De nieuwe code:
Code (php)
1
2
3
4
2
3
4
<?php
$gebruikersnaam = mysql_real_escape_string($_POST['user']);
$wachtwoord = md5($_POST['password']);
?>
$gebruikersnaam = mysql_real_escape_string($_POST['user']);
$wachtwoord = md5($_POST['password']);
?>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
$gebruikersnaam = $_POST['user'];
$wachtwoord = md5($_POST['password']);
// check daarna je input nog even of hij bijvoorbeeld niet leeg is met trim..
Selecteren gaat dan:
$sql = "SELECT * FROM users
WHERE user='".mysql_real_escape_string($gebruikersnaam)."'
AND passwoordje='".mysql_real_escape_string($wachtwoord)."'
";
?>
$gebruikersnaam = $_POST['user'];
$wachtwoord = md5($_POST['password']);
// check daarna je input nog even of hij bijvoorbeeld niet leeg is met trim..
Selecteren gaat dan:
$sql = "SELECT * FROM users
WHERE user='".mysql_real_escape_string($gebruikersnaam)."'
AND passwoordje='".mysql_real_escape_string($wachtwoord)."'
";
?>
Marcel:
niet goed, mysql_real_escape_string pas in de query:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
$gebruikersnaam = $_POST['user'];
$wachtwoord = md5($_POST['password']);
// check daarna je input nog even of hij bijvoorbeeld niet leeg is met trim..
Selecteren gaat dan:
$sql = "SELECT * FROM users
WHERE user='".mysql_real_escape_string($gebruikersnaam)."'
AND passwoordje='".mysql_real_escape_string($wachtwoord)."'
";
?>
$gebruikersnaam = $_POST['user'];
$wachtwoord = md5($_POST['password']);
// check daarna je input nog even of hij bijvoorbeeld niet leeg is met trim..
Selecteren gaat dan:
$sql = "SELECT * FROM users
WHERE user='".mysql_real_escape_string($gebruikersnaam)."'
AND passwoordje='".mysql_real_escape_string($wachtwoord)."'
";
?>
Hij is beter bezig dan jou, je kan het beste gewoon $_POST blijven gebruiken tot dat je die variabele hebt opgeschoond. Zie ook dit topic.
de oude Karl is er weer.
Gaat weer gezellig worden hierzo.
Ik zet hierboven toch ookL na de //
Eerst de invoer checken op bijv. leeg ofzo, uiteraard kan je daar nog meer kontroles toevoegen.
Het ging erom waar je die mysql_real_escape_string moest zetten.
Gewijzigd op 25/05/2010 22:12:32 door Marcel K
Marcel:
Yes !
de oude Karl is er weer.
Gaat weer gezelli worden hierzo.
de oude Karl is er weer.
Gaat weer gezelli worden hierzo.
Als je wat tegen me hebt kan je wat mij betreft ergens een topic aanmaken, of tegen iemand via pm's gaan blaten. Maar dit soort posts in iemand anders zijn topic, totaal off topic is toch helemaal onzinnig?
Verder ga ik er niet op door.
Marcel:
Het ging erom waar je die mysql_real_escape_string moest zetten.
Het is een kwestie van smaak waar je mysql_real_escape_string() toepast, maar het is zeker niet verplicht om dat pas in de query te doen. Sterker nog, bij uitgebreide queries wil je dit waarschijnlijk niet in je query doen, maar daarvoor.
Karl maakt hier een goed punt. Werk gewoon door met de $_POST variabele totdat je hem beveiligd hebt voor invoer in de database. Dan pas krijgt de variabele een andere naam zodat jij in je scripts te allen tijde weet dat die variabele veilig is. Van een $_POST variabele weet je namelijk zeker dat hij niet veilig is.
Marcel:
Ik zet hierboven toch ookL na de //
Eerst de invoer checken op bijv. leeg ofzo, uiteraard kan je daar nog meer kontroles toevoegen.
Het ging erom waar je die mysql_real_escape_string moest zetten.
Eerst de invoer checken op bijv. leeg ofzo, uiteraard kan je daar nog meer kontroles toevoegen.
Het ging erom waar je die mysql_real_escape_string moest zetten.
Waarom zou je dat later doen als je het in één keer hoort te doen.
Echt niet logisch:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php // Kleurtjes
$blaat = $_POST['blaat']; // Later gaan we controleren hoor!
// En nu gaan we honderden andere dingen doen
// een functie bouwen
// effe een regex doen
// Goh, laten we eens wat met een database doen
// Moeten we nog controleren?
// Nah, zullen we vast wel hierboven gedaan hebben
mysql_query("SELECT * FROM blabla WHERE blaat='" . $blaat . "'");
?>
edit kut ubb parser
$blaat = $_POST['blaat']; // Later gaan we controleren hoor!
// En nu gaan we honderden andere dingen doen
// een functie bouwen
// effe een regex doen
// Goh, laten we eens wat met een database doen
// Moeten we nog controleren?
// Nah, zullen we vast wel hierboven gedaan hebben
mysql_query("SELECT * FROM blabla WHERE blaat='" . $blaat . "'");
?>
edit kut ubb parser
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
// Login
if (isset($_POST['password'])) {
$gebruikersnaam = mysql_real_escape_string($_POST['user']);
$wachtwoord = md5($_POST['password']);
$query = mysql_query("SELECT * FROM gebruikers WHERE gebruikersnaam = '$gebruikersnaam' AND wachtwoord = '$wachtwoord'");
$count = mysql_num_rows($query);
if ($count == "1"){
setcookie("vCMS", "b3eb46540540e19a7322838729ed212e", time()+3600);
}
}
?>
// Login
if (isset($_POST['password'])) {
$gebruikersnaam = mysql_real_escape_string($_POST['user']);
$wachtwoord = md5($_POST['password']);
$query = mysql_query("SELECT * FROM gebruikers WHERE gebruikersnaam = '$gebruikersnaam' AND wachtwoord = '$wachtwoord'");
$count = mysql_num_rows($query);
if ($count == "1"){
setcookie("vCMS", "b3eb46540540e19a7322838729ed212e", time()+3600);
}
}
?>
edit: tevens zou je eerst nog kunnen controleren of de betreffende $_POST variabelen wel gevuld zijn. Zo niet, dan zou je in een eerder stadium een foutmelding kunnen geven.
Gewijzigd op 25/05/2010 23:05:36 door Joren de Wit
Ze krijgen bij het login form zelf al meldingen of er iets fout is gegaan.
Ook heb ik een demo account zonder wachtwoord, waarbij er ook gewoon een MD5 hoort.
Dus als ik een melding weergeef dat hij leeg is, werkt het demo account niet meer.
Sander:
Snap je reactie, maar zo heb ik het nou eenmaal 'geleerd'.
Maar dat is natuurlijk geen reden om een methode te blijven gebruiken terwijl er nadelen zitten aan de manier die jij geleerd hebt...
Wat betreft de andere redenen die je geeft, dat is duidelijk. Dan maak je dus een bewuste keuze en dat is prima.