這篇文章主要介紹“PHP臨時(shí)文件的安全性怎么樣”,在日常操作中,相信很多人在PHP臨時(shí)文件的安全性怎么樣問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”PHP臨時(shí)文件的安全性怎么樣”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
一、簡(jiǎn)介
臨時(shí)文件,顧名思義是臨時(shí)產(chǎn)生的文件,且文件的生命周期很短。
然而,很多應(yīng)用的運(yùn)行都離不開臨時(shí)文件,臨時(shí)文件在我們電腦上無(wú)處不在,主要有以下幾種形式的臨時(shí)文件:
1.文件或圖形編輯程序,所生成的中間文件
2.數(shù)據(jù)庫(kù)查詢時(shí),生成的臨時(shí)緩存文件,提供之前的結(jié)果數(shù)據(jù)而,以減少再次訪問(wèn)數(shù)據(jù)庫(kù)的代價(jià);通常用于遠(yuǎn)程數(shù)據(jù)庫(kù)或遠(yuǎn)程xml的服務(wù)
3.文件被上傳后在服務(wù)端的臨時(shí)儲(chǔ)存,其文件名為php的全局變量$_FILES['userfile']['tmp_name']的值
4.在http請(qǐng)求中,用于存放session的臨時(shí)文件,這些文件名通常就是sessionid(如 sess_7483ae44d51fe21353afb671d13f7199)
5.在不同應(yīng)用或相同應(yīng)用傳遞數(shù)據(jù),而對(duì)方要求基于文件的輸入,此時(shí)用臨時(shí)文件存放數(shù)據(jù)
二、臨時(shí)文件的安全特征
臨時(shí)文件的較大特征就是它的非持久性,除此之外,從安全性的角度,可以從以下幾個(gè)方面關(guān)注臨時(shí)文件的其它特點(diǎn)或風(fēng)險(xiǎn):
1.臨時(shí)文件的位置
臨時(shí)文件通常被創(chuàng)建并存放在默認(rèn)的路徑,在一個(gè)典型的Linux系統(tǒng)中,至少有兩個(gè)目錄或分區(qū)保持著臨時(shí)文件。其中之一是/tmp目錄,再者是/var/tmp。在更新的Linux內(nèi)核的系統(tǒng)中,還可能有/dev/shm,它是用tmpfs文件系統(tǒng)裝載的。有時(shí)臨時(shí)文件,也可能放在用戶home目錄下的隱藏子目錄中。使用默認(rèn)臨時(shí)文件目錄的好處在于,系統(tǒng)進(jìn)程可以方便查找和讀寫。
然而,默認(rèn)臨時(shí)文件的存放目錄可能成為損害系統(tǒng)安全的僵尸和rootkit的溫床。這是因?yàn)樵诙鄶?shù)情況下,任何人(或任何進(jìn)程)都可以向這些目錄寫入東西,有不安全的許可問(wèn)題。比如我們都知道sticky bit,該位可以理解為防刪除位。如果希望用戶能夠添加文件但同時(shí)不能刪除文件, 則可以對(duì)文件使用sticky bit位。設(shè)置該位后,就算用戶對(duì)目錄具有寫權(quán)限,也不能刪除該文件。多數(shù)Linux發(fā)行版本在臨時(shí)目錄上設(shè)置sticky位,這意味著用戶A不能清除屬于用戶B的一個(gè)文件,反之亦然。但是,根據(jù)文件自身的許可,用戶A有可能查看并修改那個(gè)文件的內(nèi)容。
2.臨時(shí)文件的持久性
前面提到臨時(shí)文件是非持久的,在程序結(jié)束時(shí),會(huì)被刪除,但有的時(shí)候臨時(shí)文件也會(huì)被迫持久保存了,沒(méi)有被刪除,如:
2.1 應(yīng)用程序在關(guān)閉前崩潰了,還沒(méi)有機(jī)會(huì)刪除臨時(shí)文件
2.2 應(yīng)用程序還跑著,但操作系統(tǒng)崩潰了
2.3 文件復(fù)制過(guò)程中由于空間問(wèn)題而復(fù)制失敗,導(dǎo)致中間文件沒(méi)有刪除
2.4 操作系統(tǒng)進(jìn)程通常會(huì)定期清空的默認(rèn)臨時(shí)文件目錄,但可能因?yàn)槟承┰?,而刪除失敗
2.5 寫得不好的應(yīng)用程序,可能忽略或者忘記了刪除臨時(shí)文件
3.臨時(shí)文件的風(fēng)險(xiǎn)性
無(wú)用的臨時(shí)文件像幽靈一樣存在你的服務(wù)器上,一方面占用硬盤,另一方面,可以被其它人非法使用,存著如下一些風(fēng)險(xiǎn):
3.1可見性
眾所周知,將私有數(shù)據(jù)公開很有風(fēng)險(xiǎn)。一旦用戶通過(guò)某些手段(如shell或者ftp)竊取了你的臨時(shí)文件,就可以獲取到用戶或企業(yè)的私有數(shù)據(jù),從而對(duì)你造成影響。
例如:臨時(shí)文件2011_Confidential_Sales_Strategies.tmp,可能暴露你們公司2011年的商業(yè)策略,這對(duì)你的競(jìng)爭(zhēng)對(duì)手來(lái)說(shuō),將很有用處;而對(duì)于session劫持者來(lái)說(shuō),存放用戶session信息的臨時(shí)文件sess_95971078f4822605e7a18c612054f658非常關(guān)鍵。
除此之外,還有別的情況臨時(shí)文件可能會(huì)被偷窺,如:一個(gè)拼寫檢查的服務(wù),返回結(jié)果的url是:http://bad.example.com/spellcheck.php?tmp_file=spellcheck46 ,攻擊者分析你的url參數(shù)后使用http://bad.example.com/spellcheck.php?tmp_file=spellcheck45 就可以訪問(wèn)到前一個(gè)用戶的驗(yàn)證結(jié)果了。
3.2 可執(zhí)行性
通常臨時(shí)文件是不可執(zhí)行,但如果攻擊者上傳了一個(gè)php腳本到你的臨時(shí)目錄,而且通過(guò)某種方式執(zhí)行了它,那可能造成悲劇了。
3.3 臨時(shí)文件被劫持
攻擊者可能為了自己的目的,而劫持你的臨時(shí)文件。他可能替換你的臨時(shí)文件,也可能在你的臨時(shí)文件后面追加一些信息。
劫持臨時(shí)文件的目的包括:
(1)讓你的應(yīng)用程序處理他的數(shù)據(jù),而不是你自己的數(shù)據(jù)
(2)暴露隱私數(shù)據(jù),比如系統(tǒng)的密碼文件,或者其它php安全模式不能正常讀的文件
(3)刪除數(shù)據(jù),阻礙請(qǐng)求的正常進(jìn)行
(4)創(chuàng)建并輸出虛假的數(shù)據(jù),破壞請(qǐng)求的結(jié)果
(5)通過(guò)提供虛假的數(shù)據(jù),對(duì)使用數(shù)據(jù)進(jìn)行下一步處理的應(yīng)用程序造成破壞
(6)將你的輸出重定向到其它地方,可以方便攻擊者訪問(wèn)或者覆蓋系統(tǒng)文件
劫持通常與競(jìng)爭(zhēng)條件相關(guān)。當(dāng)兩個(gè)不同的進(jìn)程操作同一個(gè)文件的時(shí)候,就可能產(chǎn)生競(jìng)爭(zhēng)條件。例如,一個(gè)讀進(jìn)程和一個(gè)寫進(jìn)程同時(shí)操作一段數(shù)據(jù),當(dāng)寫進(jìn)程只完成了一部分的時(shí)候,讀進(jìn)程已經(jīng)完成,這樣讀的到內(nèi)容一部分是新的,一部分是舊的,也就是我們常說(shuō)的讀臟數(shù)據(jù)。
臨時(shí)文件的劫持,在一定程度上會(huì)造成競(jìng)爭(zhēng)條件,除非劫持者準(zhǔn)確的把握時(shí)間和位置,否則就會(huì)造成此類安全問(wèn)題。
三、預(yù)防臨時(shí)文件被惡意使用
前面我們介紹了臨時(shí)文件的概念,以及臨時(shí)文件被惡用可能帶來(lái)的危害,這個(gè)部分主要介紹一些策略來(lái)預(yù)防臨時(shí)文件被惡意利用,以及減少其帶來(lái)的危害。
1.調(diào)整存放位置
防止臨時(shí)文件被惡意利用的最重要,也是最簡(jiǎn)單的一步就是讓你的臨時(shí)文件目錄以及名字不容易被猜到。任何對(duì)臨時(shí)文件的惡意利用,攻擊者都必須知道臨時(shí)文件的名字和路徑,因此你應(yīng)該盡可能的讓他難以猜到你的臨時(shí)文件名字及路徑。
建議你在臨時(shí)文件目錄的選擇時(shí),還是將你的臨時(shí)文件放在默認(rèn)的目錄下吧,這樣系統(tǒng)進(jìn)程可以方便找到以及讀寫。而把精力花費(fèi)放在為文件名想個(gè)合適的難猜的名字。
php的tempnam()函數(shù),可以創(chuàng)建一個(gè)臨時(shí)文件,并且其自動(dòng)生成的文件名不會(huì)與當(dāng)前目錄下的其它文件名沖突,此函數(shù)創(chuàng)建的文件默認(rèn)權(quán)限是600,即rw——-。
例如
$filename = tempnam( ‘..', ‘myTempfile');
運(yùn)行后可能生成一個(gè)名為myTempfile1af的文件,當(dāng)?shù)诙芜\(yùn)行的時(shí)候就生成了名為myTempfile1b0的文件名。
也許一些編程實(shí)踐指南會(huì)建議你在使用tempnam()生成文件的時(shí)候,用一些有意義的前綴來(lái)命名,這樣能通過(guò)文件名看出文件中包含的數(shù)據(jù)或者需要此數(shù)據(jù)的應(yīng)用,但從安全性的角度來(lái)看好不要這樣,這樣等于為攻擊者指明了方向。
這里介紹一種方法,即能有一定意義的前綴同時(shí)也讓攻擊者不那么好猜,如下:
<?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 ); ?>
這個(gè)腳本通過(guò)uniqid()函數(shù),生成的文件名格式為:/tmp/skiResort392942668f9b396c08.03510070,并通過(guò)chmod將文件的權(quán)限設(shè)置為600。
如果你需要與其它應(yīng)用共享信息,比如用戶密碼或運(yùn)行時(shí)生成的隨機(jī)token,這里你可能需要對(duì)文件名加密,只有知道這個(gè)密鑰的應(yīng)用程序才能讀取或修改文件內(nèi)容。
如下是一個(gè)簡(jiǎn)單的生成加密文件名文件的示例:
<?php $pathPrefix = ‘/tmp/skiResort'; // for demonstration, construct a secret here $secret = ‘Today is ‘ . date( “l(fā), 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.約束訪問(wèn)權(quán)限
為了降低臨時(shí)文件被執(zhí)行或劫持的可能性,需要設(shè)置臨時(shí)文件和臨時(shí)文件目錄的訪問(wèn)權(quán)限。通常情況下,將臨時(shí)文件的權(quán)限設(shè)置為rw——-,臨時(shí)文件目錄的權(quán)限設(shè)置為rwx——。
此外,也可以通過(guò)設(shè)置apache的配置文件來(lái)限制訪問(wèn)(只有你將臨時(shí)文件放在www目錄下的時(shí)候),如下:
order deny,allow deny from all
3.只寫已知文件
既然你是臨時(shí)文件的創(chuàng)建者和作者,那你應(yīng)該隨時(shí)知道哪些文件存在,文件里有哪些內(nèi)容。前面提到的方法,只是讓臨時(shí)文件劫持更困難,但不能完全杜絕劫持者替換文件或者在文件后面追加一些內(nèi)容的可能,所以在你創(chuàng)建或?qū)懳募r(shí),需要仔細(xì)檢查文件內(nèi)容是否滿足要求。
當(dāng)你使用w+的方式,創(chuàng)建了一個(gè)文件,在你開始寫之前,這個(gè)文件應(yīng)該為空,如下
<?php if ( filesize( $tempFilename ) === 0 ) { // write to the file } else { exit ( “$tempFilename is not empty.\nStart over again.”); } ?>
如果文件不為空,可能你創(chuàng)建的有問(wèn)題,也有可能劫持者在你創(chuàng)建與寫文件的這個(gè)時(shí)間段內(nèi)作了手腳。
還有可能,你第一次成功寫入了臨時(shí)文件,但在你后面的寫的過(guò)程中,劫持者對(duì)這個(gè)臨時(shí)文件進(jìn)行了一些操作,這種情況可以通過(guò)檢驗(yàn)碼的方式來(lái)檢查,如下:
<?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.只讀已知文件
與只寫已知文件類似,在讀文件前需要檢查檢驗(yàn)碼是否一致,防止臨時(shí)文件被篡改。除此之外,如果你使用了openssl,可以在寫文件的時(shí)候,將合法證書放在文件的末尾,這樣的讀的時(shí)候可以先檢查文件末尾是否存在合法的證書;如果你沒(méi)有使用openssl,也可以寫入一段特定的算法生成的token,原理類似。
5.檢查上傳的文件
判斷文件是否是通過(guò) HTTP POST 上傳的
bool is_uploaded_file ( string $filename )
如果 filename 所給出的文件是通過(guò) HTTP POST 上傳的則返回 TRUE。這可以用來(lái)確保惡意的用戶無(wú)法欺騙腳本去訪問(wèn)本不能訪問(wèn)的文件,例如 /etc/passwd。 如果上傳的文件有可能會(huì)造成對(duì)用戶或本系統(tǒng)的其他用戶顯示其內(nèi)容的話,這種檢查顯得格外重要。
為了能使 is_uploaded_file() 函數(shù)正常工作,必須指定類似$_FILES['userfile']['tmp_name'] 的變量,而不是從客戶端上傳的文件名 $_FILES['userfile']['name']。需要注意的是is_uploaded_file返回false,不一定是上傳文件被劫持了,也有可能是文件太大或者上傳部分等,這些可以通過(guò)$_FILES['userfile']['error']查看。
到此,關(guān)于“PHP臨時(shí)文件的安全性怎么樣”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
當(dāng)前題目:PHP臨時(shí)文件的安全性怎么樣-創(chuàng)新互聯(lián)
本文鏈接:http://aaarwkj.com/article10/ccjcgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、動(dòng)態(tài)網(wǎng)站、網(wǎng)站維護(hù)、面包屑導(dǎo)航、網(wǎng)站設(shè)計(jì)、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容