1


1

ログインフォーム/コントローラーの戻りURLを保存する場所

ログインフォームで戻りURLを最適に処理する方法を知りたいです。 良い方法はおそらくここで行われる方法だと思います。 つまり、現在のURLをurlencodeし、getパラメーターとしてログインコントローラーに送信します。

これは、ログインコントローラーでURLデコードできます。 しかしそれでは? StackOverflowのログインページを見ましたが、どこにもそのURLが見つかりませんでした。 どこに保管されていますか? ログインが完了すると、どこに行くべきかをどのように知るのですか? Cookieに保存されていますか? セッション変数? または、他の何か?

私は物事がPHPとは少し違う方法でできると思いますが、とにかく。 これを行うための良い方法は何ですか?

2 Answer


1


私なら、セッションでリターンURLを設定します。 これにより、適切なURLを計算し、プレゼンテーションレイヤーとは別にすることができます。 リターンURLが設定され、ポストオブジェクトが存在することを検出すると、ロケーションヘッダーを設定してスクリプトを終了できます。 例…​

// You have the URL to return to (could be a constantly updated session variable
// or simply set when a certain page is accessed via HTTP_REFERRER - it's open)
// in a MVC application (like stackoverflow) you could add this to the controller
// for any view with return functionality.
$_SESSION['RETURN_URL'] = $Url;

// Now you have validated and processed a form (from the model). If there is a
// return url set, we redirect to it. Otherwise, we follow the default action of
// the form
if ($FormValidatedAndSubmitted)
    returnToURL();

function returnToURL(){
    if (isset($_SESSION['RETURN_URL'])){
     header("Location: " . $_SESSION['RETURN_URL']);
     unset($_SESSION['RETURN_URL']);
     exit();
    }
}


0


静的URLの場合は、非表示フィールドとしてフォームに含めることができ、コードでリダイレクトできます。


次に、送信機能で…​

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

本番環境では、明らかに非表示フィールドのURLを暗号化し、それを復号化し、header()関数を呼び出す前に適切なURLとして検証することをお勧めします。

Cookieを使用する人もいれば、DBにルックアップテーブルを持っている人もいます。 URLの保存場所は実際には関係ありません。header()する前にスクラブすることが重要です。

編集:スクラブ

function isValidURL($url) {
   return preg_match('|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$|i', $url);
}

if ( isValidURL($_POST['return']) )
    header("Location: {$_POST['return']}");

前にも述べたように、さらに注意したい場合は、フォームに表示する前および検証の前に実際のURLを暗号化/復号化できます。 優れた暗号化/復号化ライブラリがたくさんあります。

持ち帰りのレッスンでは、フォームを介して送られてくるデータを実際に「何もしない」(データベースへの値の挿入、シェルコマンドの実行、URLへのリダイレクトなど)ことはしません。 誰かがその隠れたフィールドを操作し、注意を払うことでコードをアプリまたはdbに挿入できます。 フォームインジェクションによって人々が行うことの例の投稿が何千もあります。