2010-09-08 15 views
1

我想知道如何最好地處理登錄表單中的返回網址。我認爲一個好方法可能是在這裏完成的。這是urlencode當前url並將其作爲get參數發送到登錄控制器。在哪裏存儲返回網址在登錄表單/控制器

這可以在登錄控制器中進行urldecoded。但是呢?我查看了StackOverflow登錄頁面,並且無法在任何地方找到該網址。它存儲在哪裏?它在登錄完成後如何知道該去哪裏?它是否存儲在cookie中?會話變量?或者是其他東西?

我想事情可以做一點不同於在PHP,但反正。什麼是這樣做的好方法?

回答

0

如果它是一個靜態的URL,那麼你可以將其包含的形式作爲隱藏字段,然後重定向到它在你的代碼,即

<input type='hidden' name='return' value='/thankyou.html' /> 

然後在你提交功能...

header("Location: $_POST['return']"); 

在生產中,你會明顯地要加密的隱藏字段的URL,然後解密並調用header()函數之前驗證它是一個很好的網址,但應該給你的想法。

有些人使用cookies,其他人在DB有一個查找表。存儲URL的位置並不重要,只需在header()之前擦洗它就非常重要。

編輯:洗刷

function isValidURL($url) { 
    return preg_match('|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$|i', $url); 
} 

if (isValidURL($_POST['return'])) 
    header("Location: {$_POST['return']}"); 

正如我剛纔所說,如果你想更加小心,你可以加密/展示的形式和之前驗證先前解密實際的URL。那裏有很多好的加密/解密庫。

的家庭作業是從來沒有真正「做任何事情」(比如在數據庫中插入值,運行shell命令,重定向到一個URL等)與數據通過形式的用武之地。有人可能會操縱該隱藏的領域,並通過棘手的方式將代碼注入到您的應用程序或數據庫中。有成千上萬的帖子是人們通過表單注入來做的事情的例子。

+0

你會如何去角質呢? – Svish 2010-09-08 18:06:58

+0

運行它通過一個簡單的URL驗證功能,這樣的:function isValidURL($網址) { 回報的preg_match('|^HTTP(S):// [A-z0-9-] +([A-。 z0-9 - ] +)*(:[0-9] +)?(/.*)?$ | i',$ url); } – 2010-09-08 18:16:23

+0

對不起,這是醜陋的,我會作出新的答覆和格式。 – 2010-09-08 18:16:42

1

如果是我,我會在會話中設置返回URL。通過這種方式,您可以計算出合適的URL並將其與表示層分開。在檢測到設置了返回URL並且存在後期對象後,您可以設置位置標題並退出腳本。例如...

// You have the URL to return to (could be a constantly updated session variable 
// or simply set when a certain page is accessed via HTTP_REFERRER - it's open) 
// in a MVC application (like stackoverflow) you could add this to the controller 
// for any view with return functionality. 
$_SESSION['RETURN_URL'] = $Url; 

// Now you have validated and processed a form (from the model). If there is a 
// return url set, we redirect to it. Otherwise, we follow the default action of 
// the form 
if ($FormValidatedAndSubmitted) 
    returnToURL(); 

function returnToURL(){ 
    if (isset($_SESSION['RETURN_URL'])){ 
    header("Location: " . $_SESSION['RETURN_URL']); 
    unset($_SESSION['RETURN_URL']); 
    exit(); 
    } 
} 
相關問題