2012-12-06 50 views
1

我想要做的是一個祕密的鏈接,例如website.com/?secret=yes當他們訪問這個網頁,我想刪除URL這個變量,所以我有以下幾點:這可以工作嗎?基於變量+標題重定向執行PHP一次?

<?php 
if(isset($_GET['secret']) && $_GET['secret'] === 'yes') { 
    header('Location: http://website.com'); 
    $secret="yes"; <--take note this is what I'm testing 
} 
?> 

的上面的代碼會立即重定向,所以在url中沒有變量,我試着用$ secret =「yes」來讓這個變量成爲我自己。以便能夠使用它與下面的代碼:

<?php if('yes' === $secret) : ?> 
secret content here 
<?php endif; ?> 

這可能嗎?我怎樣才能讓我的代碼工作?我不想使用會話,因爲我希望它只做一次,或者每次他們通過祕密鏈接訪問,如果他們訪問沒有它不顯示。

+0

也許你可以做這樣的事情一個http://stackoverflow.com/questions/4281900/php-header - 重定向後變量 – lucentx

+0

@lucentx我不使用任何形式,我需要通過網址。 –

+1

哦,那麼我想你別無選擇,只能使用會話,然後在使用後取消設置。 – lucentx

回答

5

不,這是行不通的。變量不會通過重新加載頁面持續。但是,您可以使用會話或cookies來做到這一點:

<?php 
session_start(); 
if(isset($_GET['secret']) && $_GET['secret'] === 'yes') { 
    $_SESSION['secret']="yes"; 
    header('Location: http://website.com'); 
    exit(); 
} 
?> 

<?php if($_SESSION['secret']=='yes'){ 
unset($_SESSION['secret']); //unset so when the page reloads the secret data will be gone 
?> 
secret content here 
<?php } ?> 
+3

會話+1。用戶完全不知道會話變量中的內容,只是在某個地方存在。設置位置標題後,請不要忘記'die()'或'exit',理想情況下爲了便於閱讀,$ _SESSION ['secret'] ='yes''應位於'header()'之前。 –

+3

您可能還想在會話變量設置後退出;以確保在不應執行下面的任何代碼時執行。 –

+0

啊哈,這很好,我不知道有沒有SESSION! –

0

由於HTTP的無狀態的,你需要通過祕密令牌的一種方式或其他。如果你想確保內容被訪問,一旦你可以做一些獨特的信息(IP,用戶代理等)的MD哈希,並通過它。你應該能夠將您的變量添加到標題號召:

header('Location:http://website.com/?secret=yes'); 

注意,你會檢查與

<?php if ($_GET['secret'] == "yes"): ?> 


// secret content 
<?php endif; ?> 

值。這是不是一種安全的解決方案,因爲任何人都可以只是追加sectet? =對鏈接來說,散列會更好,因爲它可以是事物的組合。如果你決定使用哈希,請確保你使用鹽,否則你可能會冒險碰撞/彩虹表攻擊

+0

哈希似乎很有趣,我的網站已經很沉重,這種方法會讓它變慢嗎? –

+0

不是很明顯,實際上SESSIONS在內部使用散列,但是你曾經說過你不想使用SESSIOS。我所說的技術稱爲基於令牌的認證。這就是說,Tim的上述優秀解決方案似乎是最簡單的路線 –

1

您可以通過另一種方式實現如下。

創建像skey.txt

一個文本文件,如下編寫代碼:

$filename = 'skey.txt'; 
if(isset($_GET['secret']) && $_GET['secret'] === 'yes') { 
    $data = file_get_contents($filename); 
    header('Location: http://localhost/'.$_SERVER['PHP_SELF']); 
    file_put_contents($filename, $data."\n".$_SERVER['REMOTE_ADDR'].'secret=yes'); 
} 

$filename = 'skey.txt'; 
if(isset($_GET['secret']) && $_GET['secret'] === 'yes') { 
    $data = file_get_contents($filename); 
    file_put_contents($filename, $data."\n".$_SERVER['REMOTE_ADDR'].'secret=yes'); 
    header('Location: http://localhost/'.$_SERVER['PHP_SELF']); 
} 

時,你會被重定向到一個頁面。你可以按照以下檢查:

$data = file($filename); 
if(!empty($data) && in_array($_SERVER['REMOTE_ADDR'].'secret=yes', $data)) { 
    echo 'hello'; 
    $getlines = array_keys($data, $_SERVER['REMOTE_ADDR'].'secret=yes'); 
    foreach($getlines as $lkey) { 
     unset($data[$lkey]); 
    } 

    file_put_contents($filename, implode("\n", $data)); 
} 

,我認爲它會爲你工作...

+2

這是行不通的,因爲在其他人訪問過該祕密URL後訪問該網站的任何人都會看到相同的文件。如果你真的想走這條路,你可以使用IP地址或其他一些獨特的細節作爲文件名的一部分。或者,您可以在其他答案中使用會話,並更簡單地獲得更好的結果。 – Dallin