Где хранить обратный URL в форме входа / контроллере

Мне интересно, как лучше всего обращаться с обратным URL в форме входа в систему. Я думаю, что хороший способ, вероятно, как это делается здесь. То есть urlencode для текущего URL и отправки его в качестве параметра get на контроллер входа в систему.

Затем это может быть закодировано в контроллере входа. Но что тогда? Я посмотрел страницу входа в Stackru и нигде не смог найти этот URL. Где это хранится? Как он узнает, куда идти после входа в систему? Это хранится в куки? Переменная сеанса? Или что-то другое?

Я думаю, что все может быть сделано немного иначе, чем в PHP, но в любом случае. Какой хороший способ сделать это?

2 ответа

Решение

Если это статический URL, то вы можете включить его в форму как скрытое поле, а затем перенаправить на него в своем коде, т.е.

<input type='hidden' name='return' value='/thankyou.html' />

Тогда в вашей функции отправки...

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

В производственной среде вы, очевидно, захотите зашифровать URL-адрес в скрытом поле, а затем расшифровать его и проверить как хороший URL-адрес перед вызовом функции header(), но это должно дать вам представление.

Некоторые люди используют куки, другие имеют таблицу поиска в БД. На самом деле не имеет значения, где вы храните URL-адрес, просто важно очистить его перед заголовком ().

РЕДАКТИРОВАТЬ: Scrubbing

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-адрес и т. Д.) С данными, поступающими через форму. Кто-то может манипулировать этим скрытым полем и вставлять код в ваше приложение или базу данных, будучи хитрым. Есть тысячи постов с примерами того, что люди будут делать через инъекцию форм.

Если бы это был я, я бы установил обратный 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 stackru) 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();
    }
}
Другие вопросы по тегам