2009-12-31 6 views
4

Есть ли «лучшие практики» относительно того, как следует возвращать пользователя на свою исходную страницу после входа на ваш сайт, в частности, на PHP? например если я просматриваю вопрос StackOverflow во время входа в систему, как бы вы гарантировали, что я вернусь к этому вопросу, если я войду в систему?PHP: возвращение пользователя на свою исходную страницу после входа в систему

Из моих исследований, кажется, много советов вокруг переменной $ _SERVER ['HTTP_REFERER']. В основном, вы принимаете к сведению референт и храните его в сеансе, а затем перенаправляете обратно на эту страницу, когда закончите.

Проблема в том, что HTTP_REFERER в лучшем случае ненадежна.

Это настраивает пользовательский агент. Не все пользовательские агенты установят это, а некоторые предоставляют возможность изменять HTTP_REFERER как функцию. Короче говоря, на это нельзя доверять.
— [http://php.net/manual/en/reserved.variables.server.php]

Любые изменения в реферер для перенаправления на другие разделы сайта будут обработаны с помощью обычных разрешений проверок. Если референт опустится, может быть принято просто перенаправить пользователя на главную страницу сайта, а не на страницу, из которой они пришли. Однако это кажется бесполезным для пользователя враждебным, и я надеялся, что будет лучший способ справиться с этим.

ответ

6

На странице входа:

<form action="controller/LoginController" method="post"> 
<?php 

if (isset($_SERVER['HTTP_REFERER'])) { 
    echo '<input type="hidden" name="l" value="'.htmlspecialchars($_SERVER['HTTP_REFERER']).'" />'; 
} 

?> 
<!-- the rest of the form --> 
<input type="submit" /> 
</form> 

На контроллере входа в систему, вы берете в стоимости $_POST['l'] и увидеть ли этот URL на вашем собственном веб-сайте. Если это не так, перенаправляйте на страницу по умолчанию, иначе перенаправляйте на этот URL.

Убедитесь, что на вашей странице входа в систему, если пользователь уже вошел в систему, вы перенаправляете пользователя на домашнюю страницу или что-то в этом роде. Это предотвратит такие случаи, как перенаправление для входа в систему.

$_SERVER['HTTP_REFERER'] ответственность производителя. Это также в большинстве случаев довольно надежное. Если браузер не отправляет, или если вы беспокоитесь об этом, вы можете использовать сеанс.

на каждой странице просто установите $_SESSION['lastvisitpage'] на текущий URL страницы. При входе в систему вы переадресовываете на $_SESSION['lastvisitpage'].

С $_SERVER['HTTP_REFERER'] может быть сфальсифицирован пользователем в любое время, всегда следует обращаться к любой другой пользовательской переменной, надлежащим образом экранируя ее.

+1

Итак, HTTP_REFERER * - это стандартный способ сделать это? Мне нравится идея использования переменной сеанса 'lastpage' в качестве резервной копии для случая пустого реферирования. Благодаря! – AgentConundrum

+2

проблем нет. Но будьте осторожны с методом SESSION, потому что вы никогда не знаете, открыл ли пользователь несколько вкладок вашего сайта в своем браузере. Если это ответы, поставьте галочку, чтобы другие знали =) – mauris

+0

Хорошая точка (несколько вкладок). Кажется, он работает лучше всего с несколькими резервными копиями. Если есть скрытый элемент формы, используйте его. Если нет, проверьте HTTP_REFERER на странице входа и используйте это. Если это тоже пусто, либо используйте то, что сеанс говорит о последней странице, либо отбрасываете пользователя на главную страницу. Может возникнуть вопрос о том, какой из этих двух вариантов обеспечивает лучший пользовательский опыт. «Главная страница», вероятно, менее запутанна, чем быть нажатой на страницу, которую вы открыли на другой вкладке, но это худший опыт в случае отдельных вкладок, где «Последняя страница» является надежной. – AgentConundrum

0

Я бы предложил сделать вызов AJAX для входа в систему пользователя, и при успешном ответе AJAX просто обновите текущую страницу.

+0

, вы не можете сделать такую ​​важную функцию зависимой от Javascript, если только у вас нет надежной резервной копии Javascript-fail. – mauris

+0

Я бы в значительной степени повторил то, что сказал @thephpdeveloper. Мне бы очень хотелось, чтобы все работало хорошо, когда javascript недоступен. – AgentConundrum

+0

Я предпочитаю вызов AJAX, но у меня также есть стандартная страница входа, если Javascript не загружается. Однако страница перенаправляется на главную страницу. Нет Javascript = Без сохранения вашего местоположения. –

3

Было бы лучше, если бы вы сохранили последнюю посещенную страницу самостоятельно, возможно, с помощью сеанса.

Если пользователь запрашивает страницу с вашего сайта в первый раз, запустите новый сеанс и инициализируйте last-URI с текущим URI. Обновите этот last-URI всякий раз, когда запрашивается другая страница, пока не появится страница входа в систему. Теперь, если аутентификация прошла успешно, вы можете перенаправить пользователя на URI в last-URI.

И если у вас есть форма для входа на каждую страницу, используйте скрытый ввод, в котором хранится текущий URI.

+2

-1: См. Другие вопросы по проблеме с несколькими вкладками. –

1
if(user_not_logged_in()) 
{ 
    $link = "http://example.com/login?continue=path/to/current/page"; 
    echo '<a href="'.$link.'">Loign</a>'; 
} 

Так я и такие сайты, как Google, делает это. Вам нужно будет убедиться, что вы проверите переменную continue и сначала очистите ее от странных URL.

Другой вариант - использовать AJAX и разрешить пользователю входить в систему с любой страницы. Пользователь регистрируется, вы отправляете форму через AJAX, обновляете, когда запрос возвращается.


Я думаю, вы можете спросить, если пользователь специально нажимает на ссылку для входа в меню, вы автоматически думать о том, что пользователь хочет быть перенаправлены на страницу, которую они нажали кнопку с. Это я считаю недостатком в логике. Возьмите StackOverflow. Просто потому, что я нажимаю логин, это не значит, что я хочу вернуться к вопросу, который был последним.

Однако есть некоторые случаи, когда было бы правильно предположить, что человек хочет вернуться назад, например, если бы я поднял вопрос и получил всплывающее окно, сообщающее мне войти в систему. Если бы я нажал ссылку там, было бы безопасно предположить, что я хочу вернуться. Но только ссылка для входа в навигационную панель не имеет такого подразумеваемого значения.