file_put_contents() 函數把一個字串寫入檔案中。最近發現file_put_contents函數有一直沒注意到的問題,所以下面這篇文章主要給大家介紹了關於PHP中危險的file_put_contents函數的相關資料,需要的朋友可以參考借鑒,下面來一起看吧。
來看file_put_contents函數第二個參數data的官網定義:
data 要写入的数据。类型可以是 string,array 或者是 stream 资源(如上面所说的那样)。 如果 data 指定为 stream 资源,这里 stream 中所保存的缓存数据将被写入到指定文件中,这种用法就相似于使用 stream_copy_to_stream() 函数。 参数 data 可以是数组(但不能为多维数组),这就相当于 file_put_contents($filename, join('', $array))。
可以看到,data參數可以是陣列, 會自動做join('',$array)
轉換為字串的
# 當函數存取檔案時,請遵循以下規則:
如果設定了 FILE_USE_INCLUDE_PATH,那麼將檢查 *filename* 副本的內建路徑
if(preg_match('/\</',$data)){ die('hack'); }
var_dump(preg_match('/' ,$data)); 來驗證, 這樣的話,preg_match 的正規過濾就失效了
<?php if(isset($_POST['content']) && isset($_POST['ext'])){ $data = $_POST['content']; $ext = $_POST['ext']; //var_dump(preg_match('/\</',$data)); if(preg_match('/\</',$data)){ die('hack'); } $filename = time(); file_put_contents($filename.$ext, $data); } ?>
content[]=&ext=php 這樣來繞過
修復方法
<?php if(isset($_POST['content']) && isset($_POST['ext'])){ $data = $_POST['content']; $ext = $_POST['ext']; //var_dump(preg_match('/\</',$data)); if(preg_match('/\</',$data)){ die('hack'); } $filename = time(); // file_put_contents($filename.$ext, $data); $f = fopen($filename.$ext); var_dump(fwrite($f,$data)); } ?>
#有關php file_put_contents()函數的文章建議10篇
#PHP中fwrite與file_put_contents的差異
php file_put_contents 函數_PHP教學
php file_put_contents 函數_PHP教學
#########以上是PHP中危險的file_put_contents函數詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!