2013-07-20 15 views
6

私はこれを研究しようとしましたが、まだ答えがありません。私の友人が設計したプログラムは、MySQLのpassword()関数を使ってMySQLのdbのパスワードに書き込みます。PHPへのMySQLパスワード()関数

私は設計したWebフロントでこれを使用する方法を探していますが、まだ運がありません。誰にも何か提案はありますか?

パスワードは、ちょうどこの例のようになり

mysql> SET old_passwords = 0; 
mysql> SELECT PASSWORD('mypass'); 
+-------------------------------------------+ 
| PASSWORD('mypass')      | 
+-------------------------------------------+ 
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 | 
+-------------------------------------------+ 
私はちょうど機能

は、ここで例えば、ログインクエリ残りのIE 機能password_hashにこれを有効にする方法を把握する必要が

if (isset($_POST["username"], $_POST["password"], $_POST[$CONF["LOGIN_SIGNAL_TRIGGER"]])) { 

    /* 
     If we got a login signal, a password and a username, we will 
     proceed to check login information. We will first extract 
     the user row from the db. 
    */ 
    $user = myF(myQ(" 
     SELECT `username`,`password`,`id`,`disable_until`,`active` 
     FROM `[x]users` 
     WHERE LCASE(`username`)='".strtolower($_POST["username"])."' 
    ")); 

    if (!$user["id"]) $GLOBALS["LOGIN_FAIL_TYPE"] = "e.user"; 
    elseif ($user["active"] != 1 && $CONF["LOGIN_REQUIRE_ACTIVE"]) $GLOBALS["LOGIN_FAIL_TYPE"] = "e.active"; 

    else { 
     /* 
      If the user's account 'disabled' value is greater than 
      the actual date value, and that the bruteforce protection 
      system is enabled, we will show an error message 
     */ 
     if (($user["disable_until"] > date("U")) && ($CONF["LOGIN_BRUTEFORCE_PROTECT:ENABLE"])) { 
      $GLOBALS["LOGIN_FAIL_TYPE"] = "e.bruteforce"; 
      (isset($_SESSION["loginFailCount"])?session_unregister('loginFailCount'):false); 
     } 

     /* 
      Account is not disabled 
     */ 
     else { 
      if ((isset($_SESSION["loginFailCount"])) && ($_SESSION["loginFailCount"] > $CONF["LOGIN_BRUTEFORCE_FAILCOUNT"])) { 

       myQ("UPDATE `[x]users` 
        SET `disable_until` = ".(date("U")+$CONF["LOGIN_BRUTEFORCE_DISABLE_DURATION"])." 
        WHERE LCASE(`username`)='".strtolower($_POST["username"])."' 
        LIMIT 1" 
       ); 

       (isset($_SESSION["loginFailCount"])?session_unregister('loginFailCount'):false); 
       $GLOBALS["LOGIN_FAIL_TYPE"] = "e.bruteforce"; 
      } 

      else { 

       /* 
        All the information correct, we will proceed to login 
       */ 
       if ($user["password"] == md5(trim($_POST["password"]))) { 
        $_SESSION["id"] = (integer)$user["id"]; 

        session_write_close(); 

        /* 
         Update the last login key 
        */ 
        $me_last_login = me("last_login"); 
        myQ("UPDATE `[x]users` SET `last_login`='".date("U")."' WHERE `id`='".me('id')."'"); 

        /* 
         Route the user 
        */ 
        if (!$GLOBALS["WAP_MODE"]) { 
         header("Location: ".(!$me_last_login?$CONF["LOGIN_FIRST_ROUTE_TO"]:$CONF["LOGIN_ROUTE_TO"])); 
        } else header("Location: {$CONF["WAP_LOGIN_ROUTE_TO"]}"); 

       } 

       else { 
        (isset($_SESSION["loginFailCount"])?$_SESSION["loginFailCount"]++:$_SESSION["loginFailCount"]=1); 
        $GLOBALS["LOGIN_FAIL_TYPE"] = "e.password"; 
       } 
      } 
     } 
    } 
} 

if ((isset($_GET[$CONF["LOGOUT_SIGNAL_TRIGGER"]])) && (!isset($_POST[$CONF["LOGIN_SIGNAL_TRIGGER"]]))) { 

    /* 
     Handle admin swapping 
    */ 
    if (isset($_SESSION["swap_id"])) { 
     $_SESSION["id"] = $_SESSION["swap_id"]; 
     session_unregister("swap_id"); 
     header("Location: ?L=admin.index"); 
    } 

    else { 
     (isset($_SESSION["id"])?session_unregister('id'):false); 
     (isset($_SESSION["SELF_USER_DATA"])?session_unregister('SELF_USER_DATA'):false); 

     header("Location: {$CONF["LOGOUT_ROUTE_TO"]}"); 
    } 
} 
+0

[どのような種類のハッシュはmysqlを使用しますか?](http://stackoverflow.com/questions/17738034/what-kind-of-hash-does-mysql-use) – Barmar

+1

何のために使用しますか? mysqlを使ってパスワードハッシュを生成するだけの場合は、質問にある同じクエリを実行してください。 – AD7six

+0

チェック:http://stackoverflow.com/questions/260236/mysql-hashing-function-implementation –

答えて

2

正しく理解すれば、PASSWORD()をPHPで再現する必要はありませんEここでは、この

SELECT `username`,`password`,`id`,`disable_until`,`active` 
    FROM `[x]users` 
WHERE `username` = 'user1' 
    AND `password` = PASSWORD('password') 

のようなあなたの選択でPASSWORD()を使用してMySQLの側に行くあなたの文でusername列にLCASE()を使用していない大文字と小文字を区別照合を使用していない限りSQLFiddleデモ

です。その列に定義されているものがあればMySqlが索引(索引)を使用しないようにし、表をフルスキャンします。

注:あなたのコードはSQLインジェクションに脆弱です。準備文を使用することを検討してください。

+6

この価値があることに言及するセキュリティの意味があります。特に、SQLクエリを記録することができます(MySQLの低速クエリログなど)。クエリ内でハッシュを実行すると、パスワードがログファイルに書き込まれる可能性があります。 – Corbin

+0

もう1つの問題は、MySQL 4.1のように、MySQLが 'password'関数の定義を再度変更した場合に壊れることです。 –

0

最初にmysql_escape_string($_POST['password'])を使用してパスワードをエスケープします。

は、PHPでこれを行う方法を尋ね

WHERE password_field = PASSWORD(USER_SUPPLIED_PASSWORD) 
5

OPでSQLクエリ内の変数としてそれを使用しています。これは、PHPでそれを行う方法です:

function sqlPassword($input) { 
    $pass = strtoupper(
      sha1(
        sha1($input, true) 
      ) 
    ); 
    $pass = '*' . $pass; 
    return $pass; 
} 

後世のために追加された(これを使用する理由はない、mysqlは唯一の有益な目的のために?PASSWORD機能を廃止することを決定した場合、それを使用)は、PHPのMySQLの同等同等

SELECT 
    UPPER(
    CONCAT('*', SHA1(UNHEX(SHA1('password')))) 
) 

またMySQLのPASSWORD機能を使用して古いシステムから移行したことを私が書いたSymfony2のアプリのパスワードエンコーダインターフェースからMySQL Hashing Function Implementation

1

コピー&ペーストを参照してください。

function mysqlPassword($raw) { 
    return '*'.strtoupper(hash('sha1',pack('H*',hash('sha1', $raw)))); 
} 
1

MySQL 4.1より前のコードのマイバージョンです。

/* PHP implementation of MySQL pre-4.1 password function. 
Based on Perl Crypt::MySQL C code */ 
function mysql_old_password_hash($password) { 
    $len = strlen($password); 
    $add = 7; 
    $nr = 1345345333; 
    $nr2 = 0x12345671; 
    $tmp = 0; 
    foreach (str_split($password) as $chr) { 
     if ($chr == " " or $chr == "\t") { 
     continue; 
    } 
    $tmp = ord($chr); 
    $nr ^= ((($nr & 0x3f)+$add)*$tmp) + ($nr << 8); 
    $nr2 += ($nr2 << 8)^$nr; 
    $nr2 &= 0xffffffff; # We need to limit this to 32-bit 
    $add += $tmp; 
    } 
    // Strip sign bit 
    $nr &= 0x7fffffff; 
    $nr2 &= 0x7fffffff; 
    return sprintf("%08lx%08lx",$nr,$nr2); 
} 

4.1以降では、5.7より前のバージョンでは、sjagrまたはchiliNUTの回答を参照してください。

これを使用する唯一の理由は、自分のアプリケーションにPASSWORD()を使用しないというMySQLの助言にもかかわらず、書かれたデータベースのパスワードをチェックするためです。

+0

ありがとう! @あなたは私のお尻を保存してください! http://ftp.nchu.edu.tw/MySQL/doc/refman/5.1/en/password-hashing.html – zx1986

+0

申し訳ありませんが、パスワードの長さが6より長い場合、これは機能しません。たとえば、 'celestelee 'は7860f0613fdc6000としてエンコードしますが、MySQLでは7860f0613fd9e9ecとなります。 – zx1986

+1

うーん...興味深い...最大8文字まで... Crypt :: MySQLと再び比較する必要があるかもしれない.... –