Wat kan er beter?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jordi Kroon

Jordi Kroon

12/02/2011 19:52:22
Quote Anchor link
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
78
79
80
81
<?php
session_start();

if($_SERVER['REQUEST_METHOD'] == 'POST') {
     // controle op pass
     $public_key = 'mx9unmcq87NSuiy87hiOHio8hJIO8UH89oh';
     $get_p_key = "SELECT p_key FROM sfi_users WHERE naam = '" . mysql_real_escape_string($_POST['naam']) . "'";
     $get = mysql_query($get_p_key);
      if(!$get) {
      Echo 'er is een error ontstaan tijdens de query : '. mysql_error();
      }

      $fetch = mysql_fetch_assoc($query);
      $password = sha1( $public_key . $_POST['pass'] . $fetch['p_key'] );
      
    
  $select =  "SELECT naam, pass FROM sfi_users WHERE naam ='" . mysql_real_escape_string($_POST['naam']) . "' AND pass = '" . $password . "'";  
  $query = mysql_query($select);
   if(!$query) {
  Echo 'er is een error ontstaan tijdens de query : '. mysql_error();
 }

  $rows = mysql_num_rows($query);
  $fetch = mysql_fetch_assoc($query);
  
  



   if($rows == 0) {
   $error = 'Onjuiste naam en wachtwoord!';

      if(isset($_POST['naam']) || isset($_POST['pass'])) {
       // zet in de logs
        $log = mysql_query("INSERT INTO sfi_logs (naam, pass, datum, ip ) VALUES ('" . mysql_real_escape_string($_POST['naam']) . "', '" . mysql_real_escape_string($_POST['pass']) . "', NOW(), '" . $_SERVER['REMOTE_ADDR'] . "')");
        if(!$log) {
        Echo 'er is een error ontstaan tijdens de query : '. mysql_error();
        }
     }  

    }


    if($rows == 1) {
    $_SESSION['naam'] = $_POST['naam'];
    $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
    }
}


?>



  <div class="home-title">
    <center> Admin panel</center>
  </div>
  <div class='content'>
  
  <?php
  if(isset($_SESSION['naam']) || isset($_SESSION['ip'])) {
  Echo 'Welkom '. $_SESSION['naam'];
  // laat menu zien
  } Else {
  ?>

  
  <br />    <center> <u>
  <?php
  if(isset($error)) {
  Echo $error;
  }

  ?>
</u>
<br /><br />
       <form action='' method='post' >
         <b>Username: </b><input name='naam' type='text' /><br />
         <b>password: </b><input name='pass' type='password' /><br />
                  <input type='submit' value='log in' /><br />
       </form>
      
    </center>
    
    
<?php
}
?>

</div>


Is deze code veilig?
Wat kan er beter?
Het is een adminlogin script wat ik het liefst heel veilig wil hebben
Gewijzigd op 13/02/2011 11:41:46 door Jordi Kroon
 
PHP hulp

PHP hulp

26/04/2024 10:00:13
 
Niels K

Niels K

12/02/2011 20:31:07
Quote Anchor link
Wachtwoord hoeft opzich niet mysql_real_escape_string want je gebruikt toch al een sha1.

Overigens mis ik de 'salt' + 'pepper'.
En uiteraard de foutafhandeling van de query nog even fixen ;)
 
Jordi Kroon

Jordi Kroon

12/02/2011 20:36:49
Quote Anchor link
@niels heb je tutorial voor salt + pepper ? want heb er eigenlijk nog nooit mee gewerkt


Toevoeging op 12/02/2011 20:39:47:

code aangepast en fouthandeling toegevoegd ook de escape van pass afgehaald
 
Niels K

Niels K

12/02/2011 21:16:05
Quote Anchor link
Salt en pepper? daar heb je geen tut voor nodig hoor ;) Is gewoon iets voor het wachtwoord gooien en iets daarna,.. dus bijvoorbeeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$salt
= 'asdfljhasdlfjhwutylbjsadf81746al;sdjkf7856012834'
$pepper = 'a;idjfh;auwehr08754jasdfhp16y23756da;gjnmbnadsjh6p8';

$password = sha1( $salt . $_POST['pass'] . $pepper );
 
Jordi Kroon

Jordi Kroon

12/02/2011 21:39:07
Quote Anchor link
oh ohke ik dacht dat het iets met shuffle enz was met zoiets simpels

Is het veiliger om zegmaar per gebruiker een random salt + pepper aan te maken die in de database te stoppen en ophalen bij het password te zetten?
 
- SanThe -

- SanThe -

12/02/2011 23:48:56
Quote Anchor link
Deze volgorde is niet goed. Eerst ga je $rows ophalen en pas daarna kijk je of de query wel is gelukt.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
  $query
= mysql_query($select);
  $rows = mysql_num_rows($query);

 if(!$query) {
  Echo 'er is een error ontstaan tijdens de query : '. mysql_error();
 }

?>


Ook niet echt de manier lijkt mij.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
     if(empty($_POST['naam']) || empty($_POST['pass'])) {
      // doe niks
?>


Getallen hoeven nog steeds niet tussen quotes te staan.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
if($rows == '0') {
if($rows == '1') {
?>


Wat gebeurt er als $_SESSION['naam'] niet bestaat?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
if(isset($_SESSION['naam']) || isset($_SESSION['ip'])) {
  Echo 'Welkom '. $_SESSION['naam'];
?>


Als er nog niets is gepost zal $error niet bestaan.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
  if($error) {
?>
Gewijzigd op 12/02/2011 23:49:40 door - SanThe -
 
Write Down

Write Down

12/02/2011 23:58:48
Quote Anchor link
Jordi kroon op 12/02/2011 21:39:07:
Is het veiliger om zegmaar per gebruiker een random salt + pepper aan te maken die in de database te stoppen en ophalen bij het password te zetten?


Meestal niet. Want je kan niet echt dynamisch te werk gaan. Wanneer je bijvoorbeeld time() zou gebruiken als $salt, dan gaat dat niet lukken. Want jij gaat in de database iets opslaan wat uniek is, en nooit meer kan worden nagemaakt (tenzij manueel dan, maar dan heb je geen loginscript meer). De enige mogelijkheid is iets te doen met bepaalde gegevens. Bijvoorbeeld sha1(md5($user.md5($user))) Maar goed, dat heeft niet zozeer een meerwaarde, want meestal heb je zoiets al rond je $user staan ;-).
 
Jordi Kroon

Jordi Kroon

13/02/2011 00:06:33
Quote Anchor link
Nooit meerdere hashes in elkaar doen :)

@santhe dat kwam omdat ik die er later in had gedaan ik zal morgen eventjes die puntjes fixen

Als $error niet bestaat weergeefd hij hem ook niet:)
Bij sessie als de sessie niet bestaat weergeeft hij het inlog formulier
 
Dos Moonen

Dos Moonen

13/02/2011 00:28:02
Quote Anchor link
Jordi kroon op 12/02/2011 21:39:07:
Is het veiliger om zegmaar per gebruiker een random salt + pepper aan te maken die in de database te stoppen en ophalen bij het password te zetten?


Ja, al is salt + iteratie (hoe vaak er gehashed moet worden) beter.
Sla dus per user de salt, de iteratie en de uiteindelijke hash op.

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

$key
= 'applicatie bla'; // het zelfde voor de hele applicatie

$iteratie = 1337; // uniek per user, haal op uit database
$salt = 'user bla'; // zie hierboven

$password = $_POST['password'];

do
{
    $password = hash_mhac('sha512', $password.$salt, $key);
}

while(--$iteratie > 0);
?>

Of zoek eens naar Bcrypt
Gewijzigd op 13/02/2011 00:28:23 door Dos Moonen
 
- SanThe -

- SanThe -

13/02/2011 00:36:37
Quote Anchor link
Jordi kroon op 13/02/2011 00:06:33:
Als $error niet bestaat weergeefd hij hem ook niet:)


Maar je krijgt wel een Notice.
 
Jordi Kroon

Jordi Kroon

13/02/2011 10:14:47
Quote Anchor link
Met debuggen krijg je dat wel ja maar als het uit staat werkt alles prima
Hoe kan ik dat dan het beste doen?
 
Dos Moonen

Dos Moonen

13/02/2011 11:11:30
Quote Anchor link
isset($error) gebruiken
 
Jordi Kroon

Jordi Kroon

13/02/2011 11:42:45
Quote Anchor link
Ik heb eventjes de puntjes van santhe aangepast.
En wat dos Moonen zij erin verwerkt
Is er nog iets wat beter kan
 
- SanThe -

- SanThe -

13/02/2011 12:48:02
Quote Anchor link
Regel 12: $query moet $get zijn lijkt mij.
Regel 21 (en verder) wordt uitgevoerd ook als de query mislukt is, en geeft dan dus een error.

- SanThe - op 12/02/2011 23:48:56:
Wat gebeurt er als $_SESSION['naam'] niet bestaat?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
if(isset($_SESSION['naam']) || isset($_SESSION['ip'])) {
  Echo 'Welkom '. $_SESSION['naam'];
?>


Wat gebeurt er als $_SESSION['naam'] niet bestaat en $_SESSION['ip'] bestaat wél? Dan krijg je een Notice.
 
Pim -

Pim -

13/02/2011 13:00:18
Quote Anchor link
Meerdere keren hashen is onzin. Omdat vaak wordt aangeraden met een white-box aan te namen - de gebruikte techniek is bij de aanvaller bekend - verhoogt meerdere keren hashen alleen de kans op een 'botsing'.

Met x als kans op botsing bij 1x hashen en n als hoeveelheid iteraties, wordt de kans
(1-x)^n en dus veel groter bij meerdere hashes.

Als je het heel veilig wil hebben, gebruik dan gewoon sha512 en een lange dynamische salt.
 
Dos Moonen

Dos Moonen

13/02/2011 13:36:07
Quote Anchor link
Pim - op 13/02/2011 13:00:18:
Meerdere keren hashen is onzin. Omdat vaak wordt aangeraden met een white-box aan te namen - de gebruikte techniek is bij de aanvaller bekend - verhoogt meerdere keren hashen alleen de kans op een 'botsing'.


Het leuke van die code die ik plaatste is dat een hash genereren ongeveer 1337 keer langer duurt dat wanneer je het maar 1 keer hashed.
Dus tenzij de aanvallen kan bewijzen (en dit zal hij per unieke user salt en iteratie combinatie opnieuw moeten berekenen) dat het met x < 1337 iteraties je de zelfde output krijgt zal de aanvaller dus ook 1337 keer moeten hashen.
Waardoor bruteforcen ook zo'n 1337 langer gaat duren.

Als er iets mis is met mijn logica hoor ik het graag.
 
Pim -

Pim -

13/02/2011 14:16:54
Quote Anchor link
Het leuke van hashen is dat het voor jou een kleine moeite is, maar voor een aanvaller die moet bruteforcen en hoop gedoe. Bij 1337 keer hashen duurt het echter voor beide partijen 1337 keer langer en dat is voor de server nadelig. Ook verlaag je het aantal gemiddeld benodigde pogingen drastisch, zoals ik in mijn vorige post al zei.
 
Dos Moonen

Dos Moonen

13/02/2011 15:01:01
Quote Anchor link
http://en.wikipedia.org/wiki/Key_strengthening

Maar het is alleen handig met een hoge (ergens in de duizenden) iteratie, met een iteratie van 15 is het inderdaad niet aan te raden.
Gewijzigd op 13/02/2011 16:29:12 door Dos Moonen
 
Pim -

Pim -

13/02/2011 19:25:23
Quote Anchor link
Dit artikel gaat wel over hashes die gebruikt worden als versleutel-sleutels, niet als hash op zich, maar ik weet niet of dat uitmaakt. Wel heb ik echt op veel plekken gelezen dat herhaalde hashing geen goed idee is.
 
Maarten PHP

Maarten PHP

13/02/2011 19:29:33
Quote Anchor link
Ik gebruik dit:
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
<?php
function hashstring($string) {
    $string = strip_tags( mysql_real_escape_string( $string ) );
    $md5 = md5( $string );
    $sha1 = sha1( $string );
    $sha1md5 = sha1( md5( sha1( $sha1 ) ) );
    $letters = array( "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v","w", "x", "y", "z", 0 );
    $substr = substr( str_replace( $letters, null, $sha1md5 ) , 0, 10 );
    $substrend = substr( str_replace( $letters, null, sha1( md5( sha1( $substr ) ) ) ), 0, 10 );
    print $substrend;
}


echo hashstring('Hallo');
?>
 
Jordi Kroon

Jordi Kroon

13/02/2011 19:59:35
Quote Anchor link
nooit meerdere hashes in 1 doen :)
 



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.