2012-08-30 183 views
1

我有一個網站,目前的作品。它有一個顯示信息的頁面,另一個允許您編輯信息源。現在,當你在index.php上登錄時,它通過表單將數據發佈到view.php。該網站不使用任何cookie。當我點擊編輯時,它會將用戶名,密碼和提交請求發佈到edit.php。目前,這個按鈕效果很好,但對於編輯按鈕當前代碼如下:如何解決這個安全漏洞?

<FORM NAME ="form1" METHOD ="post" ACTION = "edit.php"> 
<p class="BodyText"> 
<INPUT TYPE = "Hidden" Name = "Username" Value = "<?php print($username); ?>"> 
<INPUT TYPE = "Hidden" Name = "PassHash" Value = "<?php print($password); ?>"> 
<INPUT TYPE = "Submit" Name = "Change" VALUE = "Edit"> 
</p> 
</FORM> 

我以前沒有注意到,但現在我發現,我期待通過代碼,它打印的密碼。我真的不知道如何在沒有這個的情況下將密碼提交到編輯頁面,但是當我檢查Chrome中的元素時,我可以看到密碼哈希(SHA-1)。首先,我想是的,這是一個安全漏洞嗎?其次,如何將passhash傳遞給edit.php頁面而不將散列發送回最終用戶。第三,我是否完全犯了這個錯誤?對我來說,通過信息登錄似乎沒問題,但安全性是否瘋狂?我在PHP方面有點新,而且完全是安全的。

+0

反正密碼在第一個登錄頁面上傳輸。你在這裏要做的是儘量減少傳輸到一個頁面。就是這樣。安全方面,index.php腳本是主要的障礙。爲所有頁面啓用SSL,而不是關注第二個或第三個POST請求。 – mario

+0

CP ** Cookie **人應該使用cookie(或會話) – 2012-08-30 20:15:33

回答

4

這不是一個很好的方法來做到這一點(隱藏輸入的形式)。

瞭解PHP Sessions

查看PHP manual的一些示例。

您將希望保留用戶在頁面之間的會話期間的訪問權限,並且不應打印出他們的密碼。

您可以驗證用戶的密碼以對其進行身份驗證,並讓會話保存關於用戶是誰的信息以及他們是否登錄該會話(而不是嘗試驗證每個頁面上的密碼)。

一個例子流量:

當認證(用戶登錄):

session_start(); 

// Authenticate user here with the password. 
if (someAuthenticationFunction($_POST['user'], $_POST('password') === true) { 
    $_SESSION['user'] = $user; 
    $_SESSION['loggedIn'] = true; // Notice we're not saving the password into the session, only whether user is loggedIn. 
} 

在所有其他頁面,你會要檢查用戶的身份驗證(最有可能edit.php頁):

session_start(); 

if ($_SESSION['loggedIn'] === true) { 
    $user = $_SESSION['user']; 
    // Do the actual editing stuff here. 
} 

一旦用戶準備註銷,請使用session_destroy()(很可能在註銷頁面上)。

+0

您的鏈接沒有提供太多幫助。這裏是更好的資源嗎? http://www.w3schools.com/php/php_sessions.asp – Paulywog

+2

w3school不是推薦的源代碼,請參閱http://w3fools.com – 2012-08-30 20:02:15

+0

@CPCookieMan如何實現會話取決於你如何驗證用戶(使用密碼等)。在您的會話中,您可能希望保留的一些內容是:用戶名可能,用戶是否通過此會話的身份驗證。編輯頁面應該檢查會話是否被認證,而不是針對密碼散列。當用戶註銷時,只需銷燬會話即可。 – Stegrex

3

你可以將密碼保存在$ _SESSION變量中。 對於它,你必須在那裏登錄表單得到處理在網頁中寫:在此之後設置,你可以得到的用戶名在每一個地方

session_start(); 

寫入文件

session_start();//at top of the page 
$_SESSION['user'] = $_POST['username']; 
$_SESSION['password'] = $_POST['password']; 

+0

這似乎是一個非常好的答案。每個文件都必須有session_start();訪問這些變量? – Paulywog

+0

@CPCookieMan不,只有認證頁面應該有session_start();每隔一頁檢查是否設置了會話。 – Stegrex

+0

哈哈okay ty Stegrex我學到了一些新東西:D –

0

如果你不想使用cookies,你可以使用URL中傳遞的某種會話ID(見php.net/output_add_rewrite_var)並將它存儲在數據庫中,但是你會打開一個全新的蠕蟲箱與會話劫持有關。基於COOKIE的PHP會話是要走的路。