2010-08-31 35 views
1

我通過檢查會話的值來保護我的頁面。如果會話無效,是否有更安全的方法來保護我的頁面,而不是更改標題位置?我正在做什麼嗎?PHP有沒有比使用標題(位置)更好的方法來保護我的頁面?

我必須在每一頁的頂部以下內容:

<?php 
    session_start(); 

    //VERIFY LOGIN 
    $validkey = 'br1ll1ant)=&'; 

    if ($_SESSION['valid'] != (hash('sha256',$validkey)) && $_SESSION['tokenconfirm'] != hash('sha256',$_SESSION['tokenID'])) { 

      header("location:/login/"); 

     }; 

?> 
+0

爲什麼要在會話中放置散列值?它不像用戶可以直接訪問它們;我想他們會提前知道價值。那麼有什麼意義呢? – Aillyn 2010-08-31 17:56:59

+0

兩個方面的注意事項:其實你的頭()呼叫是不符合RFC的。你應該總是指定一個有效的URL和protocoll和hostname。關於會話中的散列:我認爲這是很好的做法,因爲這樣會話文件可以在不知道密碼的情況下被攻擊者讀取。 (攻擊者可以通過其他錯誤有意識地讀取系統上的任意文件 - 以防萬一!); – 2010-08-31 18:28:40

+0

在會話中散列密碼仍然不會改變密碼以明文存儲的事實。如果一個漏洞允許攻擊者查看臨時會話變量(這通常是世界可讀的),那麼相同的攻擊者應該能夠讀取Web根文件(通常是世界可讀的),包括包含密碼的PHP源文件。實際上, – leepowers 2010-08-31 18:42:45

回答

7

使用header()是好的,但不要忘記exit();您的腳本後調用header()。用戶代理不必尊重標題,所以可以編寫一個客戶端,它將簡單地讀取標題調用之後的部分。

if(!session_is_valid()) { 
    header('Location: index.php'); 
    exit; 
} 
2

是否使用模板系統?如果你是,你要做的只是輸出登錄表單而不是頁面內容,如果用戶未經過驗證。即使你不使用一個,如果用戶不是有效的,你也可以改變輸出(例如不同的包含)。這樣你就不依賴最終用戶的瀏覽器來保護內容。

0

頭部應該沒問題,我還沒有看到別人使用過很多東西。

最好通過身份驗證才能訪問該頁面,然後在每個頁面上檢查身份驗證。如果失敗,重定向到登錄。

使用MVC模式,最好在登錄狀態進入頁面之前檢查登錄狀態,如果沒有登錄,也可以重定向,或者加載登錄視圖。

0

使用前端控制器模式,你可以把所有的php文件放到web根目錄之外。這樣他們不能直接從URL訪問。這在PHP框架中相當普遍,包括那些使用Zend'Framework'構建的框架。

如果您的文件位於Web根目錄中,您可能會考慮的另一種方法是使用常量。 CodeIgniter就是這麼做的。在前端控制器中定義一個常量,如果未定義,則將它們發送到Web根目錄。以下是CI如何使用常量。

使用的恆定比比皆是

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

它是如何定義的。

define('BASEPATH', $system_folder.'/'); 

$ system_folder是上面幾行。

$system_folder = realpath(dirname(__FILE__)).'/'.$system_folder; 
+0

實際上要走的路,但我猜測OP的文件是被認證用戶訪問的。 – 2010-08-31 18:41:43

相關問題