IS dit login script veilig ?
Ik ben bezig om een login script te maken, en nu heb ik een pgaina gemaakt die zorgd dat je inlogd. Dit is mijn echte eerste script, dus zien jullie er wat dingen aan die beter kunnen? (vast wel :P ) EN is dit script wel veilig?
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<?php
require_once 'config/config.php';
if(isset($_POST['submit'])) {
$result = "SELECT * FROM `".$tb_leden."` WHERE gebruikersnaam='".$_POST['gebruikersnaam']."'";
$query = mysql_query($result);
$count = mysql_num_rows($query);
if($count != 1) { echo '<tr><td class="reg1" colspan="2">De gebruikersnaam bestaat niet.
<br>Ben je wel lid? Als je dit niet bent klik dan <a href="index.php?p=reg">hier</a></td></tr>';} else {
while ($rij = mysql_fetch_assoc($query)) {
$dbid = htmlspecialchars($rij["id"]);
$dbwachtwoord = htmlspecialchars($rij["wachtwoord"]);
$dbcookiepass = htmlspecialchars($rij["cookie_pass"]);
$dbgebruiksernaam = htmlspecialchars($rij["gebruikersnaam"]);
$dblevel = htmlspecialchars($rij["level"]);
$dbactive = htmlspecialchars($rij["active"]);
$dbstatus = htmlspecialchars($rij["status"]);
$userpass = sha1($_POST['wachtwoord']);
if($dbwachtwoord != $userpass) { echo '<tr><td class="reg1" colspan="2">U wachtwoord is onjuist.
<br>Ben jeje wachtwoord vergeten? Klik dan <a href="index.php?p=pwvergeten">hier</a></td></tr>';}
elseif($dbstatus != 1) { echo '<tr><td class="reg1" colspan="2">Jou account is nog niet actief.
<br>Je kunt je account activeren door op de link te klikken in de email is naar u is gestuurd.</td></tr>';}
if($dbactive != 1) { echo '<tr><td class="reg1" colspan="2">Jou account is geblockeerd.
<br>Als je wildt weten waarom jou account geblokeerd is, neem dan contact op met de <a href="index.php?p=contact">webmaster</a></td></tr>';} else {
$result = "SELECT id FROM `".$tb_ip."` WHERE ip='".$ip."'";
$query = mysql_query($result);
$count = mysql_num_rows($query);
if($count != 0) { echo '<tr><td class="reg1" colspan="2">Je account is geblockeerd.
<br>Als je wildt weten waarom jou account geblokeerd is, neem dan contact op met de <a href="index.php?p=contact">webmaster</a></td></tr>';} else {
$result = "SELECT id FROM `".$tb_ip."` WHERE host='".$host."'";
$query = mysql_query($result);
$count = mysql_num_rows($query);
if($count != 0) { echo '<tr><td class="reg1" colspan="2">Je account is geblockeerd.
<br>Als je wildt weten waarom jou account geblokeerd is, neem dan contact op met de <a href="index.php?p=contact">webmaster</a></td></tr>';}
else {
$_SESSION['user_id'] = ($rij["id"]);
$_SESSION['level'] = ($rij["level"]);
$_SESSION['gebruikersnaam'] = ($rij["gebruikersnaam"]);
if($_POST['cookie'] == "do") {
if($cookiepass == "") {
$cookiecode = mt_srand((double)microtime()*100000);
while(strlen($cookiecode) <= 10) {
$i = chr(mt_rand (0,255));
if(eregi("^[a-z0-9]$", $i)) {
$cookiecode = $cookiecode.$i;
}
}
$result = "UPDATE `".$tb_leden."` SET cookie_pass = '".$cookiecode."' WHERE gebruikersnaam = '".$_POST['gebruikersnaam']."' LIMIT 1";
mysql_query($result);
}
setcookie("user_id", $dbid, time() + 365 * 86400);
setcookie("user_pass", $cookiecode, time() + 365 * 86400);
}
?>
<script language="Javascript" type="text/javascript">
location.href='index.php';
</script>
<?
}
}
}
}
}
}
?>
require_once 'config/config.php';
if(isset($_POST['submit'])) {
$result = "SELECT * FROM `".$tb_leden."` WHERE gebruikersnaam='".$_POST['gebruikersnaam']."'";
$query = mysql_query($result);
$count = mysql_num_rows($query);
if($count != 1) { echo '<tr><td class="reg1" colspan="2">De gebruikersnaam bestaat niet.
<br>Ben je wel lid? Als je dit niet bent klik dan <a href="index.php?p=reg">hier</a></td></tr>';} else {
while ($rij = mysql_fetch_assoc($query)) {
$dbid = htmlspecialchars($rij["id"]);
$dbwachtwoord = htmlspecialchars($rij["wachtwoord"]);
$dbcookiepass = htmlspecialchars($rij["cookie_pass"]);
$dbgebruiksernaam = htmlspecialchars($rij["gebruikersnaam"]);
$dblevel = htmlspecialchars($rij["level"]);
$dbactive = htmlspecialchars($rij["active"]);
$dbstatus = htmlspecialchars($rij["status"]);
$userpass = sha1($_POST['wachtwoord']);
if($dbwachtwoord != $userpass) { echo '<tr><td class="reg1" colspan="2">U wachtwoord is onjuist.
<br>Ben jeje wachtwoord vergeten? Klik dan <a href="index.php?p=pwvergeten">hier</a></td></tr>';}
elseif($dbstatus != 1) { echo '<tr><td class="reg1" colspan="2">Jou account is nog niet actief.
<br>Je kunt je account activeren door op de link te klikken in de email is naar u is gestuurd.</td></tr>';}
if($dbactive != 1) { echo '<tr><td class="reg1" colspan="2">Jou account is geblockeerd.
<br>Als je wildt weten waarom jou account geblokeerd is, neem dan contact op met de <a href="index.php?p=contact">webmaster</a></td></tr>';} else {
$result = "SELECT id FROM `".$tb_ip."` WHERE ip='".$ip."'";
$query = mysql_query($result);
$count = mysql_num_rows($query);
if($count != 0) { echo '<tr><td class="reg1" colspan="2">Je account is geblockeerd.
<br>Als je wildt weten waarom jou account geblokeerd is, neem dan contact op met de <a href="index.php?p=contact">webmaster</a></td></tr>';} else {
$result = "SELECT id FROM `".$tb_ip."` WHERE host='".$host."'";
$query = mysql_query($result);
$count = mysql_num_rows($query);
if($count != 0) { echo '<tr><td class="reg1" colspan="2">Je account is geblockeerd.
<br>Als je wildt weten waarom jou account geblokeerd is, neem dan contact op met de <a href="index.php?p=contact">webmaster</a></td></tr>';}
else {
$_SESSION['user_id'] = ($rij["id"]);
$_SESSION['level'] = ($rij["level"]);
$_SESSION['gebruikersnaam'] = ($rij["gebruikersnaam"]);
if($_POST['cookie'] == "do") {
if($cookiepass == "") {
$cookiecode = mt_srand((double)microtime()*100000);
while(strlen($cookiecode) <= 10) {
$i = chr(mt_rand (0,255));
if(eregi("^[a-z0-9]$", $i)) {
$cookiecode = $cookiecode.$i;
}
}
$result = "UPDATE `".$tb_leden."` SET cookie_pass = '".$cookiecode."' WHERE gebruikersnaam = '".$_POST['gebruikersnaam']."' LIMIT 1";
mysql_query($result);
}
setcookie("user_id", $dbid, time() + 365 * 86400);
setcookie("user_pass", $cookiecode, time() + 365 * 86400);
}
?>
<script language="Javascript" type="text/javascript">
location.href='index.php';
</script>
<?
}
}
}
}
}
}
?>
ten eerste klopt de naamgeving vna je variabelen niet echt..
maar het belangrijkste:
je valideerd de user input niet.
dus is het hardstikke onveilig..
Verder horen er natuurlijk geen backtics ` in je queries, afval hoort in de afvalbak.
$result = "SELECT * FROM `".$tb_leden."` WHERE gebruikersnaam='".$_POST['gebruikersnaam']."'";
En in die post kan ik al SQl injection plegen, dus niet veilig. Waarom ga je pas in de while de specialchars omzetten. Daarnaast is een while niet nodig met 1 result, tenzij er meerdere gebruikers zijn.
Dus ff je $_POST['gebruikersnaam'] htmlspecialcharren.
Voor de rest heb ik niet gekeken.
Code (php)
1
2
3
2
3
<script language="Javascript" type="text/javascript">
location.href='index.php';
</script>
location.href='index.php';
</script>
Op zich niks mis mee, behalve dan dat hier ook een PHP oplossing voor is ;)
alleen javascript gebruiken voor functioneel onbelangrijke dingen.. of dingen die anders niet kunnen..
de gebruiker kan javascript uitzetten, niet alles word door elke browser hetzelfde ondersteund.. etc..
Code (php)
1
2
3
4
2
3
4
<?php
$var = mysql_real_escape_string($_POST['post']);
mysql_query("SELECT * FROM table WHERE naam = '$var'") or die("gegevens van de fout hier");
?>
$var = mysql_real_escape_string($_POST['post']);
mysql_query("SELECT * FROM table WHERE naam = '$var'") or die("gegevens van de fout hier");
?>
maar let wel op: mysql_real_escape_string werkt alleen voor dingen die in mysql query's worden gebruikt!
Header Location wordt door elke browser ondersteund voor zover ik het weet.
Met JavaScript is dit niet altijd het geval.
Edit:
Nadat ik de reactie van jou een paar keer heb overlezen, denk ik dat je het al met me eens was ;)
Nadat ik de reactie van jou een paar keer heb overlezen, denk ik dat je het al met me eens was ;)
Gewijzigd op 01/01/1970 01:00:00 door Andries Louw Wolthuizen
Ik geef de voorkeur aan htmlentities, dat is dacht ik wel een van de veiligste manieren (nog veiliger is een goede regexp, om zo precies de user input te controleren).
zelf doe ik t toch liever helemaal zonder..
Als ik iets met een database ga doen dan beveilig ik het zo:
- Check of het versturen van het formulier wel op jou manier is gedaan dus post is post en get is get.
- Check of de verstuurde invoer geset is.
- Gebruik strip_tags en daarna trim.
- Check of de verstuurde invoer leeg is.
- Gebruik regexp om te kijken of ze wel houden aan je characterlist, dus dat ze geen , of zo gaan gebruiken als je dat niet wilt hebben. Check er ook bij dat ze aan jou gegeven lengtes houden.
- Gebruik mysql_real_escape_string over de invoer, denk eraan eerst de connectie met de database maken.
- Ga nu queries maken, want alles is nu wel beveiligd. Denk eraan hash je wachtwoorden.
Zo dit zou ik doen. Ik hoop dat ik je hiermee goed op de weg heb gezet. Wil je trouwens ook weten waarom ik geen htmlentities etc gebruik, omdat mij is geleerd om alles origineel in de database en als je het eruit haalt zet je het om in htmlcode.
Groeten,
Christian Bolster
Gewijzigd op 01/01/1970 01:00:00 door CB2thephp
Leeg/niet leeg (empty)
In geval van ID ctype_digit
Anders het liefst kijken of het toegestaan is d.m.v. een array en in_array()
Altijd controle op lengte
Altijd htmlentities() eroverheen
Indien een gebruiker een ongeldig input heeft opgegeven, niet prijsgeven dat deze query toch uitgevoerd is (dit kan misbruikt worden door te kijken wat doorgelaten wordt, en wat niet).
Verder check ik al mijn queries op het voorkomen van truncate, drop, delete, alter en meer van dat soort ongein d.m.v. een regexp i.c.m. een eigen db_query()
Voor specifieke pagina's eigen DB users met eigen rechten
(Bericht toevoegen in Gastenboek mag bijv. alleen een insert doen op de gastenboek tabel, en het selecteren gaat ook met een eigen user (welke weliswaar select rechten heeft op de gehele database))
En ik unset alle variabelen aan het begin van een pagina, door middel van een zelf geschreven scriptje (except $_ variabelen).
En nog ben ik bang voor MySQL injection...
Gewijzigd op 01/01/1970 01:00:00 door Andries Louw Wolthuizen
Quote:
Dan ben je blijkbaar de functie mysql_real_escape_string() vergeten. Dat is de basis van de beveiliging, de rest is een extraatje.En nog ben ik bang voor MySQL injection...
Groeten zap
Code (php)
1
2
3
4
5
6
2
3
4
5
6
$pagina = $_GET['p'];
$paginas = array("nieuws","activate","reg","pwvergeten","admin","contact","register","checklogin","forgotpass","uitloggen",
"wijzigprofiel","profiel","login","memberlist","bugs","edit_bugs","plaats_nieuws","content","article","reacties","membercontact");
if(in_array($pagina,$paginas) && file_exists($pagina .".php")){
include($pagina .".php");
$paginas = array("nieuws","activate","reg","pwvergeten","admin","contact","register","checklogin","forgotpass","uitloggen",
"wijzigprofiel","profiel","login","memberlist","bugs","edit_bugs","plaats_nieuws","content","article","reacties","membercontact");
if(in_array($pagina,$paginas) && file_exists($pagina .".php")){
include($pagina .".php");
Die staat op mijn index.php
En dit gebruik ik voor pagina's waarniet iedereen op mag komen:
Is er een manier hoe dit beter kan?
En wat is een goede manier om gegevens uit de DB te halen zonder een "while" ?
Alvast bedankt :)
Groeten zap
Edit:
Wiii 100 posts :P
Wiii 100 posts :P
Gewijzigd op 01/01/1970 01:00:00 door zap
*bump* voor laatste 2 posts...