Hoi hoi, ik ben hier nieuw en ben net met PHP begonnen. Nu ben ik een leuke database aan het maken in MySQL en een inlogscherm voor de ecommerce site. Hiervoor maak ik een session aan en nu heb ik wat gelezen over session hijacking.
Nu vroeg ik mezelf af. Kan dat niet worden uitgesloten door alle formulieren op de website te laten filteren met de preg_replace functie?
Nope, dat gaat niet werken. De sessie ID staat in een cookie (meestal PHPSESSID) en het gaat juist om die variabele. Die moet, theoretisch, vast blijven zitten aan de huidige gebruiker. Dus, de combinatie van browser en IP. Maar vergis je niet, want er zijn ook genoeg providers in de wereld die dynamische IP's leveren. Dat betekend dat, in tegenstelling tot de meeste Nederlandse providers, je in één keer een ander IP kan krijgen. Daar moet je dus wel rekening mee houden.
Jouw preg_replace heeft in die zin geen nut. Het gaat hier om een variabele binnen de sessie, en die is (in tegenstelling tot een cookie) niet aan te passen. Tenzij je ergens anders binnen jouw website de mogelijkheid geeft om $_SESSION['gebruiker'] te bewerken, dan zou hier weer een andere waarde in kunnen worden gezet. Maar ook dat valt niet onder session hijacking.
Ik heb de cookies bekeken en ik heb elke keer een andere variabele. Ik gebruik het volgende:
<?php
session_start();
if (!isset($_SESSION["gebruiker"])) {
header("location: admin_login.php");
exit();
}
// Check gebruiker of deze in database is
$gebruikerID = preg_replace('#[^0-9]#i', '', $_SESSION["id"]); // filter
$gebruiker = preg_replace('#[^A-Za-z0-9?!\s\.\@]#i', '', $_SESSION["gebruiker"]); // filter
$wachtwoord = preg_replace('#[^A-Za-z0-9]#i', '', $_SESSION["wachtwoord"]); // filter
// query gebruker en password session var gelijk aan db informatie
// verbinding mysql
include "verbinding_mysql.php";
$sql = mysql_query("SELECT * FROM admin WHERE id='$gebruikerID' AND gebruiker='$gebruiker' AND wachtwoord='$wachtwoord' LIMIT 1"); // query de gebruiker
// ------- kijken of persoon in database is ---------
$existCount = mysql_num_rows($sql); // count row nums
if ($existCount == 0) { // evalueer count
echo "Login niet in database.";
exit();
}
Je zet iets in de session en als je het er weer uithaalt gaat er een preg_match() overheen.
Ik zie daar het nut niet van.
Nooit een password in een COOKIE, SESSION of iets gelijkwaardigs zetten.
Een password hoort, goed beveiligd met sha1() md5() of wat dan ook, alleen in de database