2012-10-22 14 views
0

我有一個測試系統,記錄用戶放入的答案,然後對測試進行評分。完成後,它會創建一個易於閱讀的答案表以及用戶獲得的分數。我想記錄該文件並將其放入日誌文件中。如何根據會話ID使用PHP控制對可下載文件的訪問?

因此,我使用用戶名設置了一個文件,並在該文件中記錄了所有測試結果。問題是,這些文件對公衆開放。我有一個登錄系統,用於檢查會話ID並允許或不允許訪問,但我無法將代碼獲取到新生成的文件中。

那麼我應該怎麼做呢?我已使用.htaccess文件來阻止訪問該文件夾,但我希望能有更流暢的解決方案。

是否有可能使用PHP動態地將PHP代碼寫入新創建的文件? (所以它會自動生成每個自動生成的日誌文件的登錄檢查)

在此先感謝您的幫助。

+1

使用PHP程序動態編寫PHP代碼聽起來像是一些可能不安全的東西,除非你非常小心。即使你沒有使用'eval()'來運行它,動態生成的代碼也會出現同樣的問題。 – Spudley

回答

0

在創建表文件之前,您還可以對該文件執行簡單的附加操作,在該文件中插入表代碼PHP sesssion檢查代碼。您可以使用PHP file writing functions執行此操作。

由於PHP會話檢查代碼將保持不變,這種方法要容易得多。

+0

謝謝,這有幫助。 所以我所做的就是將我的'include(authorizeAdmin.php)'代碼添加到模板文件中。然後當一個新用戶被創建時,它只是將該文件複製爲他們的用戶名。當他們進行測試時,我們會將測試數據附加到日誌文件的末尾。 我認爲php會在追加時刪除任何php代碼,但我錯了。它效果很好。感謝威廉! – DauntlessRob

+0

當然配偶。樂意效勞。 –

1

將文件保存到Web根目錄以外。例如,public_html以外的任何內容(或任何Web根目錄)都是完全無法從Web訪問的,但如果它看到您已登錄,則可以通過PHP文件訪問。

+0

這聽起來像是一個好主意,但它的說法: '警告:fopen(/logs/realm/tuser.html)[function.fopen]:未能打開流:沒有這樣的文件或目錄' 即使文件確實存在。 – DauntlessRob

0

是否可以使用PHP動態地將PHP代碼寫入新創建的文件 ? (所以它會自動生成登錄支票存入其每 自動生成的日誌文件)

是的。您可以創建一個模板文件,其中只有登錄檢查file_get_contents,然後將其寫入文件頂部。然後,使用__halt_compiler()停止PHP解釋文件的其餘部分。然後,您可以從__COMPILER_HALT_OFFSET__開始閱讀並將THAT回傳給客戶端。

如果您想要比使用__halt_compiler()更簡單的解決方案,您可以簡單地創建一個php文件,在會話檢查後將結果回顯給用戶。

更好的是,您可以將所有結果插入到數據庫中。然後,您只需要有一個頁面來檢查用戶名,獲取結果,然後將其全部輸出給用戶。

+0

如果我要將所有這些結果插入MySQL數據庫,那麼最好的數據類型是什麼?我的意思是,這將是幾百行代碼將進入SQL。這真的是一種有效的數據存儲方式嗎? (我不擅長SQL) – DauntlessRob

0

a)將文件存儲在網站文檔根目錄的外部,因此它們不能通過URL直接訪問。

b)有一個PHP腳本是訪問這些文件的網關。該代碼將是vaugely像

<?php 

$fileID = $_GET['id']; 

if (user_is_allowed_access($fileID)) { 
    send_file_to_user($fileID); 
} else { 
    die("go away"); 
} 

一旦你解決了訪問/權限檢查的東西,實際發送的文件可以毫不誇張地說是這麼簡單readfile('/path/to/file/on/server')

相關問題