PHPでログイン処理のあとに、安全に元ページに戻すにはどうすればいいですか
Q&A
Closed
解決したいこと
PHPでログインを実装しているのですが、ログイン後にログイン前のページに遷移させるのに、URLとIDをデータベースに保存して、IDをGETパラメーターを使っていたのですが、DBが大きくなってしまっています。
また、Cronが出来ない環境です。
できればDBを使わない方法で安全に元ページにリダイレクトさせる方法があれば教えて下さい。
1
Q&A
Closed
PHPでログインを実装しているのですが、ログイン後にログイン前のページに遷移させるのに、URLとIDをデータベースに保存して、IDをGETパラメーターを使っていたのですが、DBが大きくなってしまっています。
また、Cronが出来ない環境です。
できればDBを使わない方法で安全に元ページにリダイレクトさせる方法があれば教えて下さい。
これはあくまでもやり方の一つとして参考にしてください。
全てのログインページに遷移するボタンやリンクにGETパラメータ「referrer」を付けてどこのページからログインページに飛んできたかをわかるようにしましょう。
ログインページに飛ばすリンクの例
<a href="./login.php?referrer="[現在のページのURL、もしくはそれを識別できる情報]">ログイン</a>
ログインは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"]);
}
以上参考になれば幸いです。
@Nsystem
Questioner
= $_GET["referrer"] ?>header('Location: '.$_POST["referrer"]);
XSS脆弱性が存在します。
このままコピペで使用してはいけません。
@Nsystem
Questioner