Где хранить обратный 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();
}
}