文件系統對於任何一個站點來說都是相當重要的,程序員們都在不遺余力的保護著自己的系統不受侵犯。今天我們就為大家講解了PHP保護文件系統的具體代碼示例。曾經有一個 Web 站點洩露了保存在 Web 服務器的文件中的客戶數據。該 Web 站點的一個訪問者使用 URL 查看了包含數據的文件。雖然文件被放錯了位置,但是這個例子強調了針對攻擊者保護文件系統的重要性。
- <?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 中比較危險的腳本將處理 Web 服務器擁有讀取權限的所有文件,包括會話目錄中的文件(請參閱 “保護會話數據”),甚至還包括一些系統文件(例如 /etc/passwd)。為了進行PHP保護文件系統演示,這個示例使用了一個可供用戶鍵入文件名的文本框,但是可以在查詢字符串中輕松地提供文件名。
同時配置用戶輸入和文件系統訪問權十分危險,因此最好把應用程序設計為使用數據庫和隱藏生成的文件名來避免同時配置。但是,這樣做並不總是有效。清單 2 提供了驗證文件名的示例例程。它將使用正則表達式以確保文件名中僅使用有效字符,並且特別檢查圓點字符:..。
- function isValidFileName($file) {
- /* don't allow .. and allow any "word" character / */
- return preg_match('/^(((?:.)(?!.))|w)+$/', $file);
- }
以上就是本文為大家分享的PHP保護文件系統的具體代碼編寫。