2016-09-08 8 views
0

mysqli prepare文を使用してハッシュされたパスワードを検索して、テーブルからuser_idを取得します。mysqliプリペアドステートメントを使用してハッシュされたパスでuser_idを取得する

私はだから私は準備された文で何の問題もないが、問題は私のハッシュされたパスワードと一致するように、このですが、私が入力したパスワードを

$input_password = crypt($password,$database_pass); 
を取らなければならないプリペアドステートメントは例えば

$query = "SELECT `colour` FROM `pallet`"; 
$query.=" Where `colour`=? " 
$stmt = $db->prepare($query); 
$stmt->bind_param('s',$colour="blue"); 
$stmt->execute(); 
$stmt->bind_result($colour); 
    while($stmt->fetch()) 
snip 

をどのように動作するかを知っています

と一致する前にハッシュしてください。だから私は、私はそれをバインドする前に、データベースから$ database_passを取得する必要があるとして、私は、明らかにこれは動作しません。この

$query = "SELECT `password` FROM `log`"; 
$query.=" Where `password`=? " 
$stmt = $db->prepare($query); 
$stmt->bind_param('s',crypt($password,$database_pass)); 
$stmt->execute(); 
$stmt->bind_result($colour); 

ような何かをしようと思いました。私は一度にすべてをやろうとしています。

私は準備済みのテーブルを使用していませんでしたが、パスワードを取得して後でループでチェックしていましたが、可能な限りすべてを1つにすることでこれを改善したいと考えています。

私はいつも何か一方的な方法で解決し、後でそれを改善しようとしますが、私はこの問題を抱えています。

私は別のやりかたをしましたが、新しいコードの問題は、比較する前にテーブル全体を読み取る必要があることです。私はwhere節でそれをやりたいのですが、それは必要なデータだけを取得するからです。

一つは、データベース内の適切塩漬けのパスワードを検索することはできません
 Global $db; 
     $query = "SELECT `temp_pass`,`user_id` FROM `".$database."`.`logon`"; 
     $stmt = $db->prepare($query); 
     $stmt->execute(); 
     $stmt->bind_result($temp_pass,$user_id); 
     while ($stmt->fetch()) { 
$input_password = crypt($password,$temp_pass); 
      if($input_password == $temp_pass): 
       return $user_id; 
       break; 
      endif; 
     } 
+0

なぜdatabase_passをフェッチして比較するのはなぜですか? –

+0

それはそのようには機能しません。 1つのデータベース・パスだけではありません。 cryptデータベースのパスをハッシュに使用します。ハッシュされたパスワードはデータベースに格納されます。私の古い方法は、msqliを使ってすべての行をフェッチし、ループを通ってパスワードを見つけることですが、コードを少なくして実行しようとしています。ユーザーがパスワードを入力すると、パスワードをデータベースにハッシュする必要があるため、一致を実行できます。 –

+0

私はインナーセレクトが答えかもしれないと考えています。ちょうどそれを解決する必要があります –

答えて

1

、問題はあなたがdiscribedだけのものです:同等のパスワードハッシュを計算するために、あなたがすることができないのでこれはできませんので、第1の塩を取得する必要がありますハッシュを見つける。

これはパスワードハッシュに適用されますが、パスワードリセットに強いトークンがある場合は別のことです。トークンの強度が十分であれば、無制限のハッシュ(SHA-256など)をデータベースに保存できます。

+0

私はこのようにすることに決めました。とにかく知らないキーを誰かがハッキングするのを最小限に抑えるために、パスワードは15分で失効します。 –

+0

@ThomasWilliams - Ok、強力なトークンで、私は少なくとも20文字0-9 a-z A-Zを意味しました。それらは塩漬けを必要としません。 – martinstoeckli