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

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

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

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

Ajax

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

Q&A

解決済

1回答

418閲覧

ajaxでpassword_verify()する場合

SugiuraY

総合スコア317

PHP

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

Ajax

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

0グッド

0クリップ

投稿2019/01/22 13:06

下記のように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);
}

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

php

1//form.php 2<form id="login" class="login-form>" action="" method="POST"> 3 <input type="hidden" name="login" value="login_catch"> 4 <input type="text" name="loginname" id="login_username" class="register_text" placeholder="ユーザ名"/> 5 <input type="password" name="loginpw" id="login_pass" class="register_text" placeholder="パスワード"/> 6 <button form="login" class="login_button"type="button" name="">ログインする</button> 7</form> 8 9 10$(function(){ 11 $('.login_button').on('click',function(){ 12 const login_username = $('#login_username').val(); 13 const login_pass = $('#login_pass').val(); 14 $.ajax({ 15 type:'POST', 16 url:'32_logindupulicate.php', 17 datatype:'json', 18 data:{ 19 transfer_login_username:login_username, 20 transfer_login_pass:login_pass 21 } 22 }) 23 .then( 24 function(data){//success 25 if(data=="disagree"){ 26 $('.messagebox').append("<p>パスワードと名前が一致しません</p>"); 27 } 28 }, 29 function(){//pattern fail 30 alert('通信に失敗しました、通信環境を確認してください'); 31 } 32 ) 33 }) 34}) 35

php

1//ajax.php 2 3if ($_POST['transfer_login_username'] || $_POST['transfer_login_pass']){ 4 $pass=$_POST['transfer_login_pass']; 5 include('./z_common_pdo.php'); 6 try{ 7 $pdo->beginTransaction(); 8 try{ 9 $stmt = $pdo->prepare('SELECT password FROM user_table where username=:uname'); 10 $stmt->bindParam(':uname',$_POST['transfer_login_username'],PDO::PARAM_STR); 11 $stmt->execute(); 12 $result=$stmt->fetch(PDO::FETCH_ASSOC); 13 $pdo->commit(); 14 }catch(PDOException $e){ 15 $pdo->rollback(); 16 throw $e; 17 } 18 }catch(PDOException $e){ 19 exit('データベース接続失敗。'.$e->getMessage()); 20 } 21 $hantei=(password_verify($_POST['transfer_login_pass'],$result['password'])); 22 if ($hantei) { 23 //?? 24 }else{ 25 echo "disagree"; 26 } 27}else{ 28 echo "<p>無効な処理です、リダイレクトします。</p>"; 29}

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

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

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

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

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

wwbQzhMkhhgEmhU

2019/01/22 17:37

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

2019/01/22 23:28

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

2019/01/23 01:48

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

2019/01/23 03:37

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

回答1

0

ベストアンサー

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

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

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

投稿2019/01/24 13:33

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

SugiuraY

2019/01/24 15:05

コメントをいただきありがとうございます。 やはり、JSでリダイレクトする処理は一般的なのですね。 一点気になったのですが、提示したコードからは 1.csrf対策や 2.ログインに連続失敗した場合の一定時間凍結 これらはセキュリティ対策は入れているのですが、それ以外、ログイン実装で常識的に入れるべき対策等があるのでしょうか? 古い記事ですが、こういったものを参考にしながら実装していたのですが 指摘を受けるとちょっと怖くなってきたので、ご意見があればアドバイスをいただけるととても嬉しいです。 https://www.websec-room.com/2015/03/15/2153 よろしくお願い申し上げます。
退会済みユーザー

退会済みユーザー

2019/01/25 12:51 編集

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

2019/01/25 12:16

コメントありがとうございます。 実はPHPを初めて触った際にLaravelからスタートしたのですが、どうしても途中で理解ができなくなったので、現状積極的にPurePHPで学ぼうと心がけております。フレームワークがとても便利であることは諸先輩がたからよく聞いているので、いつかは学びたいと思っています。 セッションIDの再割当てはsession_regenerate_id()ですね。 実装してみようと思います。また入力値の検証、空の値だけではなく、どのような観点でチェックすべきかについて調べてみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問