質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.06%

password_verifyで認証されない

受付中

回答 6

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,539

Res

score 124

実現したいこと/ソースコード

ログインの認証時に、password_verifyで認証をしているのですが、認証されません。
また、別のテストページで少しスクリプトが違うハッシュ化と確認を試したところ正常にtrueが返されました。
コードは次のようになっています。

signup.php

//~~~省略~~~
$emails = "";
$userids = "";
try {
  $pdo = new PDO('mysql:host=example.jp;dbname=user_data;charset=utf8','user','password',,
  array(PDO::ATTR_EMULATE_PREPARES => false));
}catch(PDOException $e){
 exit("spl");
}
$stmt = $pdo->query("SELECT * FROM user_tb");
while($row = $stmt -> fetch(PDO::FETCH_ASSOC)) {
 $emails .= "[". $row["email"] ."]";
 $userids .= "[". $row["userid"] ."]";
}
function ra(){
 $len="";
 for( $i = 0; $i < 10; $i++ ){
  $len.=substr(str_shuffle('abcdefghijklmnopqrstuvwxyz'), 0, 10);
 }
 return $len;
}
  function newusers( $userids ) {
   $kuserid=ra();
   if(strpos( $userids , $kuserid ) !== false){
     newusers();
   } else {
     try {
       $pdo = new PDO( 'mysql:host=example.jp;dbname=user_data;charset=utf8' , 'user' , 'password',
       array(PDO::ATTR_EMULATE_PREPARES => false));
     } catch ( PDOException $e ){
       exit( "sql" );
     }
     $name = $_POST['name'];
     $email = $_POST['email'];
     $pass1 = $_POST['password'];
     $pass2 = $_POST['password2'];
     $niti=date( "Y/m/d H:i:s" );
     $stmt = $pdo->prepare("INSERT INTO user_tb (name, password,password2,userid,createddate,email) VALUES (:name, :password,:password2,:userid,:createddate,:email)");
     $pass1s=password_hash($pass1, PASSWORD_DEFAULT);//ここでハッシュ化
     $pass2s=password_hash($pass2, PASSWORD_DEFAULT);//ここでハッシュ化
     $stmt->bindParam(':name', $name, PDO::PARAM_STR);
     $stmt->bindParam(':password', $pass1s, PDO::PARAM_STR);
     $stmt->bindParam(':password2', $pass2s, PDO::PARAM_STR);
     $stmt->bindParam(':email', $email, PDO::PARAM_STR);
     $stmt->bindParam(':userid', $kuserid, PDO::PARAM_STR);
     $stmt->bindParam(':createddate', $niti, PDO::PARAM_STR);
     $stmt->execute();
     $_SESSION['id'] = $kuserid;
     exit("ok");
    }
  }
function fu001 ( $emails ) {
 $email = $_POST['email'];
 if(strpos( $emails , $email ) !== false){
  exit( "emailerror" );
 }else {
  newusers( $userids );
 }
}
fu001( $emails );
//~~~省略~~~

login.php

try{
 $emails = array();
 $passs = array();
 $userids = array();
 $ivs = array();
 $pdo = new PDO( 'mysql:host=example.jp;dbname=user_data;charset=utf8' , 'user' , 'password' , 
array(PDO::ATTR_EMULATE_PREPARES=>false));
}catch( PDOException $e ) {
 exit('sql');
}
$stmt = $pdo->query("SELECT * FROM user_tb");
while($row = $stmt -> fetch(PDO::FETCH_ASSOC)){
$emails[] = $row["email"];
$passs[] = $row["password"];
$userids[] = $row["userid"];}
$email = $_POST['mail'];
if( in_array( $email, $emails ) ){}else{ exit("error"); }//メールアドレスが存在するかどうか
$pass = $_POST['pass'];
$mi = count($emails);
for( $i = 0; $i < $mi; $i++ ){
 if( $emails[$i] === $email ){
  if( password_verify( $pass , $passs[$i]) ) {//ここで確認
   $_SESSION['id'] = $userids[$i];
   exit("login");
  }else{
   exit("pass");
  }
 }
}


※質問に関係ない部分は一部省略しているほか、一部実際と異なりますが質問のコードとは無関係です。
何回アカウントを作り直してもfalseになってしまいます。

追記1

回答者からいただいたソースコードでlogin.phpのコードを改めました。

try {
    $pdo = new PDO('mysql:host=example.jp;dbname=user_data;charset=utf8','user','password',
        array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)
    );
    $stmt = $pdo->prepare('SELECT userid, email, password FROM user_tb WHERE email = :email');
    $stmt->bindValue(':email', $_POST['mail']);
    $stmt->execute();
    $result = $stmt->fetchAll();
    if ($result === false) {
        exit('fetch error');
    }
    if ($resul ===array()){
        exit('pass');
    }
     //exit($_POST['pass'].":". $result[0]['password']);
        if (password_verify($_POST['pass'], $result[0]['password'])) {
            $_SESSION['id'] = $result[0]['userid'];
            exit('login');
        }
        else {
            exit('pass');
        }
} catch (PDOException $e) {
    exit('sql:' . $e->message);
}

情報

もう回答は打ち切りたいと思います。
私自身さらに勉強し、そこでつまずいたところを再度質問したいと思いますのでまたよろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • asuchi0819

    2019/11/15 21:59 編集

    m.ts10806さん
    マジっすね
    でも未成年でもここまで知識がつけられたのはm.ts10806さんなどのteratailの回答者さん方のおかげです、

    キャンセル

  • m.ts10806

    2019/11/15 23:25

    asuchi0819さん
    ここで言うことではないかもしれませんが、そう言ってくれて嬉しいですね。
    回答者続けてきた意味があります。

    キャンセル

  • 退会済みユーザー

    2019/11/15 20:10

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 6

+5

まず、情報不足の段階で、解決につながるかどうか怪しい情報を提供し
混乱させてしまったことについては申し訳ないと思っております。

teratail など第三者に自分の関わるコードを評価してもらい
解決につながるアドバイスを得る場合において、
大事なことは、質問者さんと回答者側とで
同じコード、同じデータでテストし評価することです。
開発中のコードを全部開示しろ、
動かすのに必要なデータ全部開示しろ、ということではなく、
要求された機能を満たすだけの最小限(ミニマル)なコードと、
要求された機能をテストするのに必要な、リアルと関係ない仕様を満たすテストデータが必要で、
解決に至る回答をつけようとしてくれる第三者の手元で試せるよう、
質問者さんが頑張って情報提供しないと始まらないのです。

それを怠ってしまうと、
回答者側が再現できなかった部分を適当に解釈してコードを書き、
実態に則さない状態でテストして「もしかしたらこれで解決するんじゃないだろうか」という状態の
回答が寄せられます。
(私が最初に書いたみたいに)

質問者さんが直接動かしている実行環境のコードやデータを開示できないのは、実によくある話です。
それでも teratail などを利用しようとするなら、
開示できる範囲のミニマルなもの(コード、データ構造、テストデータ)を別途工夫して用意しないといけないのです。
めんどうですか? わずらわしいですか? 手間暇かけなくないですか?
そう思うのであれば、そもそも teratail でデバッグ依頼のようなことを投稿してはいけないのです。
それを丁寧にやってくれる質問者さんが、経験豊富な回答者の情報を上手に引き出し、解決にたどり着いています。

回答しようとする側は、
足りない情報を自分の経験や知識に照らし合わせて補おうとしたり、
ネット上の参考情報がないか調べる時間を使ったりと、
質問者さんが考えるよりも多くの時間を(何人もの人が大なり小なり)費やしています。
本業を抱えている人も多く、業務の合間を縫って手助けしようとしてくれているのに、
情報が足りない、テスト用のデータがない部分を工夫するために余計に手間暇をかけて付き合おうとしています。
質問者さん一人がめんどうでわずらわしいのではないのです。

そして今回は、password_verify()の件以外に、
文法エラーや、データベースアクセスにまつわる作法など、さまざまな
「なぜここはこういう書き方をしているのだろう?」という箇所があり、
実行環境の差異を騙して動かそうとしても、password_verify()の件じゃないところで引っかかり、
回答する側としてはそこに手間暇がかかっています。
そこを解決してからpassword_verify()の件に取り組みたい主旨で私は回答を書きました。
それなのに、
「※質問に関係のないことは情報追加・修正依頼に書かないでください。」などと言われては、
デッドロックですよ。
これでアドバイスしようかなと思っていた潜在的な回答者を追い出してしまっています。
(情報セキュリティ方面の第一人者も戸惑っていましたし。)

質問者と回答者側が同じテーブルにつかないと始まらない、
そのために必要な指摘には柔軟に対応してください。
なにもリアルなものを出してくれとは言っていません。
第三者が検証・テストできる情報がほしいだけです。

以下、リニューアル前の回答:

えーっと、回答につながるかどうかわかりませんが、
整形ツールにかけた上で書き直してみた。
机上デバッグのみで、実際に動作まではさせていない点についてはあしからず。

まず、fetch()をwhileループを回して全部溜め込んでから、
$_POST['email']を照会するのってムダ。
1万件や10万件や100万件のユーザー情報の中から探させるのであれば、
もっとデータベースを活用しなさい。
SELECT文でemailを指定することで、存在すれば1行だけ得られるし、存在しなければ何も返ってこない。
高々1行分のデータを受け取るのだからfetchAll()を使ってみたけど、どうだろうか。

PHPでデータベースに接続するときのまとめ - Qiita

を参考に、prepareしてbindValueしてexecuteする書き方に改めつつ、
データベースへのアクセス全体をtry~catchで囲んで例外をキャッチできるようにした。

exit()で処理が抜けるのはあくまで製作途中ということで、
評価してみてほしい。

<?php

if (!isset($_POST['mail'] || !isset($_POST['pass']))) {
    exit('error');
}
try {
    $pdo = new PDO('mysql:host=example.jp;dbname=user_data;charset=utf8', 'user', 'password',
        array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)
    );
    $stmt = $pdo->prepare('SELECT userid, email, password FROM user_tb WHERE email = :email');
    $stmt->bindValue(':email', $_POST['mail']);
    $stmt->execute();
    $result = $stmt->fetchAll();
    if ($result === false) {
        exit('fetch error');
    }
    if ($result === array()) {
        exit('pass');
    }
    if (isset($result[0]['pass'])) {
        if (password_verify($_POST['pass'], $passs[$i])) {
            $_SESSION['id'] = $result[0]['userid'];
            exit('login');
        }
        else {
            exit('pass');
        }
    }



} catch (PDOException $e) {
    exit('sql:' . $e->message);
}

signup.phpもガッチャガチャ引っ掻き回してみた。
これもあくまで机上デバッグで文法エラーが出ないだろうというところまで詰めただけ。

bindParamじゃなくbindValueを使ったり、

try~catchの使い方を変えたり、

$pdoを関数の引数に使って外にだしてもアクセスできるようにしたり、

全角空白でインデントしている箇所を直したり、

まだ納得していない部分として、
ra()で新しいユーザーIDを作っているみたいだけど、
データベース上に登録済みのを生成しているかもしれないので、
ユーザー登録する前に検証する処理を入れるべき。

<?php

function ra(){
    $len="";
    for( $i=0; $i<10; $i++ ){
        $len.=substr(str_shuffle('abcdefghijklmnopqrstuvwxyz'), 0, 10);
    }
    return $len;
}

function newusers( $pdo, $userids ) {
    $kuserid = ra();
    if (strpos($userids, $kuserid) !== false) {
        newusers();
    } else {
        $name = filter_input(INPUT_POST, 'name');
        $email = filter_input(INPUT_POST, 'email');
        $pass1 = filter_input(INPUT_POST, 'password');
        $pass2 = filter_input(INPUT_POST, 'password2');
        $niti = date("Y/m/d H:i:s");
        $pdo->beginTransaction();
        $stmt = $pdo->prepare("INSERT INTO user_tb (name, password,password2,userid,createddate,email) VALUES (:name, :password,:password2,:userid,:createddate,:email)");
        $pass1s = password_hash($pass1, PASSWORD_DEFAULT);//ここでハッシュ化
        $pass2s = password_hash($pass2, PASSWORD_DEFAULT);//ここでハッシュ化
        $stmt->bindValue(':name', $name, PDO::PARAM_STR);
        $stmt->bindValue(':password', $pass1s, PDO::PARAM_STR);
        $stmt->bindValue(':password2', $pass2s, PDO::PARAM_STR);
        $stmt->bindValue(':email', $email, PDO::PARAM_STR);
        $stmt->bindValue(':userid', $kuserid, PDO::PARAM_STR);
        $stmt->bindValue(':createddate', $niti, PDO::PARAM_STR);
        $stmt->execute();
        $pdo->commit();
        $_SESSION['id'] = $kuserid;
        exit("ok");  // ここでphpの処理が抜けちゃうけどいいのかい?
    }
}

function fu001 ( $pdo, $emails ) {
    $email = $_POST['email'];
    if (strpos($emails,$email) !== false) {
        exit( "emailerror" );
    } else {
        newusers($pdo, $userids);
    }
}


$emails = "";
$userids = "";
try {
    $pdo = new PDO('mysql:host=example.jp;dbname=user_data;charset=utf8','user','password',
        array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)
    );

    $stmt = $pdo->query("SELECT * FROM user_tb");
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {  // ここいらは何をやっているかわかんないから放置してる
        $emails .= "[".$row["email"]."]";
        $userids .= "[".$row["userid"]."]";
    }

    fu001($pdo, $emails);
    //~~~省略~~~  




}catch(PDOException $e){
 exit("spl");
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/13 21:02 編集

    >ユーザー登録する前に検証する処理を入れるべき。
    もともと同じものにはならないと思います。

    キャンセル

  • 2019/11/13 21:03

    それより質問からあまりそれないでください。

    キャンセル

  • 2019/11/15 18:24

    はい。これから、しっかりと回答者側の負担も考え、しっかりと質問します。
    今回の質問は申し訳ありませんでした。

    キャンセル

+5

まず、

$password = $_POST['password'];
$password = $_POST['password2'];


の時点でわけわかめです。
なんで二回も代入するんですか?
それによってpassword2ないんじゃね?

てか、2つ入力させて2つともハッシュとかわけわかめの極み

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/15 08:56

    わっけわっかめー

    キャンセル

  • 2019/11/15 16:04

    安心してください。
    実際記載するとき間違えて//を消してしまいました。
    見つけてくださりありがとうございます!

    キャンセル

  • 2019/11/15 16:14 編集

    その2つとも登録というのも仕様が意味不明ですしね。
    設計も含めて全部書き直さなきゃどうにもならないレベルなので「読む気がしない」という意見は賛同しかない。

    キャンセル

  • 2019/11/15 19:43 編集

    内容不適により削除

    キャンセル

+5

まだ「受付中」らしいので回答してみます。

ただ、私の回答スタンスとして
要件不明瞭な質問にはズバリは応えない。ヒント回答しかしない
というのがあるので、「コピペで動くコードもらえた」「絶対の解決策がもらえた」という期待はしないこと。

もしコメントしたいのであれば
表向きだけの感謝の意は良いので、正しく理解したかどうかを分かるコメントにしてください。
ガイドライン#4-2. どのように解決したのかを伝えましょうにもある通り。)


細かいツッコミをするとキリがない。
ただ、コーディングする上で最低限下記は守るべき

  • インデントは揃える。後からではなく始めから。
  • 開発中ならエラー表示は常にONにしておく
  • デバッグ環境を整える
  • エラーを読む
  • ドキュメント、リファレンス、マニュアルは読む
  • 変数名は意味のある名前を付ける(マジックナンバーはダメ絶対)
  • コード内でまとまりごとに改行を入れる(可読性の問題)
  • 関数とグローバルの処理は明確に場所を分ける(可読性の問題)
  • ロジックと画面表示部分は明確に場所を分ける(可読性の問題)
  • DBを利用する場合、何も使わないデータは保存しない
  • DB関係でtry-catchはDB接続部分だけじゃなくSQL送信から結果を受け取るところまで囲う(DB接続なんて一度確立すればそうそうException起きない)
  • try-catchで捕捉したExceptionはきちんと何かに出力する。(Exceptionを握りつぶすとか得た情報を何も使わないとか以ての外)
  • 同じことを何回も書かない
  • いきなり全部書かない(ミニマムコードから書く)
  • 自分が解説できないコードを書かない

まあ「最低限」と言いましたけど、結構あるんですよね。

初心者ということなので(初心者アイコンついてないしプロフィール見てると「回答します」と書いてあるので驚愕しかないけど)、知らないことも多いかもしれないけど、1個1個確認してみると良いです。
ほぼほぼ守られていないことが分かるはず。

ということで、今回の件は、下記のようなコードから始めるべきなんですよね。

<?php
ini_set('display_errors', "On");

$user_pass_on_db = password_hash("test", PASSWORD_DEFAULT);

echo $user_pass_on_db.PHP_EOL;# DBに入る想定のパスワード
echo mb_strlen($user_pass_on_db).PHP_EOL;

$user_pass_from_form_y = "test"; #入力フォーム 一致
$user_pass_from_form_n = "test2"; #入力フォーム 不一致

var_dump(password_verify( $user_pass_from_form_y , $user_pass_on_db) );
var_dump(password_verify( $user_pass_from_form_n , $user_pass_on_db) );

このコードで確認できてないことはDB介してもフォームからの値を受け取って云々もできるはずがありません。
これがベースになれば、DBに必要な桁数も分かるし、DBに保存された情報との照合も出来るわけです。

コードをざっと読んだ限り、このミニマムコードでの確認すら出来てなさそうなのでここから書いています。
どこも大丈夫なところなんてありません。
安心できるところなんてどこにもありません。

書かれた内容が全てです。書いてないことまで拾うことはどんな熟練者でもできません。
指摘されるということは、それだけ何も伝わっていないということです。
伝わっていないから指摘されるのです。

回答者は今回の質問者よりも多くのコードを読んでいるし、書いています。
「コピペのツギハギだろうな」ということは読めば分かります。
「自身が書いたコードの理解度」もコメントからコードから読み取ることができます。

既についている回答が全てです。
それらを「関係ない」「話をそらしている」と言えるレベルではないことは誰の目にも明らかです。


ということで、私が書いたコードを1つの部品の参考として、
部品を作っていき単体確認を行った上で結合していってください。

DBのデータを保存、それを利用して照合 は本当に最後のほうで良いでしょう。


さて。

テーブル構造を見せてほしいというのはもしかしたらpasswordカラムとかがINT(11)とかVARCHAR(12)とかになってて、passwordにデータがちゃんと入っていないかもしれない。

という依頼に対して

その部分を載せるとセキュリティ上よくないからです。

という返答はどう考えても間違っています。

だって、既にmysqluser_tableというデータベース名のuser_tbという名前のテーブルにname,password,password2,userid,createddate,emailというカラムがあるということまでコードで出ていますよね。
そこまで出しているのに今更password varchar(255) NOT NULLのような1つのカラムの定義を出すことにどんなセキュリティリスクがありますか?
言い切れるなら根拠を示さないと誰も納得しません。しかも「初めて数ヶ月」程度の初心者が「絶対」と言い切れる意味は誰も理解できません。

納得させたいならきちんと技術で証明して納得させてください。
teratailはプログラミング特化のQAサイトです。初心者とか上級者とか関係ありません。
言葉よりも技術力が最も相手を納得させる確実な手段です。口では誰も納得しません。

よく見かける「調べたけど分かりません」という決まり文句に何の説得力もないのと同じです。

それに少し調べればpassword_hash()で PASSWORD_DEFAULT を指定すればどれくらいの文字数を出してくるか分かります。
paiza.ioのように環境作らなくても今回私が提示したコードくらいは試せるのです

こういうの「知らなかった」では済まされないんですよ。
それに世界のクラッカーたちはそういう「知らなかった」を狙ってきます。
「初心者だから容赦してくれ」は通じません。初心者こそ格好の餌食でしょう。

だからこそ、「公開する」ことは頭から外して基礎学習とセキュリティの学習に注力すべきと言う話をしました。

それに、どんな優良記事を読んで理解した気になっていたとしても、
今回提示されたコードをきちんと動くような形にするのは、今の質問者さんでは無理です。
認証関係はコピペやツギハギコードで制御しきれるもんじゃないんですよ。
しかもサービスとして公開するつもりなんですよね?一般利用者が必ず意図した操作をしてくれると思いますか?
確かにブラウザから確認できるのはhtmlだけなので、htmlの拙さだけではセキュリティ対策の強弱までは判断できません。

でも、クラッカーたちはどうしたらセキュリティリスクを抱えるサイトであるかを見つける術を知っています。あなたはどこまで知っていますか?
そういうクラッカーたちから自身のサイトを守れる自信がありますか?利用者を守れる自信がありますか?

何がセキュリティリスクで何がセキュリティリスクではないか分かっていない状態で守れるものってあるんでしょうか。

という私のような回答者が投げかける疑問を全て明快に論拠も含めて返せるようになるまで
「公開する」という目標は忘れてください。


最後に、私が最も引っかかった質問者さんの発言をピックアップします。

私のサイトはHTMLのみでバックグラウンドが見えるような素っ裸にしていいサイトではないです。

笑止千万

これだけでどれだけの指摘を受けるか理解できてませんよね。

理解で来たらようやくスタート地点にたったと認められるんじゃないでしょうか。


色々混じったんですけど「質問するな」「初心者は還れ」と言っているわけではないです。
教えを請うならそれなりのやり方がある。
初心者という自覚があるならとるべき言動がある。

それだけの話です。

既にm6uさんなども言ってくれていますが、内容や表現などは別として反応をしてくれるというのは
動機や理由はそれぞれあったとしても「何かしらの形で手を差し伸べてみようか」と決して軽くはない腰をあげてくれていると思ってください。

teratailは長くやっている回答者が多いです。
それだけ質問者のことを見ています。
「こいつアドバイス受け入れる気がないな」と受け取ったら問答無用で無言低評価だけして放置します。
否、もしかしたら低評価すらしなくなるかもしれない。

そうなると困るのは誰でしょうか。

考えてみてください。
別に回答者は質問者がいなくてもどうとも思いません。
回答者自身がプログラミングの問題を抱えているわけではありませんからね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+3

2019/11/13 21:44 で追加された方に回答

if ($resul ===array()){
$result
です

if ($resul ===array()){
        exit('pass');
    }exit($_POST['pass'].":". $result[0]['password']);


これだと
if ($resul ===array()){
の処理の後exitで終わってしまいます次の
if (password_verify($_POST['pass'], $result[0]['password'])) {
に行かないのでechoなどにしてください

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/14 19:29

    まさか、echoとexitを間違えて使っていた、なんてな(そんなことはあるはずが

    キャンセル

  • 2019/11/15 16:27

    安心してください!それは確認用のコードなので今はコメントにしてあります。
    直していなくて申し訳ありません。

    キャンセル

+3

password_hashの第2引数に PASSWORD_DEFAULT を指定していますので、ハッシュ化した文字列は

$2y$10$4oa3dTCA7YAaYeBUmW5cpuXHQSdeO3pTrzRy/mDVaB.hh2fte1nlS


といったような、識別子$2y$から始まる60文字の文字列になります。
(PHP7.3の場合。デフォルト動作なので、文字数や識別子はバージョンによって変わる可能性はあります)

まずはuser_tb.password に上記の様な60文字の文字列が入っているか確認してみてください。
パスワードのハッシュは元パスワードより長い文字列になることが多いので、テーブルのカラム定義にもある程度の長さが必要です。

データベースに入っている内容が問題なさそうであれば

<?php
$password_hash = '$2y$10$4oa3dTCA7YAaYeBUmW5cpuXHQSdeO3pTrzRy/mDVaB.hh2fte1nlS';
$result = password_verify('password', $$password_hash);
var_dump($result);


といったコードで検証できるので、確認してみてください。

  1. データがハッシュ文字列として正しくINSERTされている
  2. ログイン処理時にSELECTしてとってきた変数に正しいハッシュ文字列が入っている
  3. password_veriffyの第1引数が画面から入力したパスワード文字列、第2引数がDBに格納されているハッシュ文字列になっている

一つずつ確認して、どこまでうまく行っているのかを切り分けましょう。

PHP: password_hash - Manual

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/15 16:48

    はい。
    細かく説明していただいてありがとうございます。

    キャンセル

+2

コードは読む気にならんので、読まずに回答しています。

password_verify($pass,$passs[$i])の$passと$passs[$i]の中身の確認は行っています。

中身が適切なものなのであれば、password_verify() がおかしいです。古い php で、適当な関数を定義していませんか?

中身が適切になっていないのであれば、POST された password を加工しているどこかで問題が発生しています。変数の推移を確認し、意図したものになっているか検証してください。ハッシュ値への変換箇所と DB への登録箇所で適切な処理がなされていないケースをたまに見かけます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/13 09:31

    $_POSTに格納している値を書き換えて、$_POSTに上書きするケースとかひどいのがあったよね

    キャンセル

  • 2019/11/17 15:44

    なんで解決諦めたんだろ。。。
    2箇所で変数確認すれば切り分け完了なのに^^;

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る