php security check

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Wouter reyntjens

wouter reyntjens

28/03/2007 22:31:00
Quote Anchor link
Zouden jullie deze code eens kunnen checken op beveiligingsfouten?

bedankt

add_user.php
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
70
71
72
73
74
75
76
77
<?php
    
    if ($_SERVER['REQUEST_METHOD']=='POST'){

    require_once('../connect.php');
    dbconnect();
    $username = $_POST['username'];
    $password = sha1($_POST['password']);
    $password2 = sha1($_POST['password2']);
    $level = $_POST['level'];
    
    
    if(!empty($username)){
        
        if(!empty($password)){
            
            if($password != $password2){
                echo 'De paswoorden komen niet overeen';
            
            }
else{
                $sql = mysql_query("INSERT INTO login (username,password,level) VALUES('".$username."','".$password."','".$level."') ")
                or die(mysql_error());
                
                echo $username.' is aangemaakt.';
            }
        
        }
else{
        echo 'Gelieve een paswoord in te vullen';
        
        }
    
    }
else{
        echo'Gelieve een username in te vullen';
    
    }
}



    

?>

<!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=ISO-8859-1" />
<title>Untitled Document</title>
</head>

<body>
    <form method="post" action="add_user.php">
    <table border="1">
        <tr>
            <td>Username:</td>
            <td><input type="text" name="username" /></td>
        </tr>
        <tr>
            <td>Password:</td>
            <td><input type="password" name="password" /></td>
        </tr>
        <tr>
            <td>Confirm Password:</td>
            <td><input type="password" name="password2" /></td>
        </tr>
        <tr>
            <td>Level:</td>
            <td><select name="level">
                    <option value="admin">Administrator</option>
                    <option value="user">Gebruiker</option>
                </select></td>
        </tr>
        <tr>
            <td colspan="2"><input type="submit" name="knop" value="Versturen" /> </td>
        </tr>
    </table>
    </form>
</body>
</html>

login.php
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
<?php

    
    if ($_SERVER['REQUEST_METHOD']=='POST'){

    require_once('../connect.php');
    dbconnect();
    $username = mysql_escape_string($_POST['username']);
    $password = sha1($_POST['password']);
    
    $sql = "SELECT username,level,status FROM login WHERE username = '".$username."' AND password = '".$password."'";
    $result = mysql_query($sql);
    
    if(mysql_num_rows($result) <1){
        /* Login mislukt */
        echo "Gelieve uw gebruikersnaam en uw paswoord te controleren.<br/>";
        
    }
else{
        /*login gelukt*/
        echo "U bent succesvol ingelogd.<br/>";
        $row = mysql_fetch_object($result);
        $status = htmlspecialchars($row->status);
        $level = htmlspecialchars($row->level);
        $_SESSION['user'] = $username;
        $_SESSION['user_status'] = $status;
        $_SESSION['level'] = $level;
        
        if($_SESSION['user_status'] >0){
            header('Location:user_list.php');
            echo 'ok';
        }
else{
            echo "Er is een probleem met uw status, gelieve de verantwoordelijke te contacteren.<br/>";
        }
    }
}

?>

<!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=ISO-8859-1" />
<title>Untitled Document</title>
</head>

<body>
    <form method="post" action="login.php">
    <table border="1">
        <tr>
            <td>Username:</td>
            <td><input type="text" name="username" /></td>
        </tr>
        <tr>
            <td>Password:</td>
            <td><input type="password" name="password" /> </td>
        </tr>
        <tr>
            <td colspan="2"><input type="submit" name="knop" value="Versturen" /> </td>
        </tr>
    </table>
    </form>
</body>
</html>

connect.php
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
<?php

    session_start();
    ob_start();
/**
 * $cfg is een array waarin je alle instellingen voor je php scripts opslaat.
 */

$cfg = array();
$cfg['dbHost'] = "localhost";
$cfg['dbUser'] = "user";
$cfg['dbPass'] = "***";
$cfg['dbName'] = "db";

function
dbConnect() {

      global $cfg;
      
      $conn = mysql_connect( $cfg['dbHost'], $cfg['dbUser'], $cfg['dbPass'] ) or trigger_error( "Database verbinding kon niet worden gecreerd.", E_USER_WARNING );
    mysql_select_db( $cfg['dbName'], $conn ) or trigger_error( "Database niet gevonden!", E_USER_WARNING );
    
    return $conn;
}

?>

safe.php (bestand om te checken of je wel bent ingelogt)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php

require_once('../connect.php');
dbconnect();

if(isset($_SESSION['user'])) {
    $query = mysql_query("UPDATE login SET lastactive = NOW(),ip = '".$_SERVER['REMOTE_ADDR']."' WHERE username = '".$_SESSION['user']."'");
    }
else{
    header('Location:login.php');
}

?>
 
PHP hulp

PHP hulp

17/11/2024 04:01:01
 
Eris -

Eris -

28/03/2007 22:46:00
Quote Anchor link
$row = mysql_fetch_object($result);
$status = htmlspecialchars($row->status);
$level = htmlspecialchars($row->level);


Dit is tragen. Test van Jan Koehoorn hebben bewezen dan mysql_fetch|_assoc sneler is

Daarna is het het een array en dat werkt makkelijker


Maar opzich is het veilig..

De beste manier om te testen is gewoon proberen te hacken


Voor de rest alle vars als $username enz gewoon niet gebruiken maar gewoon in de var laten staan werkt makkelijker...
 
Wouter reyntjens

wouter reyntjens

28/03/2007 22:57:00
Quote Anchor link
Eris, zou je nog wat meer info willen geven? Ik ben nog maar een n00b op het vlak van php, vandaar
Gewijzigd op 01/01/1970 01:00:00 door wouter reyntjens
 
Frank -

Frank -

28/03/2007 23:53:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?
$username
= $_POST['username'];
$a = $username;
$b = $a;
$c = $b;
$d = $c;
// etc. etc.
?>

Het aanmaken van een kopie is volkomen zinloos, kost extra geheugen, levert niks op behalve kansen op veiligheidslekken.

In bovenstaand voorbeeld heeft $d exact dezelfde inhoud als $_POST['username']. Waarom zou je dan alle kopieen aanmaken? Bespaar jezelf deze onzin en doe iets nuttigs met $_POST['username'].

Echter
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?
$username
= mysql_real_escape_string($_POST['username']);
?>

is heel wat anders! $username is een string die veilig in een query is te gebruiken, dat in grote tegenstelling met $_POST['username']. Deze is namelijk onbruikbaar in een query, is namelijk voor geen cent te vertrouwen.
 
Jan geen

Jan geen

29/03/2007 00:10:00
Quote Anchor link
wat is het verschil dan tussen:
UPDATE tabel SET kolom1 = '".mysql_real_escape_string($_POST['username'])."'

en:

$username = mysql_real_escape_string($_POST['username']);
UDPATE tabel SET kolom1 = '".$username."' ";

of heb je het hier alleen over de duidelijkheid?
 
Jurgen assaasas

Jurgen assaasas

29/03/2007 00:21:00
Quote Anchor link
voer maar een een username in met iets met een ' erin of een "; dan krijg je wss meteen fouten.
 
Frank -

Frank -

29/03/2007 00:47:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?
$username
= mysql_real_escape_string($_POST['username']);

$query = "UDPATE tabel SET kolom1 = '".$username."' ";
?>

Deze is beter te onderhouden. En wanneer je een hele waslijst met $_POST-variabelen hebt beveiligd door tig-keer de functie mysql_real_escape() uit te schrijven, dan ga je snel genoeg bedenken dat dit slimmer kan. Een goede programmeur is namelijk lui.

Tip: Gebruik PHP versie 5 en kijk dan eens naar PDO. Hoef je zelf nauwelijks meer wat te doen, veiligheid is gegarandeerd en je kunt vrij simpel van de ene database overstappen op de andere. Misschien moet je hier en daar de SQL een beetje aanpassen, maar dat is het wel. Geen geklooi met specifieke php-database-functies. En daar valt mysql_real_escape_string() ook onder, heb je geen drol aan wanneer je PostgreSQL, Firebird of Oracle gaat gebruiken.
 



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.