web-dev-qa-db-fra.com

Comment valider le mot de passe généré par WordPress dans une base de données en utilisant PHP?

Je travaille avec un site réalisé avec WordPress et je dois ajouter des éléments extérieurs à WP et vérifier les connexions des utilisateurs, Enregistrement des utilisateurs en dehors de WP.

J'ai essayé avec md5 de mot de passe mais ce n'est pas ...

J'ai essayé ce code:

require_once( 'wp-includes/class-phpass.php' );
$wp_hasher = new PasswordHash( 8, TRUE );
$password = "passwordhere";
$hashed_password = $wp_hasher->HashPassword( $password );
$encryptedpass = md5($hashed_password);

Mais ce n'est que pour la première fois que vous créez un mot de passe, et c'est toujours différent.

J'ai besoin d'un code qui peut être utilisé dans ceci:

SELECT * FROM wp_customers WHERE email = "[email protected]" AND password = "<what goes here?>"

Est-ce possible de toute façon?

Merci.

3
SharkTheDark

Sur la base de votre autre question ... cela ressemble à {sons} comme si vous tentiez de valider un mot de passe en texte clair donné par rapport à ce qui est stocké dans la base de données. Voici la fonction que WordPress utilise pour faire exactement cela:

function wp_check_password($password, $hash, $user_id = '') {
    global $wp_hasher;

    // If the hash is still md5...
    if ( strlen($hash) <= 32 ) {
        $check = ( $hash == md5($password) );
        if ( $check && $user_id ) {
            // Rehash using new hash.
            wp_set_password($password, $user_id);
            $hash = wp_hash_password($password);
        }

        return apply_filters('check_password', $check, $password, $hash, $user_id);
    }

    // If the stored hash is longer than an MD5, presume the
    // new style phpass portable hash.
    if ( empty($wp_hasher) ) {
        require_once ( ABSPATH . 'wp-includes/class-phpass.php');
        // By default, use the portable hash from phpass
        $wp_hasher = new PasswordHash(8, TRUE);
    }

    $check = $wp_hasher->CheckPassword($password, $hash);

    return apply_filters('check_password', $check, $password, $hash, $user_id);
}

Tout d’abord, ce plugin vérifie si le hachage MD5 du mot de passe donné est identique au mot de passe stocké (haché) d’un utilisateur. Il vérifie également si le hachage PHPass du mot de passe donné est identique au mot de passe stocké pour un utilisateur.

Vous pouvez suivre un modèle similaire.

Supposons donc que vous recevez un nom d'utilisateur et un mot de passe de l'utilisateur et que vous souhaitez les valider (my_password_validation( $username, $password )). Vous utiliserez le nom d'utilisateur indiqué pour extraire un mot de passe haché de la base de données. Ensuite, vous comparez le hachage du mot de passe donné à la valeur stockée pour voir s'il est valide.

Voici quelquespsuedocode non testé:

function my_password_validation( $username, $password ) {
    // Select the users's password hash from the database
    $stored = query( 'SELECT * FROM wp_customers WHERE email = ' . $username );

    require_one( 'class-phpass.php' );
    $hasher = new PasswordHash(8, TRUE);

    return $hasher->CheckPassword( $password, $stored );
}

Si le mot de passe que vous avez fourni à la fonction est identique à la valeur stockée, la fonction retournera true. Sinon, il retournera faux.

En regardant les commentaires vous avez laissé sur l’autre question, il semble que vous ayez d’autres problèmes, cependant. Citer:

Alors je reçois:

$P$BqVYujC/jqNY4aylZpHi475jwcaSUs1 Mais comment puis-je comparer cela avec un dans DB?

Un dans DB est:

fa063a4ed35e092a2d4e15c1b6a61871 Comment comparer ces deux avec MySQL?

Je peux vous dire tout de suite que le mot de passe que vous obtenez de la base de données n'a pas été haché à l'aide de l'utilitaire PHPass. Ces hachages ressembleront toujours au début de $P$B car c'est ce qui indique au système comment il a été haché. PHPass est basé sur Blowfish qui utilise ce genre de préfixe sur les chaînes cryptées.

Votre hachage fa063... ressemble plus à un hachage MD5 standard ... donc si votre hachage MD5 du texte en clair ne correspond pas, je pense que vous pourriez avoir un mot de passe erroné.

Pour répondre à votre question "comment comparer ces deux avec MySQL", vous ne le faites pas. MySQL est le magasin de données ... ne faites pas de logique commerciale ni de comparaison dans le magasin de données. Lisez les données, puis utilisez un script PHP pour effectuer votre comparaison.

5
EAMann

C'est très facile..

<?php
include_once($_SERVER['DOCUMENT_ROOT'].'/wp-includes/class-phpass.php' );

// prepare database connection
$ip_address="localhost";
$user_db="userdb";
$pass_db="passdb";

$conn= mysql_connect($ip_address,$user_db,$pass_db);
mysql_select_db("dbname",$conn);
if (!$conn){
            echo "Could not connect: " . mysql_error();
            exit();
}

// wordpress' username that his password going to compare
$user = 'test';
$user_name = htmlspecialchars($user,ENT_QUOTES);

// plain password to compare
$password = 'tespass';

$hasher = new PasswordHash(8, TRUE);

// get user_name's hashed password from wordpress database
$queryx = "select * from wa1gty5f_users where user_login='$user_name'";
$Resultx = mysql_query($queryx,$conn);

while($row = mysql_fetch_array($Resultx)){
     $passnya = $row[user_pass];
}

// compare plain password with hashed password
if ($hasher->CheckPassword( $password, $passnya )){
    echo "MATCHED";
} else {
    echo "NO MATCHED";
}
?>
4
BagusS

J'ai eu ce problème et découvert à droite sur wp_hash_password()

Compare un mot de passe déjà haché avec sa chaîne de texte en clair

<?php

$wp_hasher = new PasswordHash(8, TRUE);

$password_hashed = '$P$B55D6LjfHDkINU5wF.v2BuuzO0/XPk/';
$plain_password = 'test';

if($wp_hasher->CheckPassword($plain_password, $password_hashed)) {
    echo "YES, Matched";
} else {
    echo "No, Wrong Password";
}

?>
0
Alex