亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

PHP安全之臨時文件的安全

2024-09-04 11:50:21
字體:
來源:轉載
供稿:網友

(一)臨時文件簡介

臨時文件,顧名思義是臨時的文件,文件的生命周期短。
然而,很多應用的運行都離不開臨時文件,臨時文件在我們電腦上無處不在,通常有以下幾種形式的臨時文件:

  • 文件或圖形編輯程序,所生成的中間文件
  • 數據庫查詢時,生成的臨時緩存文件,提供之前的結果數據而,以減少再次訪問數據庫的代價;通常用于遠程數據庫或遠程xml的服務
  • 文件被上傳后在服務端的臨時儲存,其文件名為php的全局變量$_FILES['userfile']['tmp_name']的值
  • 在http請求中,用于存放session的臨時文件,這些文件名通常就是sessionid(如 sess_7483ae44d51fe21353afb671d13f7199)
  • 在不同應用或相同應用傳遞數據,而對方要求基于文件的輸入,此時用臨時文件存放數據

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

1)位置
臨時文件通常被創建并存放在默認的路徑,在一個典型的Linux系統中,至少有兩個目錄或分區保持著臨時文件。其中之一是/tmp目錄,再者是/var/tmp。在更新的Linux內核的系統中,還可能有/dev/shm,它是用tmpfs文件系統裝載的。有時臨時文件,也可能放在用戶home目錄下的隱藏子目錄中。使用默認臨時文件目錄的好處在于,系統進程可以方便查找和讀寫。
然而,默認臨時文件的存放目錄可能成為損害系統安全的僵尸和rootkit的溫床。這是因為在多數情況下,任何人(或任何進程)都可以向這些目錄寫入東西,有不安全的許可問題。比如我們都知道sticky bit,該位可以理解為防刪除位。如果希望用戶能夠添加文件但同時不能刪除文件, 則可以對文件使用sticky bit位。設置該位后,就算用戶對目錄具有寫權限,也不能刪除該文件。多數Linux發行版本在臨時目錄上設置sticky位,這意味著用戶A不能清除屬于用戶B的一個文件,反之亦然。但是,根據文件自身的許可,用戶A有可能查看并修改那個文件的內容。

2)持久
前面提到臨時文件是非持久的,在程序結束時,會被刪除,但有的時候臨時文件也會被迫持久保存了,沒有被刪除,如:

  • 應用程序在關閉前崩潰了,還沒有機會刪除臨時文件
  • 應用程序還跑著,但操作系統崩潰了
  • 文件復制過程中由于空間問題而復制失敗,導致中間文件沒有刪除
  • 操作系統進程通常會定期清空的默認臨時文件目錄,但可能因為某些原因,而刪除失敗
  • 寫得不好的應用程序,可能忽略或者忘記了刪除臨時文件

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腳本到你的臨時目錄,而且通過某種方式執行了它,那可能造成悲劇了。如下:
<?php exec(‘rm /*.*’); ?>
3.3)劫持
攻擊者可能為了自己的目的,而劫持你的臨時文件。他可能替換你的臨時文件,也可能在你的臨時文件后面追加一些信息。

劫持臨時文件的目的包括:

  • 讓你的應用程序處理他的數據,而不是你自己的數據
  • 暴露隱私數據,比如系統的密碼文件,或者其它php安全模式不能正常讀的文件
  • 刪除數據,阻礙請求的正常進行
  • 創建并輸出虛假的數據,破壞請求的結果
  • 通過提供虛假的數據,對使用數據進行下一步處理的應用程序造成破壞
  • 將你的輸出重定向到其它地方,可以方便攻擊者訪問或者覆蓋系統文件

劫持通常與競爭條件相關。當兩個不同的進程操作同一個文件的時候,就可能產生競爭條件。例如,一個讀進程和一個寫進程同時操作一段數據,當寫進程只完成了一部分的時候,讀進程已經完成,這樣讀的到內容一部分是新的,一部分是舊的,也就是我們常說的讀臟數據。
臨時文件的劫持,在一定程度上會造成競爭條件,除非劫持者準確的把握時間和位置,否則就會造成此類安全問題。

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

1)調整存放位置
防止臨時文件被惡意利用的最重要,也是最簡單的一步就是讓你的臨時文件目錄以及名字不容易被猜到。任何對臨時文件的惡意利用,攻擊者都必須知道臨時文件的名字和路徑,因此你應該盡可能的讓他難以猜到你的臨時文件名字及路徑。
建議你在臨時文件目錄的選擇時,還是將你的臨時文件放在默認的目錄下吧,這樣系統進程可以方便找到以及讀寫。而把精力花費放在為文件名想個合適的難猜的名字。
php的tempnam()函數,可以創建一個臨時文件,并且其自動生成的文件名不會與當前目錄下的其它文件名沖突,此函數創建的文件默認權限是600,即rw——-。
例如

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

運行后可能生成一個名為myTempfile1af的文件,當第二次運行的時候就生成了名為myTempfile1b0的文件名。
也許一些編程實踐指南會建議你在使用tempnam()生成文件的時候,用一些有意義的前綴來命名,這樣能通過文件名看出文件中包含的數據或者需要此數據的應用,但從安全性的角度來看最好不要這樣,這樣等于為攻擊者指明了方向。

這里介紹一種方法,即能有一定意義的前綴同時也讓攻擊者不那么好猜,如下:

<?php
// define the parts of the filename
define (‘TMP_DIR’,'/tmp/’);
$prefix = ‘skiResort’;
// construct the filename
$tempFilename = uniqid( $prefix, TRUE );
// create the file
touch( $tempFilename );
// restrict permissions
chmod ( $tempFilename, 0600 );
// now work with the file
// … assuming data in $value
file_put_contents( $tempFilename, $value );
// …
// when done with temporary file, delete it
unlink ( $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 $value
file_put_contents( $tempFilename, $value );
// …
// when done with temporary file, delete it
unlink ( $tempFilename );
?>

2)約束訪問權限
為了降低臨時文件被執行或劫持的可能性,需要設置臨時文件和臨時文件目錄的訪問權限。通常情況下,將臨時文件的權限設置為rw——-,臨時文件目錄的權限設置為rwx——。
此外,也可以通過設置apache的配置文件來限制訪問(只有你將臨時文件放在www目錄下的時候),如下:

<Directory /var/www/myapp/tmp>
<FilesMatch “/.ph(p(3|4)?|tml)$”>
order deny,allow
deny from all
</FilesMatch>
</Directory>

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

  • 當你使用w+的方式,創建了一個文件,在你開始寫之前,這個文件應該為空,如下
<?php
if ( 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']查看。

參考文獻:
《Apress pro.php security 2th》
http://cn.php.net/is_uploaded_file
http://www.49028c.com/article/4906

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产婷婷97碰碰久久人人蜜臀| 欧美精品一本久久男人的天堂| 欧美激情亚洲一区| 97超碰蝌蚪网人人做人人爽| 精品国产一区二区三区久久狼5月| 欧美高清第一页| 亚洲色图综合网| 久久999免费视频| 久久久久久久国产| 国产免费一区二区三区在线观看| 91免费国产视频| 日韩一中文字幕| 欧美激情中文字幕在线| 欧美成人h版在线观看| 午夜精品久久久久久久男人的天堂| 欧美精品制服第一页| 久久中文字幕一区| 国产精品草莓在线免费观看| 日本久久久久久| 国产精品久久久久久久久免费看| 国产精品视频免费在线观看| 亚洲欧洲午夜一线一品| 国产z一区二区三区| 成人免费观看a| 成人黄色av网| 日韩视频免费中文字幕| 日韩欧美精品免费在线| 国产精品日韩欧美综合| 日韩精品高清在线| 欧美一区亚洲一区| 国产精品爽爽ⅴa在线观看| 精品国产依人香蕉在线精品| 久久资源免费视频| 91久久综合亚洲鲁鲁五月天| 亚洲视频综合网| 欧美日韩激情视频| 欧美日韩电影在线观看| 久久久999国产精品| 国产成人免费91av在线| 亚洲va码欧洲m码| 日韩一区二区久久久| 91精品视频在线播放| 国产精品美女主播在线观看纯欲| 国产精品专区第二| 亚洲精品一区二区网址| 亚洲欧美日韩综合| 黑人巨大精品欧美一区二区| 狠狠色狠狠色综合日日五| 97精品久久久中文字幕免费| 国产精品欧美日韩| 国产精品久久久久久久午夜| 亚洲成av人片在线观看香蕉| 欧美猛男性生活免费| 精品中文字幕在线| 欧美精品精品精品精品免费| 中文字幕无线精品亚洲乱码一区| 精品久久久999| 欧美性xxxx在线播放| 欧美电影免费观看高清| 国产精品一区二区在线| 国产精品成人免费电影| 国产精品久久久久久久9999| 色久欧美在线视频观看| 午夜美女久久久久爽久久| 欧美中文字幕在线视频| www.久久色.com| 亚洲精品久久久久久下一站| 国产91亚洲精品| 欧美精品做受xxx性少妇| 国产精品久久久久福利| 美女福利视频一区| 亚洲男人的天堂在线播放| 国产一区二区三区在线视频| 日韩精品视频免费| 奇米影视亚洲狠狠色| 日本精品久久电影| 成人福利视频网| 亚洲理论在线a中文字幕| 欧美日韩国产成人| 成人黄色生活片| 国产精品27p| 国产婷婷97碰碰久久人人蜜臀| 中文字幕日韩欧美精品在线观看| 91精品成人久久| 欧美一区二粉嫩精品国产一线天| 亚洲欧洲xxxx| 欧美性高潮床叫视频| 国产日韩欧美在线视频观看| 69影院欧美专区视频| 久久久久五月天| 色久欧美在线视频观看| 91精品久久久久久久久久久久久久| 国产亚洲一区二区在线| 91久久精品国产91久久性色| 国产极品jizzhd欧美| 欧美午夜性色大片在线观看| 欧美一区二区三区四区在线| 亚洲一区二区三区sesese| 久久精品国产亚洲精品| 日本中文字幕不卡免费| 国产日韩精品在线播放| 亚洲一区二区少妇| 国产精品久久一| 国产精品免费久久久| 欧美另类暴力丝袜| 亚洲国产精品va在线看黑人| 国产亚洲成精品久久| 57pao成人国产永久免费| 国产免费一区二区三区在线能观看| 色悠悠国产精品| 色婷婷久久一区二区| 92福利视频午夜1000合集在线观看| 国产成人精品在线播放| 亚洲精品乱码久久久久久按摩观| 亚洲精品ady| 欧美午夜影院在线视频| 亚洲国产精彩中文乱码av| 欧美性jizz18性欧美| 红桃视频成人在线观看| 国产精品极品尤物在线观看| 一区二区成人精品| 日本高清视频精品| 色诱女教师一区二区三区| 久久精品中文字幕免费mv| 日本中文字幕不卡免费| 国产男人精品视频| 51午夜精品视频| 欧美日韩人人澡狠狠躁视频| 欧美成人午夜影院| 亚洲国产97在线精品一区| 中文字幕日韩av电影| 影音先锋欧美精品| 中文字幕亚洲天堂| 成人在线免费观看视视频| 久久精品久久久久久| 国产精品视频在线观看| 欧美久久精品一级黑人c片| 91免费视频网站| 国产91热爆ts人妖在线| 日本一区二区在线免费播放| 日韩最新在线视频| 久久精品国产亚洲一区二区| 日本国产精品视频| 国产精品扒开腿做爽爽爽男男| 日韩人体视频一二区| 久久久免费在线观看| 91精品国产91久久| 欧美与欧洲交xxxx免费观看| 欧美日韩成人在线观看| 欧美日韩成人精品| 色婷婷av一区二区三区在线观看| 亚洲国产精品久久| 亚洲精品日韩激情在线电影| 久久精品最新地址| 日韩欧美在线视频日韩欧美在线视频| 国产97在线播放| 97香蕉超级碰碰久久免费软件| 欧美大片在线影院| 久久久久久中文字幕| 在线电影av不卡网址| 色偷偷888欧美精品久久久| 亚洲91精品在线观看| 亚洲人成网站在线播| 久久精品成人欧美大片古装|