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

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

ただいまの
回答率

90.52%

  • PHP

    20322questions

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

  • HTML

    8953questions

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

  • MySQL

    5847questions

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

  • ログイン

    118questions

    ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

php ログイン機能作成

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 473

mochio_o7

score 9

PHPにてログイン機能を作成中です。

登録フォームで名前とパスワードを登録し、ユーザーIDを適当に生成しています。(DBに保存)
ログインにはユーザーIDとパスワードの入力が必要です。

ログイン機能を作成したいのですが、できません。。

〈新規登録〉

<?php

if(isset($_POST["name"],$_POST["pass"])){


$dsn = '';
$user = '';
$password = '';

$pdo = new PDO($dsn, $user, $password);


$sql = 'CREATE TABLE articles
(
number INT(10) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
pass VARCHAR(100) NOT NULL,
id VARCHAR(100) NOT NULL
)';

$result = $pdo->query($sql);



$name = ($_POST["name"]);
$pass = ($_POST["pass"]);
$id = uniqid();


$stm = $pdo -> prepare("INSERT INTO articles (number,name,pass,id) VALUES ('', :name, :pass, :id)");
$stm -> bindParam(':name', $name, PDO::PARAM_STR);
$stm -> bindParam(':pass', $pass, PDO::PARAM_STR);
$stm -> bindParam(':id', $id, PDO::PARAM_STR);
$stm -> execute();

}

?>
<html>
<head>
  <title>登録フォーム</title>
</head>
<body>


<p><h2>登録フォーム</h2></p>

<fieldset>

<p><h4>名前とパスワードを記入してください</h4></p>
<form action="kadai31.php" method="post">
<dl>
<dt>名前</dt>
<dd>
<input type="text" name="name">
</dd>
<dt>パスワード</dt>
<dd>
<input type="password" name="pass">
</dd>
</dl>
<div><dd><input type="submit" value="登録"></div></dd>

</fieldset>

</form>
</body>
</html>

〈ログイン〉

<?php
session_start();

$errorMessage = "";

if (isset($_POST["login"])) {

if (empty($_POST["userid"])) {
$errorMessage = 'ユーザーIDが未入力です。';
} else if (empty($_POST["password"])) {
$errorMessage = 'パスワードが未入力です。';
}

if (isset($_POST["userid"]) && isset($_POST["password"])) {

$dsn = '';
$user = '';
$pas = '';

$pdo = new PDO($dsn, $user, $pas);

$sql = "SELECT * FROM articls";
$res = $dbh -> query($sql);
foreach($res as $row){

if($row['id'] == $_POST["userid"] && $row['pass'] == $_POST["password"]){

$login_url = "keiziban.php";
header("Location: {$login_url}");
exit();

$_POST["userid"] = $_SESSION["userid"];
$_POST["password"] = $_SESSION["pass"];

}else{
$errorMessage = 'ユーザーIDあるいはパスワードに誤りがあります。';
}
}
}
}

?>
<html>
<head>
<title>ログイン画面</title>
</head>
<body>
<h2>ログイン</h2>

<?php
if ($errorMessage) {
print '<font color="red">'.$errorMessage.'</font>';
}
?>

<form action="kadai.php" method="POST">

  <fieldset>
  <dl>
  <dd>
  ユーザID:</label><input type="text" name="userid" value="">
  </dd>
  <br>
  <dd>
  パスワード:</label><input type="password" name="password" value="">
  </dd>
  <br>
  </dl>
  <dd>
  <input type="submit" name="login" value="ログイン">
  </dd>

</fieldset>
</form>

<form action="kadai3.php">
<fieldset>          
<legend>新規登録フォームはこちら</legend>
<input type="submit" value="新規登録">
</fieldset>
</form>


</body>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • 退会済みユーザー

    2017/12/17 19:45

    複数のユーザーから「問題・課題が含まれていない質問」という意見がありました
    teratailでは、漠然とした興味から票を募るような質問や、意見の主張をすることを目的とした投稿は推奨していません。
    「編集」ボタンから編集を行い、質問の意図や解決したい課題を明確に記述していただくと回答が得られやすくなります。

  • masaya_ohashi

    2017/12/18 10:17

    ユーザの登録時の処理も記載されないと答えようがありません。あと、articleという単語は「記事」という意味であり、userを管理しているものとは思えないのですが、ユーザ名やパスワードがarticlesというテーブルに保存してあるという認識で正しいですか?

    キャンセル

回答 3

+1

問題を切り分けるとよいでしょう
まずパスワードの暗号/ハッシュなしならユーザー登録が可能なところまで
作り込んで下さい
その上でデータを暗号化し、ユーザーからのログイン要求のパスワードに
対して、暗号化をしたものと整合性をチェックします

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

そもそも、会員のデータを預かるシステムに耐えうる php のバージョンではないので、見直すべきです。。。
また、提示されたコードは全体的に突っ込みどころがあるので、触れません。

以下、参考資料となりますが、crypt 関数を使用したハッシュの比較方法は、マニュアルにサンプルが提示されています。

crypt

<?php
$hashed_password = crypt('mypassword'); // saltを自動的に生成させます

/* 異なったハッシュアルゴリズムが使用された際の問題を避けるために
   crypt()の結果全体をパスワード比較用のsaltとして渡す必要があります。
   (上記のように標準DESに基づくパスワードハッシュは2文字のsaltを使用します
   が、MD5に基づくハッシュは12文字のsaltを使用します) */
if (hash_equals($hashed_password, crypt($user_input, $hashed_password))) {
   echo "Password verified!";
}

salt に注目してコードを見直してみてください。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

ログインの部分で質問ということは既に登録画面があるということですかね?

まず、登録のときに、入力されたパスワードはcrypt関数で暗号化されていると思います!
そして、暗号化したパスワードをデータベースへ登録していると思います。

//登録する時のデータの流れ
入力したパスワード「abcd1234」
↓
暗号化したパスワード「aaFUCs.r.39dY」
↓
暗号化した値をデータベースに登録する

つまり、パスワードの値は入力した値と、データベースの値は違う文字列になります!

今度はログインの時ですが
まずは普通にIDとパスワードを入力してもらいます。
ここで入力してもらうパスワードは「abcd1234」が期待されます。
IDをキーとしてデータベースからレコードを取り出した時
データベースに登録されているパスワードの値は「aaFUCs.r.39dY」です。

ですので、単純に比較すると結果はNGとなります!

abcd1234」と「aaFUCs.r.39dY」はイコールではありません!


このままですと、正しいパスワードをいれてもログインできないので
正しいかどうかチェックするために、入力されたパスワードを暗号化してから比較します。

abcd1234」を暗号化する
→「aaFUCs.r.39dY」が得られる

パスワードが正しいか確認する
「aaFUCs.r.39dY」と「aaFUCs.r.39dY」はイコール!

すみません、うまく説明できた自信ないんですが
登録の時は「A」を「B」に変換して登録している
チェックする時は変換された「B」を基準に確認するので、再度「A」を「B」に変換する作業が必要だということをお伝えしたいです。
そしてその変換する関数として今回質問されているcryptpassword_hashが使われています。
ですので、作り方としてはあっています!

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

  • 解決済

    PHPとMySQLについて

    ](fadebad2fd9a28a1fd4d1ebd714c7f9b.png) 今、PHPとMySQLを使った認証システムを作成しているのですが、ここで質問があります。

  • 解決済

    会員制サイト:メールアドレスでログイン

    前提・実現したいこと Qiita:PHPとMySQLで新規登録とログインを実装する(PDO使用)を参考に、PHPで会員制サイトを作っています。 このサイトで作れるものでは、ID

  • 解決済

    【PHP】ログイン機能の実装

    PHP初心者です。 PHPの勉強がてら、会員制のページを作成してます。 新規会員登録機能は実装できていますが、 ログイン機能の実装がうまくいきません。 やりたいことを実

  • 解決済

    MySQLへの登録ができない

    フォームに入力したデータをデーバベースに登録したいのですが、「登録が完了しました」というメッセージが表示されているのですが、なぜかデータベースには登録されていません。もしかしたら、

  • 解決済

    会員登録ページの性別箇所がデータベースに登録されない

    性別以外の ユーザー名、パスワード等は、データベースに登録されるのですが、 性別のみ登録されません。 原因がわかりません。 ちなみに、 phpmyadminでカラムs

  • 解決済

    ログインフォームがウンともスンとも言いません。

    汚いソースですみません。 ネットで調べながらmysqliを使って、ログインフォームを作っています。 ログインフォームの入力項目はusernameとpasswordのみです。

  • 解決済

    Fatal error: Uncaught exception 'PDOException'

    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity co

  • 解決済

    WP-Membersのログインページの編集について

    前提・実現したいこと WP-Membersを使用し、会員制の投稿サイトを作成しております。 会員用のマイページには下記のショートコードを追加しました。 [wp-members

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

  • PHP

    20322questions

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

  • HTML

    8953questions

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

  • MySQL

    5847questions

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

  • ログイン

    118questions

    ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。