PHP臨時檔案的安全性分析_PHP教程

來源:互聯網
上載者:User
一、 簡介
  臨時檔案,顧名思義是臨時產生的檔案,且檔案的生命週期很短。

  然而,很多應用的運行都離不開臨時檔案,臨時檔案在我們電腦上無處不在,主要有以下幾種形式的臨時檔案:

1.檔案或圖形編輯程式,所產生的中間檔案
2.資料庫查詢時,產生的臨時快取檔案,提供之前的結果資料而,以減少再次訪問資料庫的代價;通常用於遠端資料庫或遠程xml的服務
3.檔案被上傳後在服務端的臨時儲存,其檔案名稱為php的全域變數$_FILES['userfile']['tmp_name']的值
4.在http請求中,用於存放session的臨時檔案,這些檔案名稱通常就是sessionid(如 sess_7483ae44d51fe21353afb671d13f7199)
5.在不同應用或相同應用傳遞資料,而對方要求基於檔案的輸入,此時用臨時檔案存放資料

二、臨時檔案的安全特徵

  臨時檔案的最大特徵就是它的非持久性,除此之外,從安全性的角度,可以從以下幾個方面關注臨時檔案的其它特點或風險:

1.臨時檔案的位置

  臨時檔案通常被建立並存放在預設的路徑,在一個典型的Linux系統中,至少有兩個目錄或分區保持著臨時檔案。其中之一是/tmp目錄,再者是/var/tmp。在更新的Linux核心的系統中,還可能有/dev/shm,它是用tmpfs檔案系統裝載的。有時臨時檔案,也可能放在使用者home目錄下的隱藏子目錄中。使用預設臨時檔案目錄的好處在於,系統進程可以方便尋找和讀寫。

  然而,預設臨時檔案的存放目錄可能成為損害系統安全的殭屍和rootkit的溫床。這是因為在多數情況下,任何人(或任何進程)都可以向這些目錄寫入東西,有不安全的許可問題。比如我們都知道sticky bit,該位可以理解為防刪除位元。如果希望使用者能夠添加檔案但同時不能刪除檔案, 則可以對檔案使用sticky bit位。設定該位後,就算使用者對目錄具有寫入權限,也不能刪除該檔案。多數Linux發行版本在臨時目錄上設定sticky位,這意味著使用者A不能清除屬於使用者B的一個檔案,反之亦然。但是,根據檔案自身的許可,使用者A有可能查看並修改那個檔案的內容。

2.臨時檔案的持久性

  前面提到臨時檔案是非持久的,在程式結束時,會被刪除,但有的時候臨時檔案也會被迫持久儲存了,沒有被刪除,如:

2.1 應用程式在關閉前崩潰了,還沒有機會刪除臨時檔案
2.2 應用程式還跑著,但作業系統崩潰了
2.3 檔案複製過程中由於空間問題而複製失敗,導致中間檔案沒有刪除
2.4 作業系統進程通常會定期清空的預設臨時檔案目錄,但可能因為某些原因,而刪除失敗
2.5 寫得不好的應用程式,可能忽略或者忘記了刪除臨時檔案

3.臨時檔案的風險性

  無用的臨時檔案像幽靈一樣存在你的伺服器上,一方面佔用硬碟,另一方面,可以被其它人非法使用,存著如下一些風險:

3.1 可見度

  眾所周知,將私人資料公開很有風險。一旦使用者通過某些手段(如shell或者ftp)竊取了你的臨時檔案,就可以擷取到使用者或企業的私人資料,從而對你造成影響。

  例如:臨時檔案2011_Confidential_Sales_Strategies.tmp,可能暴露你們公司2011年的商業策略,這對你的競爭者來說,將很有用處;而對於session劫持者來說,存放使用者session資訊的臨時檔案sess_95971078f4822605e7a18c612054f658非常關鍵。

  除此之外,還有別的情況臨時檔案可能會被偷窺,如:一個拼字檢查的服務,返回結果的url是:http://bad.example.com/spellcheck.php?tmp_file=spellcheck46 ,攻擊者分析你的url參數後使用http://bad.example.com/spellcheck.php?tmp_file=spellcheck45 就可以訪問到前一個使用者的驗證結果了。

3.2 可執行性

  通常臨時檔案是不可執行,但如果攻擊者上傳了一個php指令碼到你的臨時目錄,而且通過某種方式執行了它,那可能造成悲劇了。

3.3 臨時檔案被劫持

  攻擊者可能為了自己的目的,而劫持你的臨時檔案。他可能替換你的臨時檔案,也可能在你的臨時檔案後面追加一些資訊。

  劫持臨時檔案的目的包括:

(1)讓你的應用程式處理他的資料,而不是你自己的資料
(2)暴露隱私資料,比如系統的密碼檔案,或者其它php安全模式不能正常讀的檔案
(3)刪除資料,阻礙請求的正常進行
(4)建立並輸出虛假的資料,破壞請求的結果
(5)通過提供虛假的資料,對使用資料進行下一步處理的應用程式造成破壞
(6)將你的輸出重新導向到其它地方,可以方便攻擊者訪問或者覆蓋系統檔案

  劫持通常與競爭條件相關。當兩個不同的進程操作同一個檔案的時候,就可能產生競爭條件。例如,一個讀進程和一個寫進程同時操作一段資料,當寫進程只完成了一部分的時候,讀進程已經完成,這樣讀的到內容一部分是新的,一部分是舊的,也就是我們常說的讀髒資料。

  臨時檔案的劫持,在一定程度上會造成競爭條件,除非劫持者準確的把握時間和位置,否則就會造成此類安全問題。

三、預防臨時檔案被惡意使用

  前面我們介紹了臨時檔案的概念,以及臨時檔案被惡用可能帶來的危害,這個部分主要介紹一些策略來預防臨時檔案被惡意利用,以及減少其帶來的危害。

1.調整存放位置

  防止臨時檔案被惡意利用的最重要,也是最簡單的一步就是讓你的臨時檔案目錄以及名字不容易被猜到。任何對臨時檔案的惡意利用,攻擊者都必須知道臨時檔案的名字和路徑,因此你應該儘可能的讓他難以猜到你的臨時檔案名稱字及路徑。

  建議你在臨時檔案目錄的選擇時,還是將你的臨時檔案放在預設的目錄下吧,這樣系統進程可以方便找到以及讀寫。而把精力花費放在為檔案名稱想個合適的難猜的名字。

  php的tempnam()函數,可以建立一個臨時檔案,並且其自動產生的檔案名稱不會與目前的目錄下的其它檔案名稱衝突,此函數建立的檔案預設許可權是600,即rw——-。

例如

$filename = tempnam( ‘..', ‘myTempfile');

  運行後可能產生一個名為myTempfile1af的檔案,當第二次啟動並執行時候就產生了名為myTempfile1b0的檔案名稱。
也許一些編程實踐指南會建議你在使用tempnam()組建檔案的時候,用一些有意義的首碼來命名,這樣能通過檔案名稱看出檔案中包含的資料或者需要此資料的應用,但從安全性的角度來看最好不要這樣,這樣等於為攻擊者指明了方向。

  這裡介紹一種方法,即能有一定意義的首碼同時也讓攻擊者不那麼好猜,如下:

<?php// define the parts of the filenamedefine(‘TMP_DIR','/tmp/');$prefix = ‘skiResort';// construct the filename$tempFilename = uniqid( $prefix, TRUE );// create the filetouch( $tempFilename );// restrict permissionschmod ( $tempFilename, 0600 );// now work with the file// … assuming data in $valuefile_put_contents( $tempFilename, $value );// …// when done with temporary file, delete itunlink ( $tempFilename );?>

 這個指令碼通過uniqid()函數,產生的檔案名稱格式為:/tmp/skiResort392942668f9b396c08.03510070,並通過chmod將檔案的使用權限設定為600。

  如果你需要與其它應用共用資訊,比如使用者密碼或運行時產生的隨機token,這裡你可能需要對檔案名稱加密,只有知道這個密鑰的應用程式才能讀取或修改檔案內容。

  如下是一個簡單的產生加密檔案名稱檔案的樣本:

<?php$pathPrefix = ‘/tmp/skiResort';// for demonstration, construct a secret here$secret = ‘Today is ‘ . date( “l, d F.” );$randomPart = sha1( $secret );$tempFilename = $pathPrefix . $randomPart;touch( $tempFilename );chmod ( $tempFilename, 0600 );// now work with the file// … assuming data in $valuefile_put_contents( $tempFilename, $value );// …// when done with temporary file, delete itunlink ( $tempFilename );?>

2.約束存取權限

  為了降低臨時檔案被執行或劫持的可能性,需要設定臨時檔案和臨時檔案目錄的存取權限。通常情況下,將臨時檔案的使用權限設定為rw——-,臨時檔案目錄的使用權限設定為rwx——。

  此外,也可以通過設定apache的設定檔來限制訪問(只有你將臨時檔案放在www目錄下的時候),如下:

order deny,allowdeny from all

3.唯寫已知檔案

  既然你是臨時檔案的建立者和作者,那你應該隨時知道哪些檔案存在,檔案裡有哪些內容。前面提到的方法,只是讓臨時檔案劫持更困難,但不能完全杜絕劫持者替換檔案或者在檔案後面追加一些內容的可能,所以在你建立或寫檔案時,需要仔細檢查檔案內容是否滿足要求。

當你使用w+的方式,建立了一個檔案,在你開始寫之前,這個檔案應該為空白,如下

<?phpif ( filesize( $tempFilename ) === 0 ) {// write to the file} else {exit ( “$tempFilename is not empty.\nStart over again.”);}?>

  如果檔案不為空白,可能你建立的有問題,也有可能劫持者在你建立與寫檔案的這個時間段內作了手腳。

還有可能,你第一次成功寫入了臨時檔案,但在你後面的寫的過程中,劫持者對這個臨時檔案進行了一些操作,這種情況可以通過檢驗碼的方式來檢查,如下:

<?php// write something to the file; then hash it$hashnow = sha1_file( $tempFilename );$_SESSION['hashnow'] = $hashnow;// later, get ready to write again$hashnow = sha1_file( $tempFilename );if ( $hashnow === $_SESSION['hashnow'] ) {// write to the file again// get and save a new hash$hashnow = sha1_file( $tempFilename );$_SESSION['hashnow'] = $hashnow;} else {exit ( “Temporary file contains unexpected contents.\nStart over again.”);}?>

4.唯讀已知檔案

  與唯寫已知檔案類似,在讀檔案前需要檢查檢驗碼是否一致,防止臨時檔案被篡改。除此之外,如果你使用了openssl,可以在寫檔案的時候,將合法認證放在檔案的末尾,這樣的讀的時候可以先檢查檔案末尾是否存在合法的認證;如果你沒有使用openssl,也可以寫入一段特定的演算法產生的token,原理類似。

5.檢查上傳的檔案

  判斷檔案是否是通過 HTTP POST 上傳的

bool is_uploaded_file ( string $filename )

  如果 filename 所給出的檔案是通過 HTTP POST 上傳的則返回 TRUE。這可以用來確保惡意的使用者無法欺騙指令碼去訪問本不能訪問的檔案,例如 /etc/passwd。 如果上傳的檔案有可能會造成對使用者或本系統的其他使用者顯示其內容的話,這種檢查顯得格外重要。

  為了能使 is_uploaded_file() 函數正常工作,必須指定類似$_FILES['userfile']['tmp_name'] 的變數,而不是從用戶端上傳的檔案名稱 $_FILES['userfile']['name']。需要注意的是is_uploaded_file返回false,不一定是上傳檔案被劫持了,也有可能是檔案太大或者上傳部分等,這些可以通過$_FILES['userfile']['error']查看。

http://www.bkjia.com/PHPjc/824638.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/824638.htmlTechArticle一、 簡介 臨時檔案,顧名思義是臨時產生的檔案,且檔案的生命週期很短。 然而,很多應用的運行都離不開臨時檔案,臨時檔案在我們電...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.