PHP保護(hù)文件系統(tǒng)的具體代碼分享
文件系統(tǒng)對(duì)于任何一個(gè)站點(diǎn)來(lái)說(shuō)都是相當(dāng)重要的,程序員們都在不遺余力的保護(hù)著自己的系統(tǒng)不受侵犯。今天我們就為大家講解了PHP保護(hù)文件系統(tǒng)的具體代碼示例。曾經(jīng)有一個(gè) Web 站點(diǎn)泄露了保存在 Web 服務(wù)器的文件中的客戶數(shù)據(jù)。該 Web 站點(diǎn)的一個(gè)訪問者使用 URL 查看了包含數(shù)據(jù)的文件。雖然文件被放錯(cuò)了位置,但是這個(gè)例子強(qiáng)調(diào)了針對(duì)攻擊者保護(hù)文件系統(tǒng)的重要性。
#t#如果 PHP 應(yīng)用程序?qū)ξ募M(jìn)行了任意處理并且含有用戶可以輸入的變量數(shù)據(jù),請(qǐng)仔細(xì)檢查用戶輸入以確保用戶無(wú)法對(duì)文件系統(tǒng)執(zhí)行任何不恰當(dāng)?shù)牟僮?。清?1 顯示了下載具有指定名的圖像的 PHP 站點(diǎn)示例。
- <?php
- if ($_POST['submit'] == 'Download') {
- $file = $_POST['fileName'];
- header("Content-Type: application/x-octet-stream");
- header("Content-Transfer-Encoding: binary");
- header("Content-Disposition: attachment; filename=\"" . $file . "\";" );
- $fh = fopen($file, 'r');
- while (! feof($fh))
- {
- echo(fread($fh, 1024));
- }
- fclose($fh);
- } else {
- echo("<html><head><");
- echo("title>Guard your filesystem</title></head>");
- echo("<body><form id=\"myFrom\" action=\"" . $_SERVER['PHP_SELF'] .
- "\" method=\"post\">");
- echo("<div><input type=\"text\" name=\"fileName\" value=\"");
- echo(isset($_REQUEST['fileName']) ? $_REQUEST['fileName'] : '');
- echo("\" />");
- echo("<input type=\"submit\" value=\"Download\" name=\"submit\" /></div>");
- echo("</form></body></html>");
- }
正如您所見,清單 1 中比較危險(xiǎn)的腳本將處理 Web 服務(wù)器擁有讀取權(quán)限的所有文件,包括會(huì)話目錄中的文件(請(qǐng)參閱 “保護(hù)會(huì)話數(shù)據(jù)”),甚至還包括一些系統(tǒng)文件(例如 /etc/passwd)。為了進(jìn)行PHP保護(hù)文件系統(tǒng)演示,這個(gè)示例使用了一個(gè)可供用戶鍵入文件名的文本框,但是可以在查詢字符串中輕松地提供文件名。
同時(shí)配置用戶輸入和文件系統(tǒng)訪問權(quán)十分危險(xiǎn),因此最好把應(yīng)用程序設(shè)計(jì)為使用數(shù)據(jù)庫(kù)和隱藏生成的文件名來(lái)避免同時(shí)配置。但是,這樣做并不總是有效。清單 2 提供了驗(yàn)證文件名的示例例程。它將使用正則表達(dá)式以確保文件名中僅使用有效字符,并且特別檢查圓點(diǎn)字符:..。
- function isValidFileName($file) {
- /* don't allow .. and allow any "word" character \ / */
- return preg_match('/^(((?:\.)(?!\.))|\w)+$/', $file);
- }
以上就是本文為大家分享的PHP保護(hù)文件系統(tǒng)的具體代碼編寫。