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

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

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

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

PHP

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

ログイン

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

Q&A

解決済

1回答

2767閲覧

PHPとSQLite3を用いたログイン認証機能の実装について

anomer

総合スコア55

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

PHP

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

ログイン

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

0グッド

0クリップ

投稿2018/01/28 04:36

PHPとSQLite3を用いたログイン認証機能の実装について

大変お世話になっております。PHP、SQLite初心者です

今回、SQLiteとPHP、CGIしか動作しないサーバーでフレームワーク無しのWebサイトを構築をすることになりました

ログイン処理を様々なページを参考にしながら、以下のソースを作成致しました
しかし、ログインがうまくできません

DBに登録されている値も、されていない値もログイン失敗になってしまいます
エラーで落ちているわけではなさそうです

どうすればログイン成功にできますでしょうか
また、このままの実装でセキュリティ的に問題ありませんでしょうか

何卒、御教授をお願いいたします。

<?php //セッションスタート session_start(); //user_nameとpass_wordをXXX.htmlから受け取っている場合 if (isset($_POST['user_name']) && isset($_POST['pass_word'])){ //変数に格納 $user_name = $_POST['user_name']; $pass_word = $_POST['pass_word']; //PDOでSQLite3に接続 $pdo = new PDO('sqlite:ZZZ.sqlite3','',''); $pdo -> setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC); //SQL文発行と実行(user_nameとpass_wordがZZZ.sqlite3のテーブル名に登録されているか) $sql='select name,pass from テーブル名 where name = :user_name AND pass= :pass_word'; $data = array('user_name'=>$user_name,'pass_word'=>$pass_word); $stmt = $pdo->prepare($sql); $stmt->execute($data); //ログイン処理(DBに一件登録されている場合はYYY.htmlへ) if ($row = $stmt->fetch() == 1){ $_SESSION['user_name'] = $_POST['user_name']; header("Location: YYY.html"); }else { //ログイン失敗処理省略 } } ?>

参考にしたサイト様

セッション
http://ummt.jp/tech/article/index.php?type=php&sid=140621_02

データベース(このページは難しくて、よくわかりませんでした)
https://oshiete.goo.ne.jp/qa/6465628.html

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

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

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

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

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

guest

回答1

0

ベストアンサー

開発環境

エラーチェック機能のついたIDEを利用してください。

ex) Netbeans, PHPStrom など

エラーを表示しましょう

以下のように、ファイルの先頭に記述しましょう。
エラーメッセージの表示なしに開発することは、熟練したプログラマであってもデバッグは困難です。

php

1<?php 2 3ini_set('display_errors', true); 4error_reporting(E_ALL);

パスワードを平文で保存してはいけません。

password_hash() 関数で生成したハッシュをDBに持つのが定石です。

グローバル変数を記述するのはやめましょう

$_POST $_GET $_SERVER を記述するのではなく、filter_input()を使って安全にアクセスしましょう。

コーディングサンプル

以上の点を踏まえて作成したコード

html

1<?php 2ini_set('display_errors', true); 3error_reporting(E_ALL); 4 5//セッションスタート 6session_start(); 7 8if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') === 'POST') { 9 10 //変数に格納 11 $user_name = filter_input(INPUT_POST, 'user_name'); 12 $password = filter_input(INPUT_POST, 'password'); 13 14 //PDOでSQLite3に接続 15 $pdo = new PDO('sqlite:ZZZ.sqlite3' 16 , null 17 , null 18 , [PDO::ATTR_DEFAULT_FETCH_MODE => PDO::ERRMODE_EXCEPTION] 19 ); 20 $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 21 22 /** 23 * サンプルデータ登録 24 */ 25// $sql = 'INSERT INTO Users (user_name, password) VALUES (?, ?)'; 26// $stmt = $pdo->prepare($sql); 27// $stmt->execute([ 28// "taro" 29// , password_hash('password', PASSWORD_DEFAULT) 30// ]); 31 32 $sql = 'select user_name, password from Users where user_name = :user_name'; 33 $data = ['user_name' => $user_name]; 34 $stmt = $pdo->prepare($sql); 35 $stmt->execute($data); 36 $rows = $stmt->fetchAll(); 37 foreach ($rows as $row) { 38 if (password_verify($password, $row['password'])) { 39 $_SESSION['user_name'] = reset($rows); 40 header("Location: YYY.html"); 41 exit; 42 } 43 } 44} 45?> 46<!DOCTYPE HTML> 47<html lang="ja"> 48 <head> 49 <meta charset="UTF-8"> 50 <title></title> 51 </head> 52 <body> 53 <div> 54 <form action="" method="post"> 55 <p> 56 <input type="text" name="user_name" /> 57 </p> 58 <p> 59 <input type="text" name="password" /> 60 </p> 61 <p><button>Login</button></p> 62 </form> 63 </div> 64 </body> 65</html>

投稿2018/01/28 05:25

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

anomer

2018/01/28 15:10

様々なご指摘ありがとうございます。 いろいろ検証してみましたが、なんとかログイン認証を実装できました! 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問