2016-03-26 17 views
0

は、私は2つのページpage1.phppage2.phpを持っていると私はそれが形page1.phpリダイレクトされている場合にのみ表示されるようにpage2.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_REFERERpage2.phpに変更されますので、私のif statementは失敗し、page1.phpに戻ってしまいます。これが起こらないようにする方法はありますか?

ありがとうございます。

+0

リファラーはユーザーが入力した値であり、操作や省略が可能なため信頼できません。代わりにセッションを使用し、page1.phpでセッション変数を設定し、page2.phpでそれを確認してください。 –

+0

@CharlesAddisコードを追加しましたが、何も変更されていないようです。 – surafel

答えて

1

私はHTTP_REFERERを使用することをお勧めwouldntは:

  1. それはブラウザで操作可能にかなり簡単です。

  2. 一部のユーザーは、このヘッダーをまったく送信しないようにブラウザにセキュリティ設定を設定している場合があります。

  3. HTTPS経由ではアクセスできません。

  4. いくつかのプロキシは

  5. が追加要求から、このヘッダを削除 - を参照して答えをthis quesion


にシャーロットDunoisコメントで述べたように、優れたセットセッション値をフォームを送信する前にページ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' ]);でセッションを解除するか、別の値に設定してセッションを解除できます。

+0

or演算子を追加しても問題が解決しない場合は、ユーザーがURLを使用してpage2.phpを取得する場合に許可されます – surafel

+0

正しいですか。私の答えを更新しました。 – PetrHejda

+0

リファラーはHTTPS経由で引き続きアクセスできます。 –

1
<?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でない場合は、referrer = page2で投稿が送信されているかどうかを確認できます。 か、リファラーがpage1かpostかを確認してください。 これはあなたの問題を回避する可能性があります。

1

$_SERVER['HTTP_REFERER']は、簡単になりすまして使用することをお勧めします。

代わりにsetcookie("page1", 1);を使用してページ1をロードするときにcookieを設定することができます。の前にマークアップが出力されます。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 
} 

有効期限を指定しないと、ブラウザを閉じたときにクッキーが期限切れになります。このような状況では、クッキーを使用することで、他の人にははるかにわかりやすいコードが作られます。

+0

これはまさに私が提案するアプローチ、surafelです。あなたはクッキーを使用してはるかに良い結果を得て、それは多くの異なる方法で使用することができます!基本的な例については、http://www.w3schools.com/php/func_http_setcookie.aspを参照してください。 – jarmerson

+0

@jarmerson [w3fools](http://w3fools.com)ではなく、php.netのドキュメントページを 'setcookie'にリンクしてください。 –

+0

@Cha私は既に持っている、彼はちょうど別の例を見つける他の人を助けていた。公式のものはそれほど有用ではない。 –

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

?> 
関連する問題