2010-08-28 14 views
7

Ecco il sistema di login al quale il login sicuro deve essere attuato/PHP Secure Login - crittografia della password

main_login.php 

    <form name="form1" method="post" action="checklogin.php"> 
    Username:<input name="myusername" type="text" id="myusername" /> <br /> 
    Password:<input name="mypassword" type="password" id="mypassword" /> 
    <input type="submit" name="Submit" value="Login" /> 
    </form> 

Checklogin.php

<?php 
ob_start(); 
$host="localhost"; // Host name 
$username="root"; // Mysql username 
$password=""; // Mysql password 
$db_name="cosmos"; // Database name 
$tbl_name="members"; // Table name 

// Connect to server and select databse. 
mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB"); 

// Define $myusername and $mypassword 
$myusername=$_POST['myusername']; 
$mypassword=$_POST['mypassword']; 

// To protect MySQL injection (more detail about MySQL injection) 
$myusername = stripslashes($myusername); 
$mypassword = stripslashes($mypassword); 
$myusername = mysql_real_escape_string($myusername); 
$mypassword = mysql_real_escape_string($mypassword); 

$sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword'"; 
$result=mysql_query($sql); 

// Mysql_num_row is counting table row 
$count=mysql_num_rows($result); 
// If result matched $myusername and $mypassword, table row must be 1 row 

if($count==1){ 
// Register $myusername, $mypassword and redirect to file "login_success.php" 
session_register("myusername"); 
session_register("mypassword"); 
header("location:login_success.php"); 
} 
else { 
echo "Wrong Username or Password"; 
} 

ob_end_flush(); 
?> 

login_success.php

<?php 
session_start(); 

if(isset($_SESSION['username']) && ($_SESSION['username'] == $myusername)){ 
header("location:main_login.php"); 
} 
?> 

<html> 
<body> 
Login Successful. <a href="logout.php">Logout</a> 
</body> 
</html> 

logout.php

<?php 
session_destroy(); 

header("location:main_login.php"); 
?> 

il problema è che voglio fare questo accesso sicuro tramite crittografia password o qualsiasi altro metodo (se presente). Sono principiante di PHP

+1

esattamente cosa si desidera crittografare e perché? –

+2

È necessario utilizzare il tipo 'password' per i campi di immissione della password. – Gumbo

risposta

5

È possibile crittografare la password per una laurea con MD5 protetto. Si avrebbe bisogno di MD5 della password dal momento in cui l'utente si inscrive e prima del md5 login ....

Esempio: // Define $myusername and $mypassword $myusername=$_POST['myusername']; $mypassword=$_POST['mypassword']; $mypassword = md5($mypassword);

Si sarebbe anche bisogno di utilizzare questo ogni volta che si dispone di un utente iscriversi.

+0

Questo è terribilmente insicuro. dovresti usare un algoritmo di hash più forte (come bcrypt). anche il tuo codice è vulnerabile a SQL injection. – CountMurphy

2

Per rendere questo un po 'più sicuro, è necessario memorizzare le password crittografate nel database e quindi confrontare la password immessa crittografata con l'hash memorizzato. In questo modo se qualcuno accede in qualche modo alla tabella dei membri, non possono vedere le password effettive.

Supponiamo che la password sia myPassword quindi non archiviarla, hash innanzitutto utilizzando un algoritmo come md5 quindi memorizzare l'hash che è deb1536f480475f7d593219aa1afd74c nel database. Quindi, quando l'utente immette una password, l'hash e confronta due hash.

Per un approccio più sicuro, utilizzare SSL.

+1

La crittografia è reversibile; e non è una buona idea. Meglio usare hashing. – Gumbo

1

Normalmente si memorizzerebbe un hash delle password nel database vedi md5 tuttavia questo non lo rende sicuro tra la pagina web e il server - per questo è necessario utilizzare https.

Ci sono due cose qui.

1. 1. Se sono un utente stupido e quando registro per il tuo sito devo fornire una password, potrei fornire la stessa password che ho usato altrove, quindi il tuo sito dovrebbe memorizzare un hash della password della cosa reale quindi se vengono hackerati gli hacker non riceveranno la mia password che ho usato ovunque. Per fare questo si memorizza l'hash nella tabella dei membri e nella query che controlla è valido passare un hash anziché la cosa reale.

2. Sotto http la password verrà inviata dal browser al server in testo normale. Se questo è su Internet e un utente malintenzionato ha accesso a qualsiasi rete tra il browser e il client, può vedere la password: se l'hai cancellato nel browser utilizzando javascript, l'utente malintenzionato può prelevare l'hash e utilizzarlo per accedere a il tuo sito. Questo è il motivo per cui abbiamo https. Per un basso costo (soprattutto rispetto ai costi di sviluppo) è possibile acquistare un certificato che assicurerà la connessione. Se non vuoi farlo, puoi firmare un certificato e utilizzarlo. Se il tuo hosting non ti consente di utilizzare un certificato, potrebbe essere possibile creare una soluzione di homebrew ma è molto meglio trovare altri hosting.

+0

ok Sono davvero in colpa con questo ma voglio sapere se per esempio a causa di qualche motivo non ho accesso a SSL, quindi come faccio ad usare il metodo hash? Voglio dire, devo creare una pagina di registrazione usando la funzione md5 e tutto, puoi spiegare che ... –

+0

@tune SSL non ha nulla da fare qui comunque. è protetto da password, non dal sistema di login di cui tutti parlano. –

+0

vedi la mia modifica - ma come qualcuno ha già detto forse dovresti provare qualche cms open source prima di provare a implementare la tua. –

2

È possibile utilizzare md5 ($ password) o sha1 ($ password) durante l'inserimento dei dati di registrazione nella tabella.

per abbinare ancora una volta per il login di accesso

$ sql = "SELECT * FROM $ nome_tabella dove username = '$ myusername' e la password = '" "" md5 ($ mypassword)..'; $ result = mysql_query ($ sql);

C'è un altro modo, per proteggere ulteriormente. Usando la combinazione di sha1 e sale.

A proposito, perché non si utilizza un framework php veloce coz queste piccole cose sono già state create con loro.

Grazie

+3

@tunetosuraj: stai creando un CMS mentre sei un principiante di PHP? Che ne pensi di utilizzare un CMS opensource che personalizzi in base alle loro esigenze? –

4

Come un principiante, molto probabilmente non hai bisogno di alcuna crittografia. Soprattutto perché sarebbe Javascript, non PHP.
Anche se può essere fatto.
Si potrebbe utilizzare sfida hash attuazione dello schema di autenticazione Digest

  • server di inviare una sfida - uno strimg casuale
  • cliente fare un hash di questa sfida e una password
  • questo hash viene inviato al server
  • server che esegue un hash allo stesso modo e confronta sia

Ci sono molte implementazioni di algoritmo di hashing di Javascript MD5 su inter netto.

Ovviamente, un certificato SSL sarebbe preferito a questa implementazione casalinga.

Ma per ottenere una risposta corretta, è comunque necessario chiarire cosa esattamente si desidera crittografare e perché. E perché non ti preoccupi di proteggere qualcos'altro. Il tuo intero database per esempio.

Alcune note per un po '.
Il tuo codice login_success non funzionerebbe e non proteggerà nulla.
dovrebbe essere solo

if(isset($_SESSION['username'])){ 

perché non v'è alcuna variabile $ myusername per confrontare.
E ci dovrebbe essere exit; subito dopo header("location:...
o un client otterrà contenuti comunque

+2

L'implementazione casalinga può essere sconfitta con un attacco man-in-the-middle. Tuttavia, è sicuro contro le intercettazioni. –

+0

@Georg come mai? Non vedo alcun modo –

+0

Un man-in-the-middle può modificare il Javascript inviato al client (ad esempio rimuovere il codice di crittografia) o posizionarlo come server. Una vera connessione protetta SSL funziona con i certificati per assicurarsi che il server con cui stai parlando sia effettivamente il server con cui vuoi parlare. –

2

Si dovrebbe usare

$static_salt='asdfasdfqwertyuiop123ABC_some_static_salt_string'; 
$myusername=$_POST['myusername']; 
$mypassword=$_POST['mypassword']; 
$mypassword=hash('sha512', $mypassword . $static_salt . $myusername); 

è necessario memorizzare l'hash della password e hash qualsiasi password prima di confronta con quello memorizzato. MD5 non è adatto a hashing delle password vedere: http://uk1.php.net/manual/en/faq.passwords.php#faq.passwords.fasthash Si dovrebbe anche considerare l'utilizzo di salts

+0

Gli algoritmi di hash SHA * non sono né appropriati per le password hash, specialmente non salate come nell'esempio. Sono troppo veloci, invece usano una funzione di derivazione a chiave lenta come BCrypt o PBKDF2. – martinstoeckli

+0

Sono d'accordo Se dai un'occhiata ai due link che ho incluso nella mia risposta i documenti PHP parla di algoritmi di hashing adatti ma penso che sha512 sia una scelta migliore di sha1 quindi cambierò nella mia risposta e fornirò anche un link con informazioni sui sali che aggiungerò anche nella mia risposta. – nettux443

+1

Capisco che tu voglia solo migliorare la risposta accettata, ma questo è un thread molto vecchio, e sarebbe meglio indicarlo in un commento sulla risposta. Il tuo esempio è ancora un modo molto pericoloso di hashing della password, un sale statico non può essere conteggiato come salt, e SHA512 non è ancora appropriato. Vorrei invitarvi a leggere il mio tutorial su [safe password storage] (http://www.martinstoeckli.ch/hash/en/index.php). – martinstoeckli

0

md5 sarebbe il migliore in questo caso. Esegui i dettagli di input come Password tramite la funzione MD5 e inseriscili nel tuo database.

È quasi inviolabile quindi l'unico modo per usarlo è usare MD5 al login anche e compattare la password md5 dal login con la versione memorizzata nel database.