2013-08-06 5 views
2
<?php 

include("connect.php"); 
session_start(); 
if ($_SERVER["REQUEST_METHOD"] == "POST") { 
    // Username and password sent from form in HTML 
    $myusername = $_POST['username']; 
    $mypassword = $_POST['password']; 

    $sql = "SELECT id FROM users WHERE username='$myusername' and password='$mypassword'"; 
    $result = mysql_query($sql); 
    $row = mysql_fetch_array($result); 
    $active = $row['active']; 
    $count = mysql_num_rows($result); 

    // If result matched $myusername and $mypassword, table row must be 1 row 
    if ($count == 1) { 
     session_register("myusername"); 
     $_SESSION['login_user'] = $myusername; 

     header("location: welcome.php"); 
    } else { 
     $error = "Your username or password is invalid"; 
    } 
} 

?> 

Ceci est mon code de connexion actuel. Sur ma page d'inscription, je l'ai pour que quand il injecte dans la base de données, il injecte les mots de passe déjà cryptés dans MD5. Cependant, je ne peux pas sembler convertir:Utiliser MD5 sur la page de connexion

$mypassword=$_POST['password']; 

Dans MD5 pour confirmer pour voir si le mot de passe existe dans la base de données. Avec ce code, les mots de passe ne doivent pas être cryptés. Que dois-je changer pour faire en sorte qu'il vérifie avec la base de données chiffré?

+1

'$ mypassword = md5 ($ _ POST ['mot de passe']);'? –

+1

Je ne comprends pas. Vous pouvez insérer le 'md5 ($ _ POST ['mot de passe'])' dans la base de données et le comparer au mot de passe haché lors de la connexion. –

+0

Vous avez déjà entendu parler de quelque chose appelé injection SQL? – amaster

Répondre

0

Pour autant que je comprends la question. Si vous stockez votre mot de passe md5 crypté dans db il vous suffit de comparer comme ça $myPassword = md5($_POST['password'])

+0

C'est ce que je pensais que ça marcherait. (Désolé, un peu nouveau pour PHP et MySQL) Lorsque je le change, il ne confirme pas avec les mots de passe dans la base de données qui sont cryptés. Lorsque le code est '$ mypassword = $ _ POST ['mot de passe'];' cependant, il confirme avec des mots de passe qui ne sont pas cryptés. – user2655462

+0

@ user2655462 Je suggère de répercuter le md5 et comparer physiquement les valeurs pour voir ce que vous obtenez – amaster

+0

@ user2655462 Il peut y avoir deux problèmes ici. 1. Vous ne cryptez pas en utilisant md5. 2. Le mot de passe est worong. Je vous suggère de faire ce que dit amaster507. –

5

Enroulez $_POST['password'] dans md5() comme ceci:

$mypassword = md5 ($_POST['password']); 

Inutile de dire que vous avez un certain nombre d'autres problèmes, comme l'alimentation la base de données un nom d'utilisateur non échappé, et hachage des mots de passe sans sel, pour ne pas mentionner en utilisant md5() en premier lieu; utilisez la fonction intégrée crypt(), pbkdf2, bcrypt ou scrypt pour cela, ou toute autre key derivation function, de préférence celle qui utilise une méthode de hachage à jour et un grand nombre (nombre d'itérations). PHP 5.5 a également introduit une API de hachage pasword simplifiée, que vous pouvez consulter dans here. Pour encore plus de conseils sur le hachage PHP, voir . Dans l'ensemble, en tant que développeur, vous ne pouvez pas vivre sans donner this fascinating post une lecture approfondie. Sautez à la fin en bas si vous ne pouvez pas être dérangé (et sont d'accord pour tuer les chatons).

+0

J'espère que ma dernière édition vous satisfait, alors. – Nerius

+0

Oui, bien que j'avais déjà changé le -1 en +1 bien sûr :) –

+0

Vous avez fait des recherches pendant 30 minutes, votre réponse était la seule qui a aidé. Merci. –

1

PHP vous recommande de ne pas utiliser les mots de passe MD5 de hachage: http://www.php.net/manual/en/faq.passwords.php#faq.passwords.fasthash

Pour répondre cependant directement à votre question, vous pouvez md5 une chaîne en utilisant md5(). Exemple:

$mypassword = md5($_POST['password']); 

Et vous pouvez le comparer plus tard en utilisant la même chose:

"SELECT... WHERE password = '".md5(mysqli_real_escape_string($someValue))."'" 
+0

pourquoi sous mysqli_real_escape_string la chaîne hachée? Cela devrait être fait avant le cryptage. –

+0

Oups, faute de frappe! Merci. – garrettmurray

+0

Md5 ne contient-il pas déjà des caractères sécurisés ... L'échappement de la chaîne changerait donc le hachage. Devrait échapper le nom d'utilisateur lors de la comparaison comme OP n'a pas – amaster

0

Traditionnellement vous pouvez le mettre comme ceci:

$myPassword = md5(mysqli_real_escape_string($_POST['password'])); 

Mais comme il y a prouvé vulnérabilités dans MD5 hash , vous pouvez utiliser un autre algorithme de hachage dans here. Idéalement, vous pouvez utiliser SHA-512 comme ceci:

$myPassword = hash('sha512',mysqli_real_escape_string($_POST['password'])); 

Prenez note que mysqli_real_escape_string est également importante pour rendre ces requêtes pour empêcher sql injections alors vous pouvez simplement comparer le mot de passe haché lors de la connexion.

+0

-1 pour ne pas en recommander un de pbkdf2, bcrypt ou scrypt –

+0

Mais n'est-ce pas subjectif de choisir lequel est le meilleur? Personnellement, je préfère la base SHA512 sur ses performances et sa taille de bit; et pour ne pas mentionner la fonction de hachage intégré pour cela en PHP. FYI: pbkdf2 est une implémentation appropriée de SHA512 ou Blowfish. Vous ne pouvez pas simplement lancer le hachage pbkdf2. Vous devez faire plus d'efforts pour créer une fonction séparée (définie par l'utilisateur) juste pour l'implémenter dans vos codes. Pourquoi s'embêter? –

+0

Eh bien, alternativement, vous pouvez utiliser 'crypt' qui utilise au moins un certain nombre d'itérations en plus d'un sel. Mais vous êtes celui qui invente une nouvelle méthode de hachage de mot de passe, pas moi. En outre, je ne vois pas pourquoi vous auriez besoin d'échapper à une ficelle avant de l'alimenter ... –

0

première enveloppe votre variable en fonction md5 comme celui-ci

$myPassword = md5($_POST['password']); 

comment utilisez-vous juste myusername $, il faut moi un peu de tableau associatif parce que vous accédez à un ex de table (vous devez également sélectionner * tous pas seulement id de db): - *

$_SESSION['login_user'] = $row['username']; 

changer alors ce

if ($_SERVER["REQUEST_METHOD"] == "POST") 

à ceci: -

if (isset($_POST["submit"])) 
0

Merci pour l'aide tout le monde! Okay donc j'étais vraiment stupide ... mettre une limite dans la base de données pour le mot de passe crypté. En outre, merci pour les recommandations sur la façon de hacher mes mots de passe et d'autres choses.

0
<?php 
session_start(); 
include_once 'conn.php'; 

//check if form is submitted 
if (isset($_POST['submit'])) { 
    $email = mysqli_real_escape_string($conn, $_POST['email']); 
    $password = mysqli_real_escape_string($conn, $_POST['password']); 
    $password=md5($password); // **Encrypted Password**  
     if($email == "" || $password == ""){ 

      $errormsg="Please fill in all fields"; 
      } 
      else 
      {  
      $select = "SELECT * FROM employee WHERE email = '$email' and password = '$password'"; 
      //echo $select;exit; 
      $result = mysqli_query($conn, $select); 
        //echo $result;exit; 
       while($row = mysqli_fetch_array($result)){   

       $_SESSION['email'] = $row['email']; 
       $_SESSION['id'] = $row['id']; 

       //print_r($row);exit; 

        if($row['auth'] == '1') { // check the value of the 'status' in the db 
        //go to admin area 

        header("Location: admin_home.php"); 

        } elseif($row['auth'] == '0') { 
        //go to user area 

        header("Location: user_home.php"); 

        }else{ 

         echo "wrong email and password"; 
        } 
       } 
      } 

} 
?> 
+1

** Ne pas le faire ** Il n'est pas sûr d'utiliser MD5 pour créer un vérificateur de mot de passe, pensez à supprimer cette réponse. – zaph

Questions connexes