2009-06-11 51 views
2

如果我選擇很多文件戰術,
那我就變成有目錄
遍歷安全問題了嗎?大量的文件策略有目錄遍歷安全問題?

我需要寫登錄系統,
和大量文件的戰術手段

使大量的ID文件,並使用 SCANDIR。

使該目錄將有

aaa.txt(內容是aaa_pass)
bbb.txt(內容是bbb_pass)
ccc.txt(內容是ccc_pass)

當有人進入他id,
系統掃描目錄,
然後找到id文件。

但是,嘿,如果他進入作爲

「../../important.txt」?

然後他可以訪問../../important.txt?

回答

2

乍一看,你似乎在編寫一個登錄系統時有點奇怪。我不確定文件系統目錄中的純文本文件是否是一個明智的途徑,除非它不正常,而且您可能會忽略許多在更常見的認證中已經考慮到的微妙之處系統。例如,如果您想存儲密碼哈希和醃製,您需要考慮如何在您的方案中實現該方法,並且可能會導致安全問題。然而,使用一個好的PEAR庫或者Zend Framework的Zend_Auth組件,會給你一個清晰而且有據可查的起點。

無論如何,假設你有你在你的問題中描述的安排的原因,basename()函數可能是你想要的在這種情況下。它會除去文件名本身以外的所有內容,這樣它們就不會像你在你的問題中描述的那樣進行目錄遍歷攻擊。

所以,如果從用戶輸入的是:

../../important

您可以運行:

$cleanUsername = basename($input); 
$filename  = '/path/to/password/files/' . $cleanUsername . '.txt'; 

if (file_exists($filename)) { 
    [...] 
} 

有意義嗎?

+0

啊....我需要消毒嗎?它測量了很多文件策略有目錄遍歷安全問題? – 2009-06-11 15:45:38

+0

調用用戶輸入的basename()將阻止他們從其他目錄讀取文件,因此絕對需要消毒程度。只要確保用戶名符合操作系統中文件名安全的字符子集(字母數字可能是安全的,可能包括下劃線,如果需要的話),這應該是您真正需要的。你只需要輸入,通過basename()傳遞,然後遍歷這些文件來查看是否存在匹配的文件。 – 2009-06-11 15:57:26

1

使用之前,作爲路徑的一部分,您可以執行用戶名的一些驗證 - 例如,只允許字母和數字,你可以使用正則表達式做這樣的事情:

​​

另一種方式你可以做到這一點是你讀之前哈希的用戶名或寫出來,例如:

$hash = sha1($username); 

通過這種方式,用戶可以有什麼作爲自己的用戶名和將有操縱的行爲沒有他們的危險,你的文件查找。一個"../../important.txt"的用戶名會給你一個散列"48fc9e70df592ccde3a0dc969ba159415c62658d",儘管源字符串是討厭的,但它是安全的。

1

如果您除了使用此文件密碼系統​​(假設您必須出於某種原因)之外沒有其他選擇,除了創建某種混淆的文件名之外,還可能希望使用相同的方式創建文件擴展爲您的服務器端語言,以防萬一 - 例如,如果你正在使用PHP,你的文件名是john.php(或混淆「約翰」),以及內容可能是這樣的:

<?php 
    exit; // or maybe even a header redirect -- 
    /*password goes here*/ 
?> 

當然,您的文件讀取例程將需要解析我們的評論塊內的短語。

這樣,如果有人以某種方式到達該文件,它將永遠不會呈現。