IS dit login script veilig ?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Zap

zap

17/11/2006 08:53:00
Quote Anchor link
Hallo,
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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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>
                                                <?
                                                
                                        }
                                    }
                                }
                            }
                        }
                    }
    
?>
                        
 
PHP hulp

PHP hulp

20/04/2024 01:58:25
 
CrawlBackwards

CrawlBackwards

17/11/2006 21:15:00
Quote Anchor link
ik heb het niet helemaal gelezen.. alleen tot de eerste query..
ten eerste klopt de naamgeving vna je variabelen niet echt..
maar het belangrijkste:
je valideerd de user input niet.
dus is het hardstikke onveilig..
 
Frank -

Frank -

17/11/2006 21:24:00
Quote Anchor link
Waarom doe je de vergelijkingen niet in de query? Dat is veel sneller dan eerst alle data ophalen en dan alsnog de vergelijking doen in een stuk php-code.

Verder horen er natuurlijk geen backtics ` in je queries, afval hoort in de afvalbak.
 
Kalle P

Kalle P

17/11/2006 22:52:00
Quote Anchor link
Je gebruikt overal htmlspecialchars, behalve hier:
$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.
 
Andries Louw Wolthuizen

Andries Louw Wolthuizen

17/11/2006 23:08:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<script language="Javascript" type="text/javascript">
location.href='index.php';
</script>


Op zich niks mis mee, behalve dan dat hier ook een PHP oplossing voor is ;)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
header("Location: index.php");
?>
 
CrawlBackwards

CrawlBackwards

17/11/2006 23:28:00
Quote Anchor link
aanvulling op andries:
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..
 
Leroy Boerefijn

Leroy Boerefijn

17/11/2006 23:36:00
Quote Anchor link
je kan denk ik beter ook mysql_real_escape_string gebruiken bijv
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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");
?>

maar let wel op: mysql_real_escape_string werkt alleen voor dingen die in mysql query's worden gebruikt!
 
Andries Louw Wolthuizen

Andries Louw Wolthuizen

17/11/2006 23:37:00
Quote Anchor link
Ok, daar ben ik het mee eens, echter denk ik dat het wel van belang is dat de gebruiker wordt doorgestuurd. Anders krijgen ze een mooie witte pagina.

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 ;)
Gewijzigd op 01/01/1970 01:00:00 door Andries Louw Wolthuizen
 
Andries Louw Wolthuizen

Andries Louw Wolthuizen

17/11/2006 23:41:00
Quote Anchor link
@leroy:
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).
 
CrawlBackwards

CrawlBackwards

17/11/2006 23:46:00
Quote Anchor link
je kan natuurlijk altijd een mooi klein divje in jdie witte pagina laden met een link er in.. en een meta refresh naar de volgende pagina..
zelf doe ik t toch liever helemaal zonder..
 
CB2thephp

CB2thephp

17/11/2006 23:56:00
Quote Anchor link
Tip:

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
 
Andries Louw Wolthuizen

Andries Louw Wolthuizen

18/11/2006 00:09:00
Quote Anchor link
Ik controleer op:

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
 
Frank -

Frank -

18/11/2006 01:30:00
Quote Anchor link
Quote:
En nog ben ik bang voor MySQL injection...
Dan ben je blijkbaar de functie mysql_real_escape_string() vergeten. Dat is de basis van de beveiliging, de rest is een extraatje.
 
Zap

zap

18/11/2006 10:26:00
Quote Anchor link
Bedankt allemaal, hier heb ik veel aan. Ik heb ook een regestration script gemaakt, maaar die is en nog grotere puinhoop. Dus ik zal eerst beide verder beveiligen.
Groeten zap
 
Zap

zap

18/11/2006 10:34:00
Quote Anchor link
Ik heb nog een paar dingen waar ik nog zeker van ben of ze veilig zijn, deze bijv:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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");


Die staat op mijn index.php

En dit gebruik ik voor pagina's waarniet iedereen op mag komen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
if(isset($_SESSION['level']) AND $_SESSION['level'] >= 8) {


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
Gewijzigd op 01/01/1970 01:00:00 door zap
 
Zap

zap

20/11/2006 23:10:00
Quote Anchor link
*bump* voor laatste 2 posts...
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.