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?
$gebruiker = preg_replace('#[^A-Za-z0-9?!\s\.\@]#i', '', $_SESSION["gebruiker"]);
Doormiddel van het filter is er dan nog mogelijkheid om met een script te werken?
Ik hoor het graag van jullie :), alvast bedankt!
Dave
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:
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
29
30
31
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
29
30
31
<?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();
}
is dit veilig genoeg?
Cookie variabele : Apr 15 2013 13:55:00 tlpetrrogotq49ksnh06con1s2
Cookie variabele : veqve824l6faeslig74ogi2te4 Apr 15 2013 13:57:58
Cookie krijgt elke keer een andere nummer? Hoe zit dat dan?
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();
}
is dit veilig genoeg?
Cookie variabele : Apr 15 2013 13:55:00 tlpetrrogotq49ksnh06con1s2
Cookie variabele : veqve824l6faeslig74ogi2te4 Apr 15 2013 13:57:58
Cookie krijgt elke keer een andere nummer? Hoe zit dat dan?
Ik heb geen idee wat je aan het doen bent maar het heeft in ieder geval niks met session hijacking te maken.
Misschien stel ik de verkeerde vraag? Mijn vraag is eigenlijk........is mijn loginpagina op deze manier voldoende beveiligd tegen hackers?
We missen code: hoe vul je $_SESSION?
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
$_SESSION["id"] = $id;
$_SESSION["gebruiker"] = $gebruiker;
$_SESSION["wachtwoord"] = $wachtwoord;
header("location: index.php");
exit();
} else {
echo 'verkeerde informatie <a href="index.php">Click Here</a>';
exit();
}
}
?>
formulier
Ik heb zo'n vermoeden dat je controles op de verkeerde plaats uitvoert.
Ik heb op youtube gezien hoe ze via een tekstbox javascript uploaden, met de preg_replace filter je dit lijkt mij?
En waar komen $id, $gebruiker en $wachtwoord vandaan?
Misschien handig dat ik de hele pagina hier zet met html en al:
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
29
30
31
32
33
34
35
36
37
38
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
29
30
31
32
33
34
35
36
37
38
<?php
ini_set('session.cookie_httponly', true);
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();
}
$_SESSION["id"] = $id;
$_SESSION["gebruiker"] = $gebruiker;
$_SESSION["wachtwoord"] = $wachtwoord;
header("location: index.php");
exit();
} else {
echo 'verkeerde informatie <a href="index.php">Click Here</a>';
exit();
}
}
?>
ini_set('session.cookie_httponly', true);
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();
}
$_SESSION["id"] = $id;
$_SESSION["gebruiker"] = $gebruiker;
$_SESSION["wachtwoord"] = $wachtwoord;
header("location: index.php");
exit();
} else {
echo 'verkeerde informatie <a href="index.php">Click Here</a>';
exit();
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Login voor de manager </title>
<link rel="stylesheet" href="../style/style.css" type="text/css" media="screen" />
</head>
<body>
<div id="wrapper">
<div id="inhoud"><br />
<h2>CADSPECS dfdgNA</h2>
<form id="form1" name="form1" method="post" action="admin_login.php">
<div class="row">
<div class="label">User Name:</div>
<div class="input">
<input name="gebruiker" type="text" id="gebruiker" class="detail" size="40" />
</div><!--einde input-->
</div>
<div class="row">
<div class="label">Password:</div>
<div class="input">
<input name="wachtwoord" type="password" id="wachtwoord" class="detail" size="40" />
</div><!--einde input-->
</div>
<br />
<br />
<br />
<div class="submit">
<input type="submit" name="submit" id="submit" value="Log In" />
</div>
</form>
<p> </p>
</div>
</div>
</body>
</html>
Ward van der Put op 15/04/2013 16:20:40:
Ik heb zo'n vermoeden dat je controles op de verkeerde plaats uitvoert.
Dat idee krijg ik ook steeds meer.
Toevoeging op 15/04/2013 16:24:47:
En nu admin_login.php nog, want daar log je in neem ik aan.
- SanThe - op 15/04/2013 16:23:08:
Dat idee krijg ik ook steeds meer.
Toevoeging op 15/04/2013 16:24:47:
En nu admin_login.php nog, want daar log je in neem ik aan.
Ward van der Put op 15/04/2013 16:20:40:
Ik heb zo'n vermoeden dat je controles op de verkeerde plaats uitvoert.
Dat idee krijg ik ook steeds meer.
Toevoeging op 15/04/2013 16:24:47:
En nu admin_login.php nog, want daar log je in neem ik aan.
Toevoeging op 15/04/2013 16:27:14:
verontschuldiging: dat is de admin_login.php..........misschien bedoel je de index.php?
Dave muller op 15/04/2013 16:26:30:
verontschuldiging: dat is de admin_login.php
Lijkt mij niet.
Want dan zit je volgens mij in een oneindige loop.
Toevoeging op 15/04/2013 16:36:37:
Nog een keer nu de goede pagina!
Code (php)
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
if (isset($_POST["gebruiker"]) && isset($_POST["wachtwoord"])) {
$gebruiker = preg_replace('#[^A-Za-z0-9?!\s\.\@\]#i', '', $_POST["gebruiker"]);
$wachtwoord = preg_replace('#[^sA-Za-z0-9]#i', '', $_POST["wachtwoord"]);
include "verbinding_mysql.php";
$sql = mysql_query("SELECT id FROM admin WHERE gebruiker='$gebruiker' AND wachtwoord='$wachtwoord' LIMIT 1");
$existCount = mysql_num_rows($sql);
if ($existCount == 1) {
while($row = mysql_fetch_array($sql)){
$id = $row["id"];
}
$_SESSION["id"] = $id;
$_SESSION["gebruiker"] = $gebruiker;
$_SESSION["wachtwoord"] = $wachtwoord;
header("location: index.php");
exit();
} else {
echo 'verkeerde informatie <a href="index.php">Click Here</a>';
exit();
}
}
?>
if (isset($_POST["gebruiker"]) && isset($_POST["wachtwoord"])) {
$gebruiker = preg_replace('#[^A-Za-z0-9?!\s\.\@\]#i', '', $_POST["gebruiker"]);
$wachtwoord = preg_replace('#[^sA-Za-z0-9]#i', '', $_POST["wachtwoord"]);
include "verbinding_mysql.php";
$sql = mysql_query("SELECT id FROM admin WHERE gebruiker='$gebruiker' AND wachtwoord='$wachtwoord' LIMIT 1");
$existCount = mysql_num_rows($sql);
if ($existCount == 1) {
while($row = mysql_fetch_array($sql)){
$id = $row["id"];
}
$_SESSION["id"] = $id;
$_SESSION["gebruiker"] = $gebruiker;
$_SESSION["wachtwoord"] = $wachtwoord;
header("location: index.php");
exit();
} else {
echo 'verkeerde informatie <a href="index.php">Click Here</a>';
exit();
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Login voor de manager </title>
<link rel="stylesheet" href="../style/style.css" type="text/css" media="screen" />
</head>
<body>
<div id="wrapper">
<div id="inhoud"><br />
<h2>CADSPECS dfdgNA</h2>
<form id="form1" name="form1" method="post" action="admin_login.php">
<div class="row">
<div class="label">User Name:</div>
<div class="input">
<input name="gebruiker" type="text" id="gebruiker" class="detail" size="40" />
</div><!--einde input-->
</div>
<div class="row">
<div class="label">Password:</div>
<div class="input">
<input name="wachtwoord" type="password" id="wachtwoord" class="detail" size="40" />
</div><!--einde input-->
</div>
<br />
<br />
<br />
<div class="submit">
<input type="submit" name="submit" id="submit" value="Log In" />
</div>
</form>
<p> </p>
</div>
</div>
</body>
</html>
Een wachtwoord moet zo moeilijk mogelijk zijn, maar bij jou mag ie alleen maar uit letters en cijfers bestaan. Dat is dus juist vaak NIET de bedoeling. Een vreemd !@#$%^&*()_-?/|\ wordt vaak juist aanbevolen.
Onlogisch: .. == 1 en dan verder met while().
Geen wachtwoord (en zeker nooit ongecodeerd) in een session of in een cookie.
- SanThe - op 15/04/2013 16:49:50:
De preg_replace() op regel 5 geeft een error.
Ik denk een \ teveel!
Een wachtwoord moet zo moeilijk mogelijk zijn, maar bij jou mag ie alleen maar uit letters en cijfers bestaan. Dat is dus juist vaak NIET de bedoeling. Een vreemd !@#$%^&*()_-?/|\ wordt vaak juist aanbevolen.
Onlogisch: .. == 1 en dan verder met while().
Niet echt een verklaring voor :). Volgens mij de gedachtegang "id moet overeenkomen met 1 rij, dan pak array, anders foutmelding........Mja klinkt mij logisch
Geen wachtwoord (en zeker nooit ongecodeerd) in een session of in een cookie.
Ik denk een \ teveel!
Een wachtwoord moet zo moeilijk mogelijk zijn, maar bij jou mag ie alleen maar uit letters en cijfers bestaan. Dat is dus juist vaak NIET de bedoeling. Een vreemd !@#$%^&*()_-?/|\ wordt vaak juist aanbevolen.
Onlogisch: .. == 1 en dan verder met while().
Niet echt een verklaring voor :). Volgens mij de gedachtegang "id moet overeenkomen met 1 rij, dan pak array, anders foutmelding........Mja klinkt mij logisch
Geen wachtwoord (en zeker nooit ongecodeerd) in een session of in een cookie.
Hahahaha, ik ben ook niet helemaal klaar he ;). Was ff aan het controleren wat de mogelijkheden waren bij "gebruiker", wordt nog veranderd hoor!
BTW hoe kan ik de invoer gelijk aan gegevens database maken? Case sensitive?