web-dev-qa-db-ja.com

PHPを使用してDBでWordPressが生成したパスワードを検証するにはどうすればいいですか?

私はWordPressで行われているサイトで作業しています、そして私はWPの外にあるいくつかの部分を追加する必要があり、そしてユーザーログイン、WPの外にユーザーを記録することをチェックします。

私はパスワードのMD5で試してみましたが、そうではありません...

私はこのコードを試してみました:

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);

しかし、これは初めてパスワードを作成するためのものであり、それは常に異なります。

これに使えるコードが必要です。

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

とにかくこれは可能ですか?

ありがとう。

3
SharkTheDark

あなたの他の質問に基づいて...それはあなたがデータベースに格納されているものに対して与えられた平文のパスワードを検証しようとしているようにsoundsです。 WordPressがこれを行うために使用する関数は次のとおりです。

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);
}

最初に、このプラグインは与えられたパスワードのMD5ハッシュがユーザーの保存された(ハッシュされた)パスワードと同じかどうかを確認します。また、与えられたパスワードのPHPassハッシュが、ユーザー用に保存されているパスワードと同じかどうかを確認します。

あなたは同様のパターンに従うことができます。

それでは、ユーザーからユーザー名とパスワードを受け取り、それらを検証したいとしましょう(my_password_validation( $username, $password ))。データベースからハッシュされたパスワードを取得するために与えられたユーザー名を使います。次に、与えられたパスワードのハッシュと保存されている値を比較して、それが有効かどうかを確認します。

ここにいくつかの未テストの擬似コード

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 );
}

関数に渡したパスワードが保存されている値と同じハッシュ値になった場合、関数はtrueを返します。そうでなければfalseを返します。

コメント あなたが他の質問に残っているのを見て、それはあなたがいくつかの他の問題を抱えているように思えます。引用する:

だから私は得ます:

$P$BqVYujC/jqNY4aylZpHi475jwcaSUs1しかし、どうすればDBのそれと比較できますか?

DBの中の1つは、

fa063a4ed35e092a2d4e15c1b6a61871これら2つをMySQLと比較するにはどうすればいいですか?

データベースから取得したパスワードがPHPassユーティリティを使用してハッシュされたのではないことを今すぐにお伝えします。それらのハッシュは常に$P$Bの開始に似ています。なぜならそれはシステムにそれがどのようにハッシュされたかを伝えているからです。 PHPassは、暗号化された文字列にその種類のプレフィックスを使用するBlowfishに基づいています。

あなたのfa063...ハッシュは標準的なMD5ハッシュにもっと似ています...だからあなたの平文のあなたのMD5ハッシュが一致しないなら、私はあなたが間違ったパスワードを持っているかもしれないと思います。

「これら2つをMySQLと比較する方法」という質問に答えるには、そうではありません。 MySQLはデータストアです...データストアでビジネスロジックや比較をしないでください。データを読み出してから、PHPスクリプトを使用して比較を実行します。

5
EAMann

それは非常に簡単です..

<?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

私はこの問題を抱えていて、 wp_hash_password() のすぐ上で見つけました

すでにハッシュされているパスワードとそのプレーンテキスト文字列を比較します。

<?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