PDO Login baserad på "Maltes Login"

PHPportalen Forum Index » Tips och Trix
Lägg ett bokmärke på hela tråden
Skapa nytt inlägg   Svara på inlägget
Visa föregående ämne :: Visa nästa ämne  
Startad av: Meddelande
tsarraz



Medlem i: 2430 dagar

Status: Offline



#735260
Inlägg Skrivet: 2013-12-16 11:35      Ämne: PDO Login baserad på "Maltes Login" Citera

Hej.

Har byggt om denna enkla och lättförståeliga inloggning till PDO

Alla eventuella förbättringar och liknade tas gärna emot.

Första skapa en databas, jag kör mysql
Skapa filerna
conn.php
functions.php
index.php
register.php
welcome.php

conn.php
PHP:
1:
 
2:
//Dina data du fick då skapade databsen
3:
$db_host "";
4:
$db_username "";
5:
$db_pass "";
6:
$db_name "";
7:
 
8:
//Gör din databas UTF-8 så den klarar Å Ä Ö
9:
$options  = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'");
10:
 
11:
//Skapa kopplingen till databasen
12:
$db = new PDO('mysql:host='.$db_host.';dbname='.$db_name,$db_username,$db_pass$options);
13:
 


//Skapa tabellen i databsen
KOD:
1:
CREATE TABLE members (
2:
  id int(11) NOT NULL auto_increment,
3:
  user varchar(30) NOT NULL default '',
4:
  pass varchar(41) NOT NULL default '',
5:
  name varchar(50) NOT NULL default '',
6:
  email varchar(50) NOT NULL default '',
7:
  PRIMARY KEY  (id)
8:
) TYPE=MyISAM;


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


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


welcome.php
//Sidan som syns då man är inloggad
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:
include('conn.php');
11:
$user $_SESSION['sess_id']; 
12:
 
13:
$sql "SELECT name FROM members
14:
         WHERE id='$user'";
15:
         
16:
$sth $db->prepare($sql);
17:
$sth->execute();
18:
$user $sth->fetchColumn(0);
19:
         
20:
 
21:
?>
22:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
23:
<html>
24:
<head>
25:
<meta http-equiv="Content-Type"
26:
  content="text/html; charset=utf-8">
27:
<title>Välkommen</title>
28:
</head>
29:
<body>
30:
 
31:
Välkommen <?php echo "<br>Ditt namn är " htmlspecialchars($user) ."<br> Ditt användarnamn är "htmlspecialchars($_SESSION['sess_user']);
32:
 
33:
 ?><br>
34:
<a href="index.php?logout=">Logga ut</a>
35:
 
36:
</body>
37:
</html>
38:
 

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


Testa gärna sidan på min sida http://www.sthml.se där jag lagt upp en testversion av sidan.

Senast ändrad av tsarraz den 2014-06-24 20:59, ändrad totalt 8 gånger
 

_________________
<marquee>Is the shit$e
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
harald_b
Moderator



Medlem i: 4598 dagar
Från: Tavesta
Status: Offline



#735263
Inlägg Skrivet: 2013-12-16 14:02      Ämne: Citera

Jag hittade en del föråldrade saker som fortfarande hänger kvar.

register.php

rad 12:
Det är inte så lyckat att köra trim() på alla variabler i $_POST
På user, name och email kan det kanske vara bra, men definitivt inte på passwd.
rad 23:
Här används preparerade databasfrågor på fel sätt. Den här koden är vidöppen för sql-injection.
rad 98-100:
stripslashes bör tas bort.
rad 109, 124, 129:
Här borde du använda htmlspecialchars på datat.

welcome.php

rad 31:
Här borde du också använda htmlspecialchars, både på $user och $_SESSION['sess_user'].

functions.php

rad 6, 13:
Här ligger gammal mysql_real_escape_string() kvar.
rad 11:
strtolower är inte utf-8-kompatibel. Men borde den köras över huvud taget?
rad 32:
att använda ?> och slå på direktutmatningsläget är en helt onödig risk.
 

_________________
R.r - Ett fritt affärssystem
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
hansandersson



Medlem i: 2163 dagar
Från: Göteborg
Status: Offline



#735265
Inlägg Skrivet: 2013-12-16 14:22      Ämne: Citera

Citat:
att använda ?> och slå på direktutmatningsläget är en helt onödig risk.


Har du lust att utveckla detta? Många andra risker har jag hört talas om, men detta var helt nytt.
 

_________________
Om "Cologne" är engelska för "Köln", innebär det då att "Böln" är tyska för "Bologna"?
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Skicka e-post Besök användarens hemsida
harald_b
Moderator



Medlem i: 4598 dagar
Från: Tavesta
Status: Offline



#735266
Inlägg Skrivet: 2013-12-16 14:33      Ämne: Citera

Om det finns några spacetecken eller radbrytningar (utom den som enventuellt kommer direkt efter) efter ?> så kommer dessa skickas till webbläsaren.
Det kan i många fall få webbsidan att inte fungera.
 

_________________
R.r - Ett fritt affärssystem
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
tsarraz



Medlem i: 2430 dagar

Status: Offline



#735268
Inlägg Skrivet: 2013-12-16 15:00      Ämne: Citera

Tackar skall rätta till detta.
Nu är det flesta fixade, Stort tack Harald.
Tycker du man skall göra så användarnamnet måste skrivas med stora eller små bokstäver.
Det är ju där det kommer ifrån.

Den trimmar alla just nu ifall man vill lägga till fler parametrar. Tror du många har lösenord med mellanslag i början?
 

_________________
<marquee>Is the shit$e
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
harald_b
Moderator



Medlem i: 4598 dagar
Från: Tavesta
Status: Offline



#735286
Inlägg Skrivet: 2013-12-17 01:10      Ämne: Citera

På rad 12 i functions.php ser det fortfarande inte helt rätt ut.

För egen del är jag en varm anhängare av att man bör eftersträva skiftlägeskänsliga lösningar (stora och små bokstäver räknas som olika skrivtecken). Det ger fler möjligheter för användaren, och färre buggar. Men jag har respekt för att man kan ha olika åsikt i den frågan.

Att ha mellanslag i början eller slutet av ett lösenord är inte en så dum sak.
Om någon tittar över axeln är det förhållandevis svårt att se när man klämmer ner ett mellanslag.
Om man råkar skriva in lösenordet någonstans där det syns blir det inte nödvändigtvis helt avslöjat i alla fall.
Jag har ingen aning om det är vanligt med sådana mellanslag, men ju fler udda och långsökta trix folk har för sig med sina lösenord, desto bättre.
 

_________________
R.r - Ett fritt affärssystem
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
simius



Medlem i: 4575 dagar
Från: Skåne
Status: Offline



#735294
Inlägg Skrivet: 2013-12-17 08:51      Ämne: Citera

Använd en slöare hash-algoritm än sha1, kolla password_hash med bcrypt algoritmen, den är slö och härlig! Smile
 

_________________
Lägger jag en bild här igen blir jag avstängd.
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida MSN Messenger
tsarraz



Medlem i: 2430 dagar

Status: Offline



#735295
Inlägg Skrivet: 2013-12-17 08:57      Ämne: Citera

Kan byta till bcrypt men min server kör fortfarande php 5.4 så jag lever kvar med egensaltad för ett tag
 

_________________
<marquee>Is the shit$e
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
grejvonklas



Medlem i: 3711 dagar

Status: Offline



#735297
Inlägg Skrivet: 2013-12-17 09:45      Ämne: Citera

https://github.com/ircmaxell/password_compat
Gör så du kan använda password_* innan 5.5, har testat och fungerar alldeles utmärkt.
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
puresome



Medlem i: 5184 dagar
Från: Göteborg
Status: Offline



#736841
Inlägg Skrivet: 2014-04-29 08:31      Ämne: Citera

Den lagrar namn och användarnamn som samma. Va det meningen?
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
tsarraz



Medlem i: 2430 dagar

Status: Offline



#737324
Inlägg Skrivet: 2014-06-24 21:00      Ämne: Citera

Nej inte riktigt kanske.
Slarvfelet ändrat, tack för uppmärksamheten
 

_________________
<marquee>Is the shit$e
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Timi



Medlem i: 3817 dagar

Status: Offline



#737392
Inlägg Skrivet: 2014-07-12 04:32      Ämne: Citera

Tänkte passa på att fråga, hoppas det inte är emot reglerna!

KOD:
1:
      // Kolla så att lösenordet inte är lägre än 6 tecken
2:
  if ($_POST['passwd'] < 6) {
3:
    $reg_error[] = 4;
4:
   }
5:
 
6:
 


Vill att man måste ha ett viss antal tecken som lägsta lösenord, men denna verkar inte fungera. Konstigt nog. Denna har jag slängt in under register.php för er som inte förstod det ^^

Något som vet?
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
tsarraz



Medlem i: 2430 dagar

Status: Offline



#737393
Inlägg Skrivet: 2014-07-12 09:51      Ämne: Citera

Nu kollar du om lösenordet är under 6 troligen inte
Du måste kolla om längden är under 6 tecken
Som typ
IF (strlen($_POST['password']) < 6) borde funka bättre
 

_________________
<marquee>Is the shit$e
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Visa tidigare inlägg:   
Skapa nytt inlägg   Svara på inlägget
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