Есть ли «лучшие практики» в отношении того, как следует возвращать пользователя на свою исходную страницу после входа на ваш сайт, в частности, на PHP? например, если я просматриваю вопрос StackOverflow, пока вы не вошли в систему, как бы вы гарантировали, что я вернусь к этому вопросу, если я войду в систему?
Из моих исследований, кажется, много консультационных центров вокруг переменной $ _SERVER ['HTTP_REFERER']. В основном, вы принимаете к сведению референт и храните его в сеансе, а затем перенаправляете обратно на эту страницу, когда закончите.
Проблема в том, что HTTP_REFERER в лучшем случае ненадежна.
Это устанавливается пользовательским агентом. Не все пользовательские агенты установят это, а некоторые предоставляют возможность изменять HTTP_REFERER как функцию. Короче говоря, на это нельзя доверять.
– [ http://php.net/manual/en/reserved.variables.server.php]
Любые изменения для реферирования для перенаправления на другие области сайта будут обрабатываться с помощью стандартных разрешений на доступ. Если референт опустится, может быть принято просто перенаправить пользователя на главную страницу сайта, а не на страницу, из которой они пришли. Однако это кажется бесполезным для пользователя враждебным, и я надеялся, что будет лучший способ справиться с этим.
На странице входа:
<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']
может быть подделан пользователем в любое время, всегда следует рассматривать любую другую предоставленную пользователем переменную, правильно ее экранируя.
Было бы лучше, если бы вы сохранили последнюю посещенную страницу самостоятельно, возможно, с помощью сеанса.
Если пользователь впервые запрашивает страницу с вашего сайта, запустите новый сеанс и инициализируйте последний URI с текущим URI. Обновляйте этот последний URI всякий раз, когда запрашивается другая страница, пока не появится страница входа в систему. Теперь, если аутентификация прошла успешно, вы можете перенаправить пользователя в URI в последнем URI .
И если у вас есть форма входа на каждую страницу, используйте скрытый ввод, в котором хранится текущий URI.
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. Просто потому, что я нажимаю логин, это не значит, что я хочу вернуться к вопросу, который был последним.
Тем не менее, есть некоторые случаи, когда было бы правильно предположить, что человек хочет вернуться назад, например, если я поднял вопрос и получил всплывающее окно, сообщающее мне войти в систему. Если бы я нажал ссылку там, было бы безопасно предположить, что я хочу вернуться. Но только ссылка для входа в навигационную панель не имеет такого подразумеваемого значения.
Я бы предложил сделать вызов AJAX для входа в систему пользователя, и при успешном ответе AJAX просто обновите текущую страницу.