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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

Q&A

解決済

3回答

2021閲覧

データベースに登録するパスワードをハッシュ化したい

freemac

総合スコア29

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

0グッド

2クリップ

投稿2020/02/25 07:38

編集2020/02/25 08:06

データベースに登録するパスワードをハッシュ化したい

phpファイルで作業中に、phpadminにpasswordをハッシュ化したのちに格納したいのですが、値が0の整数値となり、ハッシュ化されません。レコードは作られ、他の値は全て適切に格納できています。エラーは特に出力されていません。

該当のソースコード

PHP

1<?php 2ini_set('display_errors', 1); 3error_reporting(E_ALL); 4 5session_start(); 6require('dbconnect.php'); 7 8if(!isset($_SESSION['join'])){ 9header('Location: index.php'); 10exit(); 11} 12 13if(!empty($_POST)){ 14 15 $statement = $db->prepare('INSERT INTO members SET name=?, email=?, password =?, picture=?, created=NOW()'); 16 $statement->execute(array 17 ($_SESSION['join']['name'], 18 $_SESSION['join']['email'], 19 password_hash($_SESSION['join']['password'],PASSWORD_BCRYPT), 20 $_SESSION['join']['image'] 21)); 22var_dump($_SESSION['join']['password']); 23exit(); 24 unset($_SESSION['join']); 25 header('Location: thanks.php'); 26 exit(); 27} 28?> 29<!DOCTYPE html> 30<html lang="ja"> 31<head> 32 <meta charset="UTF-8"> 33 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 34 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 35 <title>会員登録</title> 36 37 <link rel="stylesheet" href="../style.css" /> 38</head> 39<body> 40<div id="wrap"> 41<div id="head"> 42<h1>会員登録</h1> 43</div> 44 45<div id="content"> 46<p>記入した内容を確認して、「登録する」ボタンをクリックしてください</p> 47<form action="" method="post"> 48 <input type="hidden" name="action" value="submit" /> 49 <dl> 50 <dt>ニックネーム</dt> 51 <dd> 52 <?php print(htmlspecialchars($_SESSION['join']['name'], ENT_QUOTES));?> 53 </dd> 54 <dt>メールアドレス</dt> 55 <dd> 56 <?php print(htmlspecialchars($_SESSION['join']['email'], ENT_QUOTES));?> 57 </dd> 58 <dt>パスワード</dt> 59 <dd> 60 【表示されません】 61 </dd> 62 <dt>写真など</dt> 63 <dd>] 64 <?php if($_SESSION['join']['image'] !== ''):?> 65 <img src = "../member_picture/<?php print(htmlspecialchars($_SESSION['join']['image'],ENT_QUOTES)); ?>" 66 <?php endif;?> 67 </dd> 68 </dl> 69 <div><a href="index.php?action=rewrite">&laquo;&nbsp;書き直す</a> | <input type="submit" value="登録する" /></div> 70</form> 71</div> 72 73</div> 74</body> 75</html> 76

![イメージ説明]

試したこと

var_dump($_SESSION['join']['password']);を出力すると、フォーム内で入力した文字列がそのまま出力されました。

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

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

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

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

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

m.ts10806

2020/02/25 07:50 編集

INSERTにSETはやめましょうよ。MySQL以外では使えないと思って良いですし、 実際MySQLですらSETを使うコードは書籍以外で見たことないです。
freemac

2020/02/25 07:53

mysql以外で使えないことは初めて知りました。解決後に必ずvalueの表記に改善します。
m.ts10806

2020/02/25 08:01 編集

あと、ねんのためテーブル定義をご提示ください。 何のテーブルになんというカラムがあって型とか桁数とかが分かる情報 最も良いのはCREATE TABLE文をそのまま提示することですね。
退会済みユーザー

退会済みユーザー

2020/02/25 08:05 編集

phpadminって、もしかしてphpMyAdmin? phpMyAdmin自体はデータベース管理用画面で、データベース自体はMySQLとかmariaDBとか言いますので、ここを気をつけないと話が噛み合いませんよ。
freemac

2020/02/25 08:07

すみません。phpmyadminです。テーブルのstructureを追記しました。
hoshi-takanori

2020/02/25 08:33

「var_dump($_SESSION['join']['password']);を出力すると、フォーム内で入力した文字列がそのまま出力されました。」の理由ですが、password_hash() はハッシュ化したパスワードを返す関数で、引数で渡された $_SESSION['join']['password'] を書き換えるわけではないからです。$statement->execute() にはハッシュ化されたパスワードが渡っているはずです。
freemac

2020/02/25 08:54 編集

$hash = password_hash($_SESSION['join']['password'],PASSWORD_BCRYPT); と一旦値を格納したのちに試すとうまく行きました! ただ、マニュアルではハッシュしたパスワードを返すと表記されているので、一旦格納する意味に関しては疑問が残ります、、、もしかしたら、executeメソッドの中は配列なので、その中で関数を実行したことがこのような挙動の原因かなと考えています。
退会済みユーザー

退会済みユーザー

2020/02/25 09:37 編集

ところで、まだそのテーブルのパスワード保存用カラムはint(100)のままですか? int(100)のカラムにハッシュ化したパスワード文字列を格納するのって、おかしいですよねぇ。
guest

回答3

0

passwordの型がint(整数型)だからです。
どんな文字列入れようとしてもそのまま入りません。

password_hashの各オプションに定められている桁数を文字列系の型でカラムを準備してください。

PASSWORD_DEFAULT - bcrypt アルゴリズムを使います (PHP 5.5.0 の時点でのデフォルトです)。 新しくてより強力なアルゴリズムが PHP に追加されれば、 この定数もそれにあわせて変わっていきます。 そのため、これを指定したときの結果の長さは、変わる可能性があります。 したがって、結果をデータベースに格納するときにはカラム幅を 60 文字以上にできるようなカラムを使うことをお勧めします (255 文字くらいが適切でしょう)。 PASSWORD_BCRYPT - CRYPT_BLOWFISH アルゴリズムを使ってハッシュを作ります。これは標準の crypt() 互換のハッシュで、識別子 "$2y$" を使った場合の結果を作ります。 その結果は、常に 60 文字の文字列になります。失敗した場合に FALSE を返します。 PASSWORD_ARGON2I - Argon2i ハッシュアルゴリズムを使って ハッシュを作ります。このアルゴリズムは、 PHP が Argon2 のサポートを有効にしてコンパイルした場合のみ利用できます。 PASSWORD_ARGON2ID - Argon2id ハッシュアルゴリズムを使って ハッシュを作ります。このアルゴリズムは、 PHP が Argon2 のサポートを有効にしてコンパイルした場合のみ利用できます。

投稿2020/02/25 08:09

m.ts10806

総合スコア80888

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

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

kyoya0819

2020/02/25 08:18

ソルト化した文字列を2進数か10進数に変換して保存する、、って方法もなくはないです。
m.ts10806

2020/02/25 08:22

手間なうえに本来の目的から遠いと思います。 手順増えればその分バグが入り込む可能性も高くなりますしね。
guest

0

自己解決

テーブルのpasswordの型を改善、一旦変数にpassword_hash関数を格納したことでハッシュ化されたパスワードがデータベースに登録されました!

投稿2020/02/25 10:31

freemac

総合スコア29

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

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

m.ts10806

2020/02/25 11:07 編集

この回答読んだだけで分かる人がいればいいんですけど。 にしても自己解決とするのは不当として低評価しました。
guest

0

パスワードは一旦セッション上生でもち、sql側の関数でハッシュ処理をしてください

投稿2020/02/25 07:45

yambejp

総合スコア117632

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

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

freemac

2020/02/25 07:58

sql側の関数というのが何を指しているのかが正直わからないです。無知で申し訳ないです。すみません。
hoshi-takanori

2020/02/25 08:26 編集

私の見る限りMySQLの関数にはアプリケーションのパスワードをハッシュ化するための関数は見当たらないので、PHPの関数を使うべきだと考えます。 理由:リンク先には「PASSWORD() 関数は、MySQL サーバーの認証システムで使用されます。独自のアプリケーションでは、使用しないようにしてください。」と書いてあります。他のハッシュ関数 (MD5, SHA1, SHA2) には salt がないようですし、可逆暗号は使うべきではないですよね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問