редирект — Как правильно использовать $ _SERVER [‘HTTP_REFERER’] в php?

Допустим, у меня есть две страницы page1.php а также page2.php и я хочу page2.php отображаться только в том случае, если это перенаправленная форма page1.php и я вставил этот код page2.php

if($_SERVER['HTTP_REFERER'] == "page1.php")
{
//keep displaying page2.php
}else{
//if it is not redirected from page1.php
header('Location:page1.php')
//redirect the user back to page1.php
}

этот код работал нормально, пока у меня нет формы и кнопки отправки page2.php при нажатии кнопки отправки страница обновляется, что означает HTTP_REFERER изменится на page2.php Так что мой if statement не удается, и это возвращает меня к page1.php Я не хочу, чтобы это случилось. Есть ли способ предотвратить это?

Заранее спасибо.

0

Решение

Я бы не рекомендовал использовать HTTP_REFERER:

  1. Это довольно просто манипулировать в браузере.

  2. Некоторые пользователи могут иметь настройки безопасности в своем браузере, чтобы вообще не отправлять этот заголовок.

  3. Это не доступно через HTTPS.

  4. Некоторые прокси удаляют этот заголовок из запроса

  5. добавлено — см. ответ на этот вопрос


Как Шарлотта Дюнуа заявила в комментарии, лучше установить значение сеанса перед отправкой формы, а затем проверить его на странице 2.

page1.php:

$_SESSION[ 'display_page2' ] = TRUE;
//rest of the content

page2.php:

if ( (isset( $_SESSION[ 'display_page2' ] ) && $_SESSION[ 'display_page2' ] === TRUE ) || isset( $_POST[ 'some_form_input' ] ) ) {
//keep displaying page2.php
} else {
header('Location:page1.php');
exit;
}

С isset( $_POST[ 'some_form_input' ] ), вы можете проверить, была ли отправлена ​​форма (через метод POST).

При необходимости вы можете отменить сеанс с unset( $_SESSION[ 'display_page2' ] ); или установив его на другое значение.

3

Другие решения

<?php
if(($_SERVER['HTTP_REFERER'] == "page1.php") || (isset($_POST['submit']) && $_SERVER['HTTP_REFERER']=="page2.php"))
{
//keep displaying page2.php
}else{
//if it is not redirected from page1.php
header('Location:page1.php');
//redirect the user back to page1.php
}

?>

если реферер не страница 1, вы можете проверить условие, если реферер = страница2 и сообщение отправлено.
или проверьте, является ли реферал page1 или отправлено сообщение.
Это возможность избежать вашей проблемы.

1

Я советую не использовать $_SERVER['HTTP_REFERER'] как это может быть легко подделано.

Вместо этого вы можете установить печенье когда они загружают страницу 1, используя setcookie("page1", 1); до любая разметка выводится. Затем проверьте это на странице 2, используя

if(isset($_COOKIE['page1']))
{
//keep displaying page2.php
}else{
//if it is not redirected from page1.php
header('Location:page1.php')
//redirect the user back to page1.php
}

Не указав дату истечения срока действия, cookie истекает при закрытии браузера. В этой ситуации использование файлов cookie также делает код более читабельным для других.

1

<?php

/*
this page allows links from the following pages

public.php?id=links
private.php?id=links

don't allow if visitors come from anywhere else

this example would only work if I used the entire URL in the 'if' statement
*/

$referringpage = $_SERVER['HTTP_REFERER'];

if ( $referringpage == "http://www.example.com/public.php?id=links" ) {
$pass = "yes";
} elseif ( $referringpage == "http://www.example.com/private.php?id=links" ) {
$pass = "yes";
} else {
$pass = "no";
}if ( $pass == "yes" ) {
// do the function this page was made to do
}

header( "Location: http://www.example.com/public.php?id=links" );

?>
0
По вопросам рекламы [email protected]