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

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

ただいまの
回答率

90.38%

  • PHP

    25048questions

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

  • Ajax

    1385questions

    Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

ajaxでpassword_verify()する場合

解決済

回答 1

投稿

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

SugiuraY

score 214

下記のようにform.phpでユーザーが「ユーザー名」と「パスワード」を入力して、非同期でサーバーサイドで
verifyして一致しなければjsのdataに"disagree"が格納され、非同期でエラーメッセージが出力されます。

1)このように非同期でverifyしてエラーメッセージを出力するのは実務的によく使用される方法なのでしょうか。もちろんあえてajaxを使わずにサーバーサイドで直接判定をしても良いのですが、このような方法が参考書にあったため、実務的な側面でアドバイスをいただけると嬉しいです。

2)仮にajaxで非同期で判定した場合、verifyした結果、名前とpassが一致したとして、$hanteiにtrueが格納された後の処理がどのようにすれば良いかわかりません。実際の処理としてはform.phpではないトップページのtop.phpにリダイレクトされるとともに、ユーザー名をsession['user']にユーザー名を格納した状態でユーザー名がセッションが生きている限り表示されるような仕様にしたいのですがどのようにしたら良いのでしょうか。

以下のようなコードでリダイレクトした場合では
ajaxで通信エラーが発生します

$hantei=(password_verify($_POST['transfer_login_pass'],$result['password']));
if ($hantei) {
$url = 'https://www.yahoo.co.jp/';
header('Location:'.$url, true , 301);
}

よろしくお願い申し上げます。

//form.php
<form id="login" class="login-form>" action="" method="POST">
  <input type="hidden" name="login" value="login_catch">
  <input type="text" name="loginname" id="login_username" class="register_text" placeholder="ユーザ名"/>
  <input type="password" name="loginpw" id="login_pass" class="register_text" placeholder="パスワード"/>
  <button form="login" class="login_button"type="button" name="">ログインする</button>
</form>


$(function(){
  $('.login_button').on('click',function(){
     const login_username = $('#login_username').val();
     const login_pass = $('#login_pass').val();
     $.ajax({
         type:'POST',
         url:'32_logindupulicate.php',
         datatype:'json',
         data:{
           transfer_login_username:login_username,
           transfer_login_pass:login_pass
         }
        })
        .then(
          function(data){//success
            if(data=="disagree"){
               $('.messagebox').append("<p>パスワードと名前が一致しません</p>");
             }
          },
          function(){//pattern fail
            alert('通信に失敗しました、通信環境を確認してください');
          }
       )
  })
})
//ajax.php

if ($_POST['transfer_login_username'] || $_POST['transfer_login_pass']){
   $pass=$_POST['transfer_login_pass'];
      include('./z_common_pdo.php');
          try{
            $pdo->beginTransaction();
                  try{
                   $stmt = $pdo->prepare('SELECT password FROM user_table where username=:uname');
                   $stmt->bindParam(':uname',$_POST['transfer_login_username'],PDO::PARAM_STR);
                   $stmt->execute();
                   $result=$stmt->fetch(PDO::FETCH_ASSOC);
                   $pdo->commit();
                  }catch(PDOException $e){
                   $pdo->rollback();
                   throw $e;
                  }
          }catch(PDOException $e){
            exit('データベース接続失敗。'.$e->getMessage());
          }
          $hantei=(password_verify($_POST['transfer_login_pass'],$result['password']));
            if ($hantei) {
              //??
            }else{
              echo "disagree";
            }
}else{
  echo "<p>無効な処理です、リダイレクトします。</p>";
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • wwbQzhMkhhgEmhU

    2019/01/23 02:37

    この辺は全然知らないのですが、とりあえず意見だけ書いておきます。
    (1)はいろいろです。実際セキュリティ絡みの話なので、一般的にコレ、みたいなのはあまりありません。サーバーサイドで直接判定した場合、ログイン失敗しても再度ログイン画面をリロードしないといけません。ajaxにすると、ログイン失敗時は画面遷移させずに一部にエラーを表示させ、ログイン成功時だけ画面遷移するという形に実装できます。
    (2)何を言っているのかよく分かりませんが、ajaxは画面遷移を発生させないので、リダイレクトとかさせても画面の書き換えにはなりません。現状のページのurlをトップページに書き換えれば大丈夫です。ただ、ajaxの応答で得たクッキーやその他の認証用セッションデータを、トップページ含む要認証ページでどう妥当性判定するのか不明なので、その部分は考慮してません。
    以上参考までに。

    キャンセル

  • SugiuraY

    2019/01/23 08:28

    コメントありがとうございます。
    まさに、現在のURLをトップページに書き換えるという点がわからず、ajaxを使用した場合、どのファイルにどのような方法で実装できるのかがアイデアが思い浮かばないのですが、アドバイスを願えますでしょうか。度々、恐れ入りますが宜しくお願い申し上げます。

    キャンセル

  • wwbQzhMkhhgEmhU

    2019/01/23 10:48

    form.phpで、ajax成功時、最後に
    window.location.href="どっか.php";
    とかだと思います。

    キャンセル

  • SugiuraY

    2019/01/23 12:37

    ありがとうございます。
    js側でページの移動はセキュリティ上望ましくなく、サーバー側で処理すべきと盲信していたのですが、実務的にありなんですね、有難うございます。

    キャンセル

回答 1

checkベストアンサー

+1

そもそもログインシステムで実装すべきセキュリティ対策がなされていないので、回答自体、どうでも良い内容になりますが^^;

form.phpではないトップページのtop.phpにリダイレクト

ajax の then 処理の中にリダイレクト処理を入れればよいです。
リダイレクト先で、session の中身を確認して、ログイン中かどうかを判定します。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/01/25 00:05

    コメントをいただきありがとうございます。
    やはり、JSでリダイレクトする処理は一般的なのですね。

    一点気になったのですが、提示したコードからは
    1.csrf対策や
    2.ログインに連続失敗した場合の一定時間凍結

    これらはセキュリティ対策は入れているのですが、それ以外、ログイン実装で常識的に入れるべき対策等があるのでしょうか?

    古い記事ですが、こういったものを参考にしながら実装していたのですが
    指摘を受けるとちょっと怖くなってきたので、ご意見があればアドバイスをいただけるととても嬉しいです。
    https://www.websec-room.com/2015/03/15/2153

    よろしくお願い申し上げます。

    キャンセル

  • 2019/01/25 09:49 編集

    キーワードとして、「セッションIDの再割当て」がないとか気になります。
    あとは、セキュリティと直結するわけではないですが、「入力値の検証」を行っていないのも、外部にさらされる入力としてはありえないかと。
    フレームワーク使用したほうが良いですよ。

    キャンセル

  • 2019/01/25 21:16

    コメントありがとうございます。
    実はPHPを初めて触った際にLaravelからスタートしたのですが、どうしても途中で理解ができなくなったので、現状積極的にPurePHPで学ぼうと心がけております。フレームワークがとても便利であることは諸先輩がたからよく聞いているので、いつかは学びたいと思っています。

    セッションIDの再割当てはsession_regenerate_id()ですね。
    実装してみようと思います。また入力値の検証、空の値だけではなく、どのような観点でチェックすべきかについて調べてみようと思います。

    キャンセル

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

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

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

  • PHP

    25048questions

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

  • Ajax

    1385questions

    Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。