Я прочитал несколько сообщений, относящихся к перенаправлению на предыдущую страницу при входе пользователя в систему / etc. и большинство упоминало, что получение URL предыдущей страницы через HTTP_REFERRER является ненадежным / небезопасным.
Мой вопрос, могу ли я добавить немного информации в конец URL, скажем, login.php?referrer=main
или же login.php?referrer=prof
и полагаться на такие переменные, чтобы они не были подделаны, CRSF, изменены каким-либо образом?
Будет ли POST лучше / хуже? Есть ли надежный / безопасный способ добиться того, чего я добиваюсь?
По сути, я пытаюсь найти лучший способ получить ссылающуюся страницу в PHP, чтобы ее можно было перенаправить без риска злонамеренных намерений, вызывающих сбои в работе сайта.
ТИА.
РЕДАКТИРОВАТЬ: Сценарий:
Пользователь заходит на страницу комментария, но для того, чтобы оставить комментарий, необходимо войти в систему, поэтому login to comment
ссылка будет размещена на странице. Когда пользователь нажимает login to comment
ссылка, ее целью будет login.php? comment20303, после посещения страницы входа в систему и предоставления верифицированных учетных данных, они должны быть возвращены на страницу comment20303, с которой они были созданы до входа в систему.
REEDIT: Мой вопрос сводится к тому, добавляет ли URL-адрес перенаправления на страницу входа в систему, получает к нему доступ через GET и повторно использует его, чтобы вернуть их на безопасную исходную страницу? Из комментариев ниже видно, что ответ — нет, не без проверок достоверности.
Часто я помещаю ссылающуюся страницу в скрытое поле в моей форме
<input type="hidden" name="ref" value="login.php"/>
Затем на моей целевой странице я буду использовать реферал с установленными переменными get, чтобы сообщить странице входа в систему, почему она была перенаправлена обратно.
$ref = trim(strip_tags($_POST['ref']));
//something causes an error (incorrect password maybe)======
$error = "true";
$msg = urlencode("Login Incorrect");
//no harm in putting the referring page in the GET but I don't think you need it for a login process.
header('location: '.$ref.'?error='.$error.'&msg='.$msg);
die();
Вернувшись на страницу входа, я обработаю ошибку, если она установлена, которая говорит мне, что я пришел из цели формы, и произошла ошибка
if (isset($_GET['error']) && $_GET['error'] == "true"){
$error = true;
$msg = trim(strip_tags($_GET['msg']));
//Echo out the msg if it is set somewhere in your HTML
}
Я предпочитаю использовать POST при отправке формы. GET проще всего использовать для перенаправления.
РЕДАКТИРОВАТЬ: на основе вашего комментария
Всегда обрезать и раздеть GET
Других решений пока нет …