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

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

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

1797閲覧

Login画面 password_verifyについて

kazoogon

総合スコア281

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2017/06/19 12:17

編集2017/06/20 03:33

Login画面を作っており、password_hash関数でDBに入っている値をチェックしてlogin機能を作ろうとしていますが、password_verify関数部分がうまくいきません。詳しくは↓のコードに記載しています。

view部分

<form action="index.php" method="POST"> <input type="text" value="<?php echo $_COOKIE['username']; ?>" name="username" placeholder="username"> <input type="password" value="" class="password" name="password" placeholder="password"> <input type="submit" class="login" name="login" value="Login"> <input type="hidden" name="hide" value="login"> <div class="remember"><input type="checkbox" name="remember">Remember me</div> </form>

control部分

$hide=get_post('hide'); if($hide === "login"){ $username = get_post('username'); $password = get_post('password'); $checkbox = get_post('remember'); if(($login = login($link,$username,$password)) === FALSE){ //ここの結果が、正しいパスワード・ユーザーネームを記入してもFALSEになる $error_for_me[] = "login SELECT失敗"; }else{ if($checkbox === "checked"){ setcookie('username', $username, time() + 60 * 60 * 24 * 365); } session_start(); $_SESSION['user_id'] = $login['user_id']; header('飛びたいページのurl'); exit; } }

model部分

function login($link,$username,$password){ global $error; if($username === ""){ $error[] = "please fill in username"; return FALSE; }else if($password === ""){ $error[] = "please fill in password"; return FALSE; } if(count($error === 0)){ $query = 'SELECT * FROM user WHERE username=\''.$username.'\''; return login_action($link,$query,$password); }else{ $error[]="*failed login"; return FALSE; } } function login_action($link,$query,$password){ global $error_for_me; if($login_button = mysqli_query($link,$query)){ if(($row = mysqli_fetch_assoc($login_button)) !== FALSE){ //←この関数までは反応する if(password_verify($password,$row["password"])){ //←この関数は反応なし return $row; }else{ $error[] = "Invalid password!"; return FALSE; } }else return FALSE; } }else{ $error_for_me[] = "login_action失敗".$query; return FALSE; } }

signup部分のmodel追加します

function signup($link,$username,$password,$password2){ if(isset($_SESSION['user_id']) === TRUE){ header('省略'); }else{ if($username === ""){ $error[] = "*please fill in username"; }else if($password === ""){ $error[] = "please fill in password"; }else if($password !== $password2){ $error[] = "please fill in same password"; } if(count($error) === 0){ $password = password_hash($password,PASSWORD_DEFAULT); $query = 'INSERT INTO user(username,password) VALUES(\''.$username.'\',\''.$password.'\')'; return insert_action($link,$query); } } } function insert_action($link,$query){ global $error_for_me; if(($result = mysqli_query($link,$query))===FALSE){ return FALSE; $error_for_me[]="insert_action失敗".$query; }else{ return TRUE; } } password_hash関数使用したsignup部分の関数も載せときます

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2017/06/19 12:48

反応なしというのはfalseが返っているということでしょうか?password_verify()直前で$passwordと$row["password"]には何が入っていますか?
kazoogon

2017/06/19 13:42

回答ありがとうございます。 直前でvar_dump($password);var_dump($row["password"]); としてみましたが、ちゃんと記入したパスワードとDB内のhash化したパスワードをとってきています。しかしこのvar_dumpたちをpassword_verifyの中に書くと出力されません汗
m.ts10806

2017/06/19 14:01

password_verifyにvar_dump書いても意味がないと思います。出力結果が引数となるだけですね。
kazoogon

2017/06/19 14:36

password_verifyの関数の中*  でした、申し訳ありません
guest

回答3

0

ベストアンサー

こんにちは
よくある話として、hashを格納するカラムのサイズが小さく、
切り捨てられているということがあります。

phpのマニュアルでは、以下のように推奨されています。

引用テキストカラム幅を 60 文字以上にできるようなカラムを使うことをお勧めします (255 文字くらいが適切でしょう)。

ですので、もしサイズが小さいようでしたら、
カラムをvarchar(255)にして試してみてはいかがでしょうか?

もし、問題ないようでしたらpassword_hashをされている処理も載せると
もっと詳しくわかるかもしれません。
ご参考にしてください。

投稿2017/06/20 03:39

編集2017/06/20 03:42
s-washion

総合スコア204

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazoogon

2017/06/20 06:10

DBのvarcharの文字数変えたらできました、ありがとうございます。 まさかここだとは思いませんでした汗 (ちなみに私もカープファンです:)
s-washion

2017/06/20 06:20

解決されたようでよかったです。 自分も経験あるのですが、なかなか気づかないところですよね。 (カープ今年も調子いいですね)
Z-TALBO

2017/06/20 07:03

すみません、私広島なものでカープファンです(笑) 次は阪神戦行きます! 関係ないコメント失礼しました。
guest

0

解決になるかというところまでは明言できないのですが、if文の中で変数に代入しているところを、ひとまず分解してみてください。問題が分かりづらくなっている気がします。
分解することで問題の切り分けが行えます。

例:

PHP

1if($login_button = mysqli_query($link,$query)){ 2 ※↑そういえばこの書き方だとmysqli_queryの結果を見てるわけじゃないですね 34 5$login_button = mysqli_query($link,$query); 6if($login_button){ 7

PHP

1if(($row = mysqli_fetch_assoc($login_button)) !== FALSE){ 2 34 5$row = mysqli_fetch_assoc($login_button); 6if(!is_null($row)){ 7

返り値はphpマニュアルに合わせたため、若干if文の中身の書き方変えてます。
他の箇所も同様に分解して書いてみてください。

投稿2017/06/19 14:12

編集2017/06/19 14:13
m.ts10806

総合スコア80765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

if(count($error === 0))を
if(count($error) === 0)じゃどうですか?

if($login_button = mysqli_query($link, $query))だと、判定的にTRUEでもFALSEでもTRUEで処理されてないでしょうか?
$login_buttonにqueryを入れたらって判定になっちゃうような気がします。
とすれば、、、
mysqli_queryが実は原因なのかな?と考えたりするんですが、、、
そうなると、、、$linkに関してはここでは記載されてませんが、その辺りの部分はどうですか?
ちゃんと動作してますか?

ちょっと、、、テストしてみました。

PHP

1$pass = 1234; 2$hash_pass = password_hash($pass, PASSWORD_DEFAULT); 3var_dump($pass, $hash_pass);

で、trueがとれました。
ということは、password_hashの部分がもしかするとおかしいのかもしれませんが、どうでしょうか?

投稿2017/06/19 13:00

編集2017/06/20 01:24
Z-TALBO

総合スコア525

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazoogon

2017/06/19 13:43

回答ありがとうございます。 「たしかに!」と思い、直しましたが今の問題の解決にはなりませんでした汗 隅々まで見ていただきありがたいです。
kazoogon

2017/06/19 23:02

$linkはDBがつながった場合メッセージを表示しているので問題なしです 上の方からも指摘された通り、if文の中の変数代入部分を分解して一回試してみます。
kazoogon

2017/06/20 00:42

``` function login_action($link,$query,$password){ global $error_for_me; global $error; $login_button = mysqli_query($link,$query); if($login_button){ $row = mysqli_fetch_assoc($login_button); if(!is_null($row)){ if(password_verify($password,$row["password"])){ return $row; }else{ $error[] = "Invalid password!"; return FALSE; } }else{ $error[] = "$row(mysqli_fetch_assoc部分)is null!!"; return FALSE; } }else{ $error_for_me[] = "login_action失敗".$query; return FALSE; } } ``` このように書き換えてみましたが、結果は password Invalid! が出力されます汗
kazoogon

2017/06/20 00:46

Invalid password**
kazoogon

2017/06/20 03:30

function signup($link,$username,$password,$password2){ if(isset($_SESSION['user_id']) === TRUE){ header('いきたいurl'); }else{ if($username === ""){ $error[] = "*please fill in username"; }else if($password === ""){ $error[] = "please fill in password"; }else if($password !== $password2){ $error[] = "please fill in same password"; } if(count($error) === 0){ $password = password_hash($password,PASSWORD_DEFAULT); $query = 'INSERT INTO user(username,password) VALUES(\''.$username.'\',\''.$password.'\')'; return insert_action($link,$query); } } } function insert_action($link,$query){ global $error_for_me; if(($result = mysqli_query($link,$query))===FALSE){ return FALSE; $error_for_me[]="insert_action失敗".$query; }else{ return TRUE; } } password_hash関数使用したsignup部分の関数も載せときます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問