ログインシステムが機能しているか知りたい

解決済

回答 1

投稿

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

yuus2733

score 109

passwordchecker.jsというライブラリを使わせていただいて、
ログインシステムの動作を確認しています。
その上で、見本通りに打ち込んで、IDとPASSが合っているはずなのに
ログインができません。
おかしいところの指摘をお願いしたいです。

passwordcheck.js

/*
  ライブラリ名:
     Password Checker

  バージョン:
     1.0.1

  ライセンス:
     http://www.websec-room.com/license

  パスワード強度判定
    1:弱い 2:やや弱い 3:普通 4:やや強い 5:強い
*/
function getPasswordLevel(password) {

  var level = 0;
  var pattern = 0;
  var hasLower = false;
  var hasUpper = false;
  var hasCharacter = false;
  var hasNumber = false;


  for (i = 0; i < password.length; i++) {

    var ascii = password.charCodeAt(i);

    //アルファベット小文字チェック
    if ((ascii >= 97) && (ascii <= 122)) {
      hasLower = true;
    }

    //アルファベット大文字チェック
    if ((ascii >= 65) && (ascii <= 90)) {
      hasUpper = true;
    }

    //数値チェック
    if ((ascii >= 48) && (ascii <= 57)) {
      hasNumber = true;
    }

    //記号チェック
    if (((ascii >= 33) && (ascii <= 47)) ||
        ((ascii >= 58) && (ascii <= 64)) ||
        ((ascii >= 91) && (ascii <= 96)) ||
        ((ascii >= 123) && (ascii <= 126))) {
        hasCharacter = true;
    }
  }

  //パターン判別  
  if (hasLower) {pattern++;}
  if (hasUpper) {pattern++;}
  if (hasNumber) {pattern++;}
  if (hasCharacter) {pattern++;}


  //パスワードレベル判定 

  //辞書に登録されている文字チェック
  var dictionary = ["password","qwerty","abc","admin","root","123"];

  for (i = 0; i < dictionary.length; i++) {
    if (password.indexOf(dictionary[i]) != -1) {
      level = 1;
      return level;
    }
  }

  //数値のみパスワードチェック
  if (password.match(/^[0-9]+$/)) {
    level = 1;
    return level;
  }

  if (password.length < 8) {
    level = 1;
  }
  if ((password.length >= 8) && (password.length < 14)) {
    level = 2;
  }
  if ((password.length >= 8) && (password.length < 14) && (pattern >= 2)) {
    level = 3;
  }
  if ((password.length >= 8) && (password.length < 14) && (pattern >= 3)) {
    level = 4;
  }
  if ((password.length >= 14) && (pattern < 3)) {
    level = 3;
  }
  if ((password.length >= 14) && (pattern >= 3)) {
    level = 5;
  }


  return level;
}


login.php

// phpinfo();

require_once("function.php");
session_start();
header("Content-type: text/html; charset=urf-8");


?>
<style>
a{
  text-decoration:none;
}
input{
  border-radius: 10px;
  -webkit-border-radius: 10px;
  -moz-border-radius: 10px;
}
</style>
<!DOCTYPE HTML>
<html lang="ja">
<body>

  <h1>LOG IN</h1>
<?php



  if($_SESSION["error_status"] == 1){
    echo "<h2 style='color:red'>IDまたはパスワードが異なります</h2>";
  }
  if($_SESSION["error_status"] == 2){
    echo "<h2 style='color:red'>不正なリクエストです。</h2>";
  }
$_SESSION["error_status"] = 0;
?>
<form action="login_check.php" method="post">

  ID<br /><input type="text" name="id"><br />
  PASS<br /><input type="password" name="password"><br />


  <input type="submit" value="login">
  <input type="reset" value="reset"><br />

 </form>

<a href="/register.php">新規登録</a><br />
<a href="/password_reset.php">パスワードリセット<br />

</body>
</html>

login_check.php

<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');

require_once("function.php");
session_start();
header("Content-type:text/html;charset=utf-8");

//パラメーター取得
$id = $_POST['id'];
$password = $_POST['password'];

//ログイン判定

//DB接続 ※
$dsn = 'mysql:dbname=portfolio;host=localhost;charset=utf8';
$user = 'root';
$password = '';
$dbh = new PDO($dsn,$user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

//プレースホルダでSQL作成
$sql= "SELECT * FROM USERS WHERE ID =? AND IS_USER =1;";

//パラメータの型指定
$stmt = $dbh->prepare($sql,array('text'));

//パラメータを渡してSQL実行
$rs = $stmt->execute(array($id));

$count= 0;


while($row = $stmt->fetch()){
  $id = $row["id"];
  $salt = $row["salt"];
  $db_password = $row["password"];
  $reset = $row["reset"];
  $count++;
}


$dbh = null;

//ログイン失敗
if($count !=1){
     $_SESSION["error_status"]=1;
     header("HTTP/1.1 301 Moved Permanently");
     header("Location: login.php");
     exit();
}

//パスワードリセット対応

if($reset == 1){
     $_SESSION["error_status"] =1;
     header("HTTP/1.1 301 Moved Permanently");
     header("Location: login.php");
     exit();
}

//パスワード生成
$hash = stretchedPassword($salt,$password);

if($hash == $db_password){
//ログイン成功

//セッション ID振り直し
     session_regenerate_id(true);

//セッションにID格納
$_SESSION['id']=$id;

//CSRFのトークン作成
$_SESSION["token"] = $get_csrf_token();

//DB接続
$dsn = 'mysql:dbname=portfolio;host=localhost;charset=utf8mb4';
$user = 'root';
$password = '';
$dbh = new PDO($dsn,$user,$password);
$dbh->setAttrbute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

//プレースホルダでSQL作成
$sql = "UPDATE USERS SET LAST_LOGIN_TIME = ? WHERE ID = ?";

//パラメータの型を指定
$stmt = $dbh->prepare($sql,array('timestamp','text'));

//パラメータを渡してSQL実行
$stmt->execute(array(date('Y-m-d H:i:s'),$id));

$dbh = null;

//リダイレクト
header("HTTP/1.1 301 Moved Permanently");
header("Location: welcome.php");
}else{
     $_SESSION["error_status"]=1;
     header("HTTP/1.1 301 Moved Permanently");
     header("Location: login.php");
}


print_r($_SESSION);

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

とりあえずこれで

$password = $_POST['password']; //DBのと被る💢
$pw = $_POST['password'];

$hash = stretchedPassword($salt,$pw);

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/08/10 21:45

    ありがとうございます!
    DB接続の部分が被っているのを見直さないで急いで投稿してしまいました・・・。申し訳ないです。
    (まだちゃんと動作しないので見直し沢山いりますが・・・)

    キャンセル

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

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

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