PHP中的file_put_contents函數詳解

小云云
發布: 2023-03-18 21:48:01
原創
5307 人瀏覽過

本文主要和大家分享PHP中的file_put_contents函數詳解,最近在EIS上遇到一道文件上傳的題,發現過濾了<,這樣基本很多姿勢都無效了,想了很久沒做出來這題,賽後才知道是利用數組來繞過, 這裡分析了下原理,話不多說了,來一起看看詳細的介紹吧。

來看file_put_contents函數第二個參數data的官網定義:

data
要写入的数据。类型可以是 string,array 或者是 stream 资源(如上面所说的那样)。
 
如果 data 指定为 stream 资源,这里 stream 中所保存的缓存数据将被写入到指定文件中,这种用法就相似于使用 stream_copy_to_stream() 函数。
 
参数 data 可以是数组(但不能为多维数组),这就相当于 file_put_contents($filename, join(&#39;&#39;, $array))。
登入後複製

可以看到,data參數可以是陣列, 會自動做join('',$array)轉換為字串的

當函數存取檔案時,請遵循以下規則:

  • # 如果設定了 FILE_USE_INCLUDE_PATH,那麼將檢查 *filename* 副本的內建路徑


  • ## 如果檔案不存在,將會建立一個檔案


  • # 開啟檔案


  • # 如果設定了 LOCK_EX,那麼將鎖定檔案


  • # 如果設定了 FILE_APPEND,那麼將會移至文件末尾。否則,將會清除檔案的內容


  • # 向檔案中寫入資料


  • 關閉檔案並對所有檔案解鎖


  • # 如果成功,函數將傳回寫入檔案中的字元數。如果失敗,則傳回 False。

但我們字串過濾函數一般是用preg_match函數來過濾的,如:

if(preg_match(&#39;/\</&#39;,$data)){
 die(&#39;hack&#39;);
}
登入後複製

我們知道,很多處理字串的函數如果傳入數組會出錯返回NULL, 如strcmp,strlen,md5等, 但preg_match 函數出錯返回false, 這裡我們可以通過var_dump(preg_match('/

因此,猜測檔案上傳的程式碼是這樣寫的

<?php 
 
if(isset($_POST[&#39;content&#39;]) && isset($_POST[&#39;ext&#39;])){
 $data = $_POST[&#39;content&#39;];
 $ext = $_POST[&#39;ext&#39;];
 
 //var_dump(preg_match(&#39;/\</&#39;,$data));
 if(preg_match(&#39;/\</&#39;,$data)){
  die(&#39;hack&#39;);
 }
 $filename = time();
 file_put_contents($filename.$ext, $data);
}
 
?></p>
於是我麼可以傳入content[]=<?php phpinfo();?>&ext=php 這樣來繞過<p></p>#
修復方法<p><br></p>
修正方法是使用fwrite 函數來取代危險的file_put_contents函數,fwrite函數只能傳入字串,如果是陣列會出錯回傳false<p><pre class="brush:php;toolbar:false"><?php 
 
if(isset($_POST[&#39;content&#39;]) && isset($_POST[&#39;ext&#39;])){
 $data = $_POST[&#39;content&#39;];
 $ext = $_POST[&#39;ext&#39;];
 
 //var_dump(preg_match(&#39;/\</&#39;,$data));
 if(preg_match(&#39;/\</&#39;,$data)){
  die(&#39;hack&#39;);
 }
 $filename = time();
 // file_put_contents($filename.$ext, $data);
 $f = fopen($filename.$ext);
 var_dump(fwrite($f,$data));
}
 
?>
登入後複製

相關推薦:


#有關php file_put_contents()函數的文章推薦10篇

#php怎麼實作file_put_contents追加與換行?

PHP中fwrite與file_put_contents的差異

#

以上是PHP中的file_put_contents函數詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!