嘗試是這樣的:
// Define a random key
$key = 'kgjiowtjiohgjiut09ig90im09yig90mi903i490ti209tgwgt';
$secondsValid = 300;
if($_GET['action'] == 'download')
{
$time = $_GET['time'];
if(time() - $time > $secondsValid)
die('Code has expired, please try again');
if($_GET['validation'] != md5($time.$key))
die('Invalid validation code');
DownloadFile();
die;
}
elseif(CredentialsAreCorrect())
{
$time = time();
header('Location: '.$_SERVER['REQUEST_URI'].'?action=download&time='.$time.'&validation='.md5($time.$key));
die;
}
else
die('Invalid credentials');
這是一種簡單的方法o爲驗證的用戶提供一個經過時間限制的URL(在這種情況下有效期爲5分鐘),不需要任何討厭的複製/符號鏈接/無論涉及什麼數據庫,只要使用基本設施,只要密鑰是安全的就不能被黑客入侵。只要確保你的密鑰具有足夠的熵(40+個隨機按鍵應該這樣做),所以沒有彩虹表或強力攻擊是可行的。
您可以在URL中添加一個「驗證碼」 - 因此基本請求是相同的,但在URL後面有一個'?valKey = 123345456567ertdfgertdfg'。你的PHP解碼它是一個有效的密鑰,提供所請求的文件,然後將該密鑰標記爲不再有效。 – Floris 2013-04-21 18:02:51
出於好奇 - 爲什麼不在證書有效時立即下載?爲什麼新的網址? – 2013-04-21 18:15:50
@Niels用戶將能夠從靜態URL下載文件,從而破壞驗證的目的。 – caseif 2013-04-21 18:19:37