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

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

ただいまの
回答率

89.20%

データベース接続等のコード書き換え

解決済

回答 1

投稿 編集

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

yuus2733

score 111

https://www.websec-room.com/2015/03/15/2153
こちらのサイトを参考に安全なログインとパスワードのシステムを書き換えて、
理解とポートフォリオの作成を進めています。
データベース接続にMDB2では既に脆弱性があるため現在はPDOが推奨という事で、
「気づけばプロ並PHP」等を参考に書き換えました。
書き換え後の物に不備や、足りない機能があったら教えていただきたいです。
8/6追記
不要と言われた書き換え前を削除し、
インデントやスペースをなるべく統一しました。
一応下記のソースでエラーは出なくなりましたが、問題がありましたらご指摘ください。

書き換え後login_check.php

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

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);

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

$count=0;

while($row=$rs){
  $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=utf8';
$id = '';
$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 = $db->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ベストアンサー

+2

「書き換え前」のPHPを載せた意味はありますか?

もし、本当に書き換え前と書き換え後で、
人に比較して見てもらう事が前提であれば、
インデントや空白等、「修正しすぎ」です。

もちろん、書き換え後で動けば良いのですが、
確認する側の手間を考えるのも必要です。

個人プレイでの開発だったり、
完全お任せ部分の開発(こういうteratail等にも頼らずに開発できる場合)であれば良いですが、
チームで開発しているのであれば、こういう修正の仕方はしない方が良いですよ。

データベース接続等のコード書き換え
書き換え後の物に不備や、足りない機能があったら

⇒そもそも、動いてますか?
動いてない場合、その旨記述した方が良いですよ。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/08/04 20:14

    インデント、スペースが詰まっていて見辛い、ということですか?
    でしたら申し訳ないです。取り急ぎ手打ちでひたすら打ち込んでたので意識してませんでした。
    スペースとインデントの付け方は大体どういう風にするのが互いに見やすいのでしょう?一応インデントはスペース使う事だけは意識してます。
    動作確認はもう少し後のファイルも作ってからする予定です。

    キャンセル

  • 2017/08/04 21:50

    > 取り急ぎ手打ちでひたすら打ち込んでた
    ⇒なるほど・・・そういう事でしたか。

     修正前と修正後を載せるのであれば、
     極力、「ここを修正しました。」と分かるように、
     「修正箇所以外はいじらない」ようにしてほしかっただけです。
     
     開発中に、Winmerge等の比較ツールは使っていますか?
     もし、使っていなければ、何でも良いので、比較ツールを使ってみてください。
     第3者としてみると、DB接続やSQL周りだけ差異があれば良いはずが、
     他のどうでも良いところまで修正されていて、???となります。

     今回のように、完全に書き換えているのであれば、
     むしろ、修正前のコードは不要でも良いくらいです。

    > 動作確認はもう少し後のファイルも作ってからする予定です。
    ⇒現時点で既にエラーが出るハズです。
     最初に
    ```php
    ini_set('display_errors', 1);
    error_reporting(E_ALL);
    ```
     最後に
    ```php
    print_r($_SESSION);
    ```
     等を追加するなどして、質問で丸投げする前に、
     ご自身で動かしてみた方が、
     yuus2733さんも理解が深まると思います。

    キャンセル

  • 2017/08/05 18:45

    不要と言われたソースコードを削除し、エラーが出なくなる程度は修正しました。
    問題のある個所等ありましたらご指摘お願いします。

    キャンセル

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

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

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