"Maltes login" med saltade lösenord

PHPportalen Forum Index » Tips och Trix
Lägg ett bokmärke på hela tråden
Skapa nytt inlägg   Svara på inlägget Gå till sida 1, 2, 3, 4, 5, 6, 7, 8, 9, 10  Nästa
Visa föregående ämne :: Visa nästa ämne  
Startad av: Meddelande
gothenburg



Medlem i: 4380 dagar
Från: Sverige
Status: Offline



#559872
Inlägg Skrivet: 2008-02-24 17:10      Ämne: "Maltes login" med saltade lösenord Citera

Nu när folk försöker (och lyckas) komma in och få tag på databaserna
så är det bra att kryptera användarnas lösenord.

Detta skript var kodat av malte och jag har endast fixat krypteringen av lösenorden.
Maltes tråd


Tabellstrukturen
KOD:
1:
 
2:
# Struktur för tabell `members`
3:
#
4:
 
5:
CREATE TABLE members (
6:
  id int(11) NOT NULL auto_increment,
7:
  user varchar(30) NOT NULL default '',
8:
  pass varchar(41) NOT NULL default '',
9:
  name varchar(50) NOT NULL default '',
10:
  email varchar(50) NOT NULL default '',
11:
  PRIMARY KEY  (id)
12:
) TYPE=MyISAM;
13:
 



conn.php (databasuppkopplingen)
PHP:
1:
 
2:
<?php
3:
 
4:
// Byt ut mot dina inloggningsuppgifter och databas
5:
$mysql_server "localhost";
6:
$mysql_user "user";
7:
$mysql_password "malte";
8:
$mysql_database "members_area";
9:
 
10:
$conn mysql_connect($mysql_server$mysql_user$mysql_password);
11:
mysql_select_db($mysql_database$conn);
12:
 
13:
 
14:
// En funktion att användas när magic_quotes_gpc inte är satt. För att förhindra SQL-injections, eller i lidrigare fall MySQl-fel.
15:
function db_escape ($post)
16:
{
17:
   if (is_string($post)) {
18:
     if (get_magic_quotes_gpc()) {
19:
        $post stripslashes($post);
20:
     }
21:
     return mysql_real_escape_string($post);
22:
   }
23:
   
24:
   foreach ($post as $key => $val) {
25:
      $post[$key] = db_escape($val);
26:
   }
27:
   
28:
   return $post;
29:
}
30:
 
31:
 
32:
/* 
33:
   Se till att det inte finns några dolda tecken, typ radbyte 
34:
   eller mellanslag, efter den avslutande PHP-taggen !!!
35:
*/ 
36:
?>
37:
 


index.php
PHP:
1:
 
2:
<?php
3:
session_start(); // Alltid överst på sidan
4:
 
5:
include "conn.php"// Databasanslutningen
6:
include "functions.php"// Funktioner
7:
 
8:
// Inloggning
9:
if (isset($_POST['submit'])){
10:
 
11:
  $_POST db_escape($_POST);
12:
 
13:
  $passwd safepass($_POST['passwd']);
14:
  $sql "SELECT id FROM members
15:
         WHERE user='{$_POST['user']}'
16:
         AND pass='$passwd'";
17:
  $result mysql_query($sql);
18:
 
19:
  // Hittades inte användarnamn och lösenord
20:
  // skicka till formulär med felmeddelande
21:
  if (mysql_num_rows($result) == 0){
22:
    header("Location: index.php?badlogin=");
23:
    exit;
24:
  }
25:
 
26:
  // Sätt sessionen med unikt index
27:
  $_SESSION['sess_id'] = mysql_result($result0'id');
28:
  $_SESSION['sess_user'] = $_POST['user'];
29:
  header("Location: welcome.php");
30:
  exit;
31:
}
32:
 
33:
// Utloggning
34:
if (isset($_GET['logout'])){
35:
  session_unset();
36:
  session_destroy();
37:
  header("Location: index.php");
38:
  exit;
39:
}
40:
?>
41:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
42:
<html>
43:
<head>
44:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
45:
<title>Index</title>
46:
</head>
47:
<body>
48:
<?php
49:
 
50:
// Om inte inloggad visa formulär, annars logga ut-länk
51:
if (!isset($_SESSION['sess_user'])){
52:
 
53:
  echo "<h3>Logga in</h3>\n";
54:
 
55:
  // Visa felmeddelande vid felaktig inloggning
56:
  if (isset($_GET['badlogin'])){
57:
    echo "Fel användarnamn eller lösenord!<br>\n";
58:
    echo "Försök igen!\n";
59:
  }
60:
 
61:
?>
62:
<form action="index.php" method="post">
63:
Användarnamn:<br>
64:
<input type="text" name="user"><br>
65:
Lösenord:<br>
66:
<input type="password" name="passwd"><br>
67:
<input type="submit" name="submit" value="Logga in">
68:
</form>
69:
Inte medlem ?<br>
70:
<a href="register.php">Registera dig</a>
71:
<?php
72:
 
73:
} else {
74:
 
75:
  echo "<a href=\"index.php?logout=\">Logga ut</a>\n";
76:
 
77:
}
78:
 
79:
?>
80:
</body>
81:
</html>
82:
 


register.php (för att registrera sig)
PHP:
1:
 
2:
<?php
3:
session_start(); // Alltid överst på sidan
4:
 
5:
include "conn.php"// Databasanslutningen
6:
include "functions.php"// Funktioner
7:
 
8:
if (isset($_POST['submit'])){
9:
 
10:
  $_POST db_escape($_POST);
11:
 
12:
  // Tag bort eventuella blanksteg i början eller slutet
13:
  foreach($_POST as $key => $val){
14:
    $_POST[$key] = trim($val);
15:
  }
16:
 
17:
  //Kolla efter tomma fält
18:
  if (empty($_POST['user']) || empty($_POST['passwd']) ||
19:
      empty($_POST['name']) || empty($_POST['email'])) {
20:
    $reg_error[] = 0;
21:
  }
22:
 
23:
  // Kolla om användarnamnet är upptaget
24:
  $sql "SELECT COUNT(*) FROM members WHERE user='{$_POST['user']}'";
25:
  $result mysql_query($sql);
26:
  if (mysql_result($result0) > 0) {
27:
    $reg_error[] = 1;
28:
  }
29:
 
30:
  // Kolla om e-post kan tänkas vara ok
31:
  if (!preg_match('/^[-A-Za-z0-9_.]+[@][A-Za-z0-9_-]+([.][A-Za-z0-9_-]+)*[.][A-Za-z]{2,6}$/'$_POST['email'])) {
32:
    $reg_error[] = 2;
33:
  }
34:
 
35:
  // Kolla så att lösenorden stämmer överrens
36:
  if ($_POST['passwd'] != $_POST['passwd2']) {
37:
    $reg_error[] = 3;
38:
  }
39:
 
40:
  // Inga fel? Spara och logga in samt skicka till välkomstsida
41:
  if (!isset($reg_error)) {
42:
 
43:
      // Salta lösenordet
44:
    $passwd safepass($_POST['passwd']);
45:
    $sql "INSERT INTO members(user, pass, name, email)
46:
            VALUES('{$_POST['user']}', '$passwd', '{$_POST['name']}', '{$_POST['email']}')";
47:
    mysql_query($sql);
48:
 
49:
    $_SESSION['sess_id'] = mysql_insert_id();
50:
    $_SESSION['sess_user'] = $_POST['user'];
51:
    header("Location: welcome.php");
52:
    exit;
53:
 
54:
  }
55:
 
56:
} else {
57:
 
58:
  // Sätt variabler för tomt formulär
59:
  for ($i=0$i<4$i++) {
60:
    $back[$i] = "";
61:
  }
62:
 
63:
}
64:
 
65:
$error_list[0] = "Alla fält är inte infyllda";
66:
$error_list[1] = "Användarnamnet är upptaget";
67:
$error_list[2] = "Felaktig e-postadress";
68:
$error_list[3] = "Lösenorden stämmer inte överrens";
69:
 
70:
?>
71:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
72:
<html>
73:
<head>
74:
<meta http-equiv="Content-Type"
75:
  content="text/html; charset=iso-8859-1">
76:
<title>Registrera dig</title>
77:
</head>
78:
<body>
79:
<h3>Registrera dig</h3>
80:
<?php
81:
if (isset($reg_error)){
82:
 
83:
  echo "Något blev fel:<br>\n";
84:
  echo "<ul>\n";
85:
  for ($i=0$i<sizeof($reg_error); $i++) {
86:
    echo "<li>{$error_list[$reg_error[$i]]}</li>\n";
87:
  }
88:
  echo "</ul>\n";
89:
 
90:
  $back[0] = stripslashes($_POST['user']);
91:
  $back[2] = stripslashes($_POST['name']);
92:
  $back[3] = stripslashes($_POST['email']);
93:
 
94:
}
95:
?>
96:
<form action="register.php" method="post">
97:
<table cellspacing="3">
98:
 
99:
<tr>
100:
<td>Användarnamn:</td>
101:
<td><input type="text" name="user" value="<?php echo $back[0]; ?>"></td>
102:
</tr>
103:
 
104:
<tr>
105:
<td>Lösenord:</td>
106:
<td><input type="password" name="passwd" value=""></td>
107:
</tr>
108:
 
109:
<tr>
110:
<td>Repetera lösenord:</td>
111:
<td><input type="password" name="passwd2" value=""></td>
112:
</tr>
113:
 
114:
<tr>
115:
<td>Ditt namn:</td>
116:
<td><input type="text" name="name" value="<?php echo $back[2]; ?>"></td>
117:
</tr>
118:
 
119:
<tr>
120:
<td>E-postadress</td>
121:
<td><input type="text" name="email" value="<?php echo $back[3]; ?>"></td>
122:
</tr>
123:
 
124:
<tr>
125:
<td colspan="2" align="center">
126:
  <input type="submit" name="submit" value="Spara dina uppgifter">
127:
</td>
128:
</tr>
129:
 
130:
</table>
131:
</form>
132:
 
133:
</body>
134:
</html>
135:
 


welcome.php (sida man kommer till efter inloggning)
PHP:
1:
 
2:
<?php
3:
session_start(); // Alltid överst på sidan
4:
 
5:
// Kolla om inloggad = sessionen satt
6:
if (!isset($_SESSION['sess_user'])){
7:
  header("Location: index.php");
8:
  exit;
9:
}
10:
 
11:
?>
12:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
13:
<html>
14:
<head>
15:
<meta http-equiv="Content-Type"
16:
  content="text/html; charset=iso-8859-1">
17:
<title>V&auml;lkommen</title>
18:
</head>
19:
<body>
20:
 
21:
V&auml;lkommen <?php echo $_SESSION['sess_user']; ?><br>
22:
<a href="index.php?logout=">Logga ut</a>
23:
 
24:
</body>
25:
</html>
26:
 


functions.php (sidan där saltfunktionen ligger)
PHP:
1:
 
2:
<?php
3:
if(isset($_POST['passwd']))
4:
{
5:
// Sätt variabeln $password till $_POST['passwd']
6:
$password mysql_real_escape_string($_POST['passwd']);
7:
}
8:
 
9:
function safepass($password)
10:
{
11:
    $username strtolower($_POST['user']);
12:
    // Sätt variabeln $username till $_POST['user']
13:
    $username mysql_real_escape_string($username);
14:
 
15:
 
16:
    // Statiskt salt som innehåller
17:
    // krångliga tecken
18:
    $salt "ERSäTT DETTA MED DET STATISKA SALTET";
19:
 
20:
    // Kryptera användarnamn+salt till
21:
    // ett dynamiskt lösenord som är
22:
    // olika för varje användare även
23:
    // om flera har samma lösenord
24:
    $dynSalt sha1($username.$password.$salt);
25:
 
26:
    // Kryptera den dynamiska salten
27:
    // en extra gång med sha1
28:
    return sha1($dynSalt);
29:
 
30:
 
31:
}
32:
?>
33:
 


Krypteringen av lösenorden ändras i funktionen safepass som du hittar i filen functions.php
Du måste ändra texten i variabeln $salt till ditt egna för att få optimal säkerhet.


UPPDATERAD (functions.php fungerar)
UPPDATERAD - 11 Augusti 2008 (Användarnamnet är ej skiftlägeskänsligt längre)
UPPDATERAD - 3 Mars 2009 $password är ej satt i functions.php om $_POST['passwd'] ej finns

Senast ändrad av gothenburg den 2009-03-03 17:28, ändrad totalt 3 gånger
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
Visionmercer



Medlem i: 4150 dagar

Status: Offline



#559875
Inlägg Skrivet: 2008-02-24 17:14      Ämne: Citera

Tack så mycket!
Underbart skript.
Ska testa det senare ikväll.
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Peppe L-G



Medlem i: 4398 dagar
Från: Mullsjö
Status: Offline



#559888
Inlägg Skrivet: 2008-02-24 17:59      Ämne: Citera

Är det inte lite dumt att ha varchar på pass då sha1 alltid returnerar samma längd på hashen? För det gör den väll, eller?
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande MSN Messenger
cort3x



Medlem i: 4530 dagar

Status: Offline



#559895
Inlägg Skrivet: 2008-02-24 18:29      Ämne: Citera

Underbart <3

säkerhet på hög nivå!
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
PSN



Medlem i: 5671 dagar
Från: Norrtälje
Status: Offline



#560417
Inlägg Skrivet: 2008-02-26 21:43      Ämne: Citera

Vet inte om jag gjort nått fel men om jag tex har ove satt som användarnamn i databasen så funkar det att logga in med tex OVE eller Ove etc.

Har lagt till include av functions.php i min index.php samt lagt upp functions.php enl ovan där jag bytt ut saltet mot egna konstiga tecken.

Det som jag däremot inte har är funktionen registrera då det ej skall gå att registrera sig utan jag har ett antal fasta användare. Måste functions användas för registering för att detta skall fungera?
 

_________________
//Per
Livet är oändligt!
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
LarryX



Medlem i: 4341 dagar
Från: Alunda
Status: Offline



#560421
Inlägg Skrivet: 2008-02-26 21:54      Ämne: Citera

PSN skrev:
Vet inte om jag gjort nått fel men om jag tex har ove satt som användarnamn i databasen så funkar det att logga in med tex OVE eller Ove etc.


om du kollar i koden så ser du att den inte jämför användarnamnet nånstans.. när man loggar in så sätter den ju $_SESSION['sess_user'] till $_POST['user']...
 

_________________
Vad är en noob?
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
PSN



Medlem i: 5671 dagar
Från: Norrtälje
Status: Offline



#560433
Inlägg Skrivet: 2008-02-26 22:16      Ämne: Citera

Har ett par frågor kring denna salt-funktion:

1. Jag antar att denna funktion fungerar endast om man har en registering av användare via register.php. Har fn inte denna funktion då vi har ett par fasta användare av admin-delen. Hur löser man detta?
2. Har även en funktion där man kan återfå glömt användarnamn + lösen. Hur funkar detta då med saltningen, skall man på nått sätt få det osaltat då?
3.
LarryX skrev:
PSN skrev:
Vet inte om jag gjort nått fel men om jag tex har ove satt som användarnamn i databasen så funkar det att logga in med tex OVE eller Ove etc.


om du kollar i koden så ser du att den inte jämför användarnamnet nånstans.. när man loggar in så sätter den ju $_SESSION['sess_user'] till $_POST['user']...
Hur löser man detta så att den jämnför (=jämför) satt användar namn?
 

_________________
//Per
Livet är oändligt!
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
gothenburg



Medlem i: 4380 dagar
Från: Sverige
Status: Offline



#560464
Inlägg Skrivet: 2008-02-26 23:05      Ämne: Citera

1. Nej, du kan skriva denna var du vill förutsatt att du inkluderat filen 'functions.php'


PHP:
1:
 
2:
<?php
3:
include("functions.php"); // Inkludera funktionerna
4:
 
5:
$text 'lösenord';
6:
echo safepass($text);
7:
?>
8:
 


2. Det bästa är om du skickar ut ett nytt lösenord som du samtidigt
krypterar och lägger in i databasen.

3. Menar du såhär?

PHP:
1:
 
2:
if($_SESSION['sess_user'] == "admin")
3:
{
4:
echo "Detta skrivs ut om du heter admin";
5:
}
6:
 

PSN skrev:
Har ett par frågor kring denna salt-funktion:

1. Jag antar att denna funktion fungerar endast om man har en registering av användare via register.php. Har fn inte denna funktion då vi har ett par fasta användare av admin-delen. Hur löser man detta?
2. Har även en funktion där man kan återfå glömt användarnamn + lösen. Hur funkar detta då med saltningen, skall man på nått sätt få det osaltat då?
3.
LarryX skrev:
PSN skrev:
Vet inte om jag gjort nått fel men om jag tex har ove satt som användarnamn i databasen så funkar det att logga in med tex OVE eller Ove etc.

 

_________________
Vem får din röst i höst? | Enkelt loginsystem | Enkelt paging-system
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
MrJozk



Medlem i: 4441 dagar
Från: Enköping, Uppland
Status: Offline



#560472
Inlägg Skrivet: 2008-02-26 23:23      Ämne: Citera

LarryX skrev:
PSN skrev:
Vet inte om jag gjort nått fel men om jag tex har ove satt som användarnamn i databasen så funkar det att logga in med tex OVE eller Ove etc.


om du kollar i koden så ser du att den inte jämför användarnamnet nånstans.. när man loggar in så sätter den ju $_SESSION['sess_user'] till $_POST['user']...

Det riktiga svaret är att MySQL-kolumnen inte är case sensitive.
 

_________________
ZmartStart - Kom åt dina bokmärken & favoriter från alla datorer och webbläsare! - Nu bättre än innan!

MySQL är en databashanterare, INTE ett programmeringsspråk!
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Skicka e-post Besök användarens hemsida MSN Messenger
PSN



Medlem i: 5671 dagar
Från: Norrtälje
Status: Offline



#560479
Inlägg Skrivet: 2008-02-26 23:44      Ämne: Citera

MrJozk skrev:
LarryX skrev:
PSN skrev:
Vet inte om jag gjort nått fel men om jag tex har ove satt som användarnamn i databasen så funkar det att logga in med tex OVE eller Ove etc.


om du kollar i koden så ser du att den inte jämför användarnamnet nånstans.. när man loggar in så sätter den ju $_SESSION['sess_user'] till $_POST['user']...

Det riktiga svaret är att MySQL-kolumnen inte är case sensitive.


Hur får jag den att vara case sensitive, är det någon inställning i databasen?

Har provat lite med att lägga till användare med register.php vilket fungerar men när jag skall logga in med samma så får jag hela tiden bad login. Regade test som användarnamn och även test som lösen. Vad är det som felar?

Hittade felet som tycktes vara längden på pass i databasen som var satt till 32 så när jag ändrade till 41 så fungerade det. Dock funkar det att logga in med Test som användarnamn trots att jag har "test" i databasen.

Sen funktionen att återfå sitt lösen, finns det ingen möjlighet att kryptera tillbaks detta istället för att ge ut nytt? Å svaret är nej då jag sökt lite kring detta. Så det blir att ge ut en ny krypterad istället. Nån som har nått färdigt script för att generera nytt lösen som man spar ner i databas samt mailar ut till användare?

En annan skum sak händer är att när jag lägger till en användare med helt skiljt användarnamn och lösen så kan jag logga in med dennas lösenord men med mitt användarnamn och vise versa. Kikade i databasen å där ligger exakt samma krypterade sträng på bägge användarna. Känns inte helt säkert??!!
 

_________________
//Per
Livet är oändligt!
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
MrJozk



Medlem i: 4441 dagar
Från: Enköping, Uppland
Status: Offline



#560516
Inlägg Skrivet: 2008-02-27 08:09      Ämne: Citera

PSN skrev:
Hur får jag den att vara case sensitive, är det någon inställning i databasen?

Precis.

PSN skrev:
Hittade felet som tycktes vara längden på pass i databasen som var satt till 32 så när jag ändrade till 41 så fungerade det. Dock funkar det att logga in med Test som användarnamn trots att jag har "test" i databasen.

Det räcker med 40.
 

_________________
ZmartStart - Kom åt dina bokmärken & favoriter från alla datorer och webbläsare! - Nu bättre än innan!

MySQL är en databashanterare, INTE ett programmeringsspråk!
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Skicka e-post Besök användarens hemsida MSN Messenger
spuun



Medlem i: 5634 dagar
Från: Linköping
Status: Offline



#560523
Inlägg Skrivet: 2008-02-27 09:30      Ämne: Citera

safepass() är väl ändå fel? (vad får du luska ut själv)

Och att ha samma hash till alla lösenord ökar inte någon säkerhet direkt.
 

_________________
:] :] :] *kjamizzar* :] :] :]

Varför inkludera allt i indexfilen?
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
PSN



Medlem i: 5671 dagar
Från: Norrtälje
Status: Offline



#560548
Inlägg Skrivet: 2008-02-27 12:00      Ämne: Citera

MrJozk skrev:
PSN skrev:
Hur får jag den att vara case sensitive, är det någon inställning i databasen?

Precis.


kan någon peka ut var man ställer in detta?
spuun skrev:

safepass() är väl ändå fel? (vad får du luska ut själv)

Och att ha samma hash till alla lösenord ökar inte någon säkerhet direkt.


Hur menar du att safepass() är fel? Det vore bra om man fick olika hash till resp user så hur löser man detta?
 

_________________
//Per
Livet är oändligt!
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
DavidF



Medlem i: 4331 dagar
Från: Nässjö
Status: Offline



#560573
Inlägg Skrivet: 2008-02-27 12:56      Ämne: Citera

PSN skrev:
kan någon peka ut var man ställer in detta?


Det gör du genom collationen: CHARACTER SET latin1 COLLATE latin1_bin;

* http://mysqldatabaseadministration.blogspot.com/2006/09/case-sensitive-mysql.html
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
gothenburg



Medlem i: 4380 dagar
Från: Sverige
Status: Offline



#560629
Inlägg Skrivet: 2008-02-27 16:43      Ämne: Citera

Alltså, den krypterar $salt (statiskt salt) tillsammans med användarnamnet
så alla har olika lösenord i databasen även om de har samma.

PSN skrev:

kan någon peka ut var man ställer in detta?
spuun skrev:

safepass() är väl ändå fel? (vad får du luska ut själv)

Och att ha samma hash till alla lösenord ökar inte någon säkerhet direkt.


Hur menar du att safepass() är fel? Det vore bra om man fick olika hash till resp user så hur löser man detta?
 

_________________
Vem får din röst i höst? | Enkelt loginsystem | Enkelt paging-system
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
Visa tidigare inlägg:   
Skapa nytt inlägg   Svara på inlägget Gå till sida 1, 2, 3, 4, 5, 6, 7, 8, 9, 10  Nästa
PHPportalen Forum Index » Tips och Trix
Hoppa till:  
Du kan inte skapa nya inlägg i det här forumet
Du kan inte svara på inlägg i det här forumet
Du kan inte ändra dina inlägg i det här forumet
Du kan inte ta bort dina inlägg i det här forumet
Du kan inte rösta i det här forumet
Du kan inte bifoga filer i detta forum
Du kan inte ladda ner filer från detta forum
Kontakta oss på adressen: info@phpportalen.net
Webbplatsen bygger i grunden på phpBB © 2001, 2002 phpBB Group

Modifieringar har senare gjorts i systemet av PHPportalen
Sid och logotypdesign skapad av Daren Jularic