Nsystem
@Nsystem

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

PHPでログイン処理のあとに、安全に元ページに戻すにはどうすればいいですか

Q&A

Closed

解決したいこと

PHPでログインを実装しているのですが、ログイン後にログイン前のページに遷移させるのに、URLとIDをデータベースに保存して、IDをGETパラメーターを使っていたのですが、DBが大きくなってしまっています。
また、Cronが出来ない環境です。
できればDBを使わない方法で安全に元ページにリダイレクトさせる方法があれば教えて下さい。

1

2Answer

これはあくまでもやり方の一つとして参考にしてください。

遷移元を特定できるようにする

全てのログインページに遷移するボタンやリンクにGETパラメータ「referrer」を付けてどこのページからログインページに飛んできたかをわかるようにしましょう。

ログインページに飛ばすリンクの例


<a href="./login.php?referrer="[現在のページのURLもしくはそれを識別できる情報]">ログイン</a>

ログイン画面でreferrerを取得し、ログイン認証に渡す

ログインはPOSTで渡すと思うのでIDやパスワードの項目と一緒にGETパラメータから取得したreferrerをtype="hidden"のinputを使って渡します。


<form action="auth.php" method="post">
    <input type="text" name="id">
    <input type="password" name="password">
    <input type="hidden" name="referrer" value="<?= $_GET["referrer"] ?>">
    <input type="submit" value="ログイン">
</form>

ログイン成功後に遷移元に戻る

ログイン認証が成功したらPOSTパラメータからreferrerを取得し、ログイン元のサイトへリダイレクトします。


header('Location: '.$_POST["referrer"]);

以下私がこれを書くにあたって書いたコードです。

ファイル名:example_site.php

一番最初に開くページです。


<?php
session_start();
?>
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>example site</title>
</head>
<body>
ログイン状態:
<?php
if(isset($_SESSION["login_id"])){
    echo $_SESSION["login_id"]."でログイン中です。";
}else{
	echo "ログインしていません。";
	echo "<br>";
	echo "<a href='./login.php?referrer=example_site.php'>ログイン</a>";
}
?>
</body>
</html>

ファイル名:login.php

ログイン画面です。
referrerを取得し、次のページに飛ばす必要があるのでphpファイルで作ります。


<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>login site</title>
</head>
<body>
<form action="auth.php" method="post">
    <input type="text" name="id">
    <input type="password" name="password">
    <input type="hidden" name="referrer" value="<?= $_GET["referrer"] ?>">
    <input type="submit" value="ログイン">
</form>
</body>
</html>

ファイル名:auth.php

ログイン認証処理を行うphpのみのファイルです。


<?php

//認証処理
    //ここで認証処理を行う

	//認証OK
	if(true){
		session_start();
		$_SESSION["login_id"]=$_POST["id"];
	    header('Location: '.$_POST["referrer"]);
	}else{
	//認証NG
        header('Location: ./login.php?status=ng&referrer='.$_POST["referrer"]);
	}

以上参考になれば幸いです。

0Like

Comments

  1. @Nsystem

    Questioner

    セッションに保存した識別IDをログインページに渡すように実装してみます。
    回答ありがとうございますm(__)m
= $_GET["referrer"] ?>

header('Location: '.$_POST["referrer"]);

XSS脆弱性が存在します。
このままコピペで使用してはいけません。

0Like

Comments

  1. @Nsystem

    Questioner

    IDと遷移先をセッションにいれてから、IDをログインページに渡すことにしました。
    ご指摘ありがとうございました。

Your answer might help someone💌