Hoe gebruik je $_SERVER[‘HTTP_REFERER’] correct in php?

Stel dat ik twee pagina’s page1.phpen page2.phpheb en ik wil dat page2.phpalleen wordt weergegeven als dat zo is omgeleid formulier page1.phpen ik heb deze code ingevoegd in 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 
}

deze code werkte prima totdat ik een formulier en een verzendknop heb op page2.phpwanneer op de verzendknop wordt geklikt, wordt de pagina vernieuwd, wat betekent dat de HTTP_REFERERverandert in page2.phpdus mijn if statementmislukt en het brengt me terug naar page1.phpik wil niet dat dat gebeurt. Is er een manier om dit te voorkomen?

Bij voorbaat dank.


Antwoord 1, autoriteit 100%

Ik zou het gebruik van HTTP_REFERERniet aanraden:

  1. Het is vrij eenvoudig te manipuleren in de browser.

  2. Sommige gebruikers hebben mogelijk beveiligingsinstellingen in hun browser om deze header helemaal niet te verzenden.

  3. Het is niet toegankelijk via HTTPS.

  4. Sommige proxy’s verwijderen deze header uit het verzoek

  5. Toegevoegd – zie antwoord op deze vraag


Zoals Charlotte Dunois in de opmerking aangaf, kun je beter de sessiewaarde instellen voordat je het formulier verzendt en het vervolgens op pagina 2 controleren.

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;
}

Met isset( $_POST[ 'some_form_input' ] )kunt u controleren of het formulier is verzonden (via POST-methode).

Wanneer nodig kunt u de sessie uitschakelen met unset( $_SESSION[ 'display_page2' ] );of door deze op een andere waarde in te stellen.


Antwoord 2, autoriteit 27%

Ik raad het gebruik van $_SERVER['HTTP_REFERER']af omdat het gemakkelijk kan worden vervalst.

In plaats daarvan zou je een cookiekunnen instellen wanneer ze pagina 1 laden met setcookie("page1", 1);voordateen opmaak wordt uitgevoerd. Controleer het dan op pagina 2 met

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 
}

Door de vervaldatum niet op te geven, verloopt de cookie wanneer de browser wordt gesloten. In deze situatie zorgt het gebruik van cookies ook voor een veel beter leesbare code voor anderen.


Antwoord 3, autoriteit 18%

<?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 
}
?>

Als de verwijzer niet pagina 1 is, kunt u de voorwaarde controleren als verwijzer = pagina2 en het bericht is verzonden.
of controleer of de verwijzer pagina 1 is of het bericht is ingediend.
dit is een mogelijkheid om uw probleem te vermijden.


Antwoord 4

<?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" );
?>

Other episodes