Где хранить обратный URL в форме входа / контроллере - PullRequest
1 голос
/ 08 сентября 2010

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

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

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

Ответы [ 2 ]

1 голос
/ 08 сентября 2010

Если бы это был я, я бы установил обратный 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 голосов
/ 08 сентября 2010

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

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

Затем в функции отправки ...

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

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

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

РЕДАКТИРОВАТЬ: Очистка

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

...