2010-01-09 67 views
15

我是一個初學PHP的登錄腳本。這是形式的令牌聲明,我到目前爲止有:PHP表單令牌的使用和處理

$_SESSION["form_token"] = md5(rand(time(), true)) ; 

的聲明就用戶後發出指示他/她想要登錄。

我有限的理解是,令牌的目的是在獨特的時間點識別唯一的用戶並掩飾表單令牌信息。

然後一切都變得模糊。這裏是我的3個開放式問題:

  1. 當是「檢查」的形式標記爲安全目的的最佳時間?

  2. 如何檢查?

  3. 什麼時候可以「銷燬」表單令牌? (IOW,將形式令牌留「活躍」,直到用戶註銷?

+2

FYI MD5是比較有限的,如果你需要生成一個隨機字符串,我建議你用這個來代替:$ ID = SHA1(mt_rand());如果您使用RAND()你只能得到有32000種可能的組合。 – TravisO 2010-01-09 18:08:06

+0

相關:http://stackoverflow.com/questions/5111007/does-php-have-an-authenticity-token-like-rails – baptx 2016-08-09 17:50:46

回答

12

有沒有必要做你正在嘗試什麼。當您使用session_start()以PHP開始會話時,已經爲您生成了唯一的SESSIONID。你應該而不是把這個表格。它默認通過cookie處理。也不需要檢查SESSIONID,這也是爲您處理的。

你是負責認證用戶和存儲其認證身份(如:$ _SESSION [「USER_ID」] = $在SESSION用戶ID。如果用戶註銷你session_destroy摧毀他們的會話。

你應該確保session_start()是您網站中所有頁面的第一個之一。

這是一個基本的例子:

<?php 
session_start(); // starts new or resumes existing session 
session_regenerate_id(true); // regenerates SESSIONID to prevent hijacking 

function login($username, $password) 
{ 
    $user = new User(); 
    if ($user->login($username, $password)) { 
     $_SESSION['user_id'] = $user->getId(); 
     return true; 
    } 
    return false; 
} 

function logout() 
{ 
    session_destroy(); 
} 

function isLoggedIn() 
{ 
    return isset($_SESSION['user_id']); 
} 

function generateFormHash($salt) 
{ 
    $hash = md5(mt_rand(1,1000000) . $salt); 
    $_SESSION['csrf_hash'] = $hash 
    return $hash; 
} 

function isValidFormHash($hash) 
{ 
    return $_SESSION['csrf_hash'] === $hash; 
} 

編輯:我誤會了原來的問題。我添加了上面的相關方法來生成和驗證表單散列;

請參閱以下資源:

+0

也有一些是我不明白。我也使用令牌PHP會議,但每次我修改一個會議,他們都會得到修改(以下簡稱「修改日期」的所有tmp文件,修改)。識別不同用戶的會話之間是否有任何連接? – Sthe 2011-12-28 07:10:17

18

這是爲了防止CSRF攻擊

http://en.wikipedia.org/wiki/Cross-site_request_forgery

惡意網站理論上可以顯示的形式,職位,您的應用程序,表單可能包含導致數據泄露或一些不需要的操作的說明,用戶可能會被欺騙提交應用程序接受的表單,因爲用戶已經登錄。表單令牌可確保表單由您的網站而不是其他網站。

檢查HTTP_REFERER通常已經足夠了,但並不是完整的解決方案(例如https將不會發送referrer字符串)。

如果您確實想要使用令牌來保護所有表單,則可以創建一些便利功能,例如emitToken()和checkToken(),這些功能將使其在站點範圍內工作。

一些例子:

http://phpsec.org/projects/guide/2.html

http://www.rodsdot.com/php/CSRF_Form_Protection.php

+2

HTTP_REFERER是不是可信,從不依靠它,因爲它可以很容易地進行編輯! – Heitor 2016-04-11 22:58:09