2013-04-21 72 views
0

我想爲我正在開發的Java遊戲創建一個啓動器,要求用戶在下載遊戲之前登錄。我的想法是讓啓動程序將證書發送到我的網絡服務器,並且Web服務器會輸出臨時文件的位置,因爲證書是正確的。然而,這將是給定的有點棘手/低效:下載後過期的臨時URL

  1. 服務器將需要複製的遊戲文件每次有人更新,並
  2. 的Web服務器將不知道該文件被下載完畢。

也許啓動程序可能會發送請求到一個單獨的腳本來刪除給定的臨時名稱的文件?問題在於啓動器可以很容易地被反編譯和修改爲不發送請求,從而破壞了創建新文件的目的。

對這個想法及其問題有何建議?

+1

您可以在URL中添加一個「驗證碼」 - 因此基本請求是相同的,但在URL後面有一個'?valKey = 123345456567ertdfgertdfg'。你的PHP解碼它是一個有效的密鑰,提供所請求的文件,然後將該密鑰標記爲不再有效。 – Floris 2013-04-21 18:02:51

+0

出於好奇 - 爲什麼不在證書有效時立即下載?爲什麼新的網址? – 2013-04-21 18:15:50

+0

@Niels用戶將能夠從靜態URL下載文件,從而破壞驗證的目的。 – caseif 2013-04-21 18:19:37

回答

3

我會用一個數據庫,像這樣:

urlgenerator.php

<?php 

// generate code 
$code = uniqid(); 

// save code to database 
db_save($code); 

// write link 
echo '<a href="download.php?code=' . $code . '">Download</a>'; 

的download.php

<?php 

// get code from url 
$single_use_code = $_GET['code']; 

// check if the code is in the db 
if(db_get_code($single_use_code)) { 
    // remove code from database as it is single use only 
    db_remove($single_use_code); 
    // start download 
    start_download(); 
} else { 
    // the code is not valid 
    die('BAD code'); 
} 
+0

+1爲轉化爲可以理解的代碼,我們其他人只是評論! – Floris 2013-04-21 20:34:46

+0

謝謝! .... :) – hek2mgl 2013-04-21 20:37:17

0

簡單的解決方法:在unix系統上,您可以刪除正在使用的文件,而不會影響該文件上當前打開的文件句柄。所以

  1. 用戶請求下載
  2. 腳本使得DocumentRoot的一個符號鏈接的地方,在哪裏文件實際上存儲(外面的文檔根目錄的某處)
  3. URL的符號鏈接發送一個點參數給用戶。
  4. 用戶點擊donwload鏈接,例如, http://example.com?get=path/of/symlink
  5. 下載腳本fopen()函數的符號鏈接,並開始祭出了文件的內容
  6. 腳本刪除它已經的fopen後的符號鏈接()倒是

現在符號鏈接不見了,不能再使用,但下載腳本仍將向用戶發送數據,因爲它在移除之前打開了符號鏈接/文件。

+0

「在unix系統上」我的網絡服務器在Windows上運行;這仍然有效嗎? – caseif 2013-04-21 18:16:09

+0

沒有。 Windows有非常不同的文件處理機制。 – 2013-04-21 18:40:29

1

嘗試是這樣的:

// 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+個隨機按鍵應該這樣做),所以沒有彩虹表或強力攻擊是可行的。