PHP fopen

fopen() 函式打開檔案或者 URL。 如果打開失敗,本函式返回 FALSE。 打開成功,本函式返回TRUE。

基本介紹

  • 中文名:PHP fopen
  • 外文名:PHP fopen
  • 功能:打開檔案或者 URL
  • 類型:語法
語法,mode 參數的可能的值,說明,提示和注釋,例子,例子2,PHP的fopen漏洞,

語法

fopen(filename,mode,include_path,context)
參數
描述
filename
規定要打開的檔案或 URL。
mode
規定要求到該檔案/流的訪問類型。可能的值見下表。
include_path
如果也需要在 include_path 中檢索檔案的話,可以將該參數設為 1 或 TRUE。
context
規定檔案句柄的環境。Context 是可以修改流的行為的一套選項。

mode 參數的可能的值

模式
模式名稱
說明
"r"
唯讀
讀模式——打開檔案,從檔案頭開始讀
"r+"
唯讀
讀寫模式——打開檔案,從檔案頭開始讀寫
"w"
只寫
寫模式——打開檔案,從檔案頭開始讀,如果檔案已經存在,將刪除所有檔案已有的內容。如果檔案不存在,函式將創建這個檔案
"w+"
只寫
讀寫模式——打開檔案,從檔案頭開始讀寫,如果檔案已經存在,將刪除所有檔案已有的內容。如果檔案不存在,函式將創建這個檔案
"a"
追加
追加模式——打開一個檔案,如果該檔案已有內容,將從檔案末尾開始追加(寫),如果檔案不存在,函式將創建這個檔案
"a+"
追加
追加模式——打開一個檔案,如果該檔案已有內容,將從檔案末尾開始追加(寫)或者讀,如果檔案不存在,函式將創建這個檔案
"x"
謹慎寫
寫模式打開檔案,從檔案頭開始寫,如果檔案已經存在,該檔案將不會被打開,fopen()函式將返回false,而且PHP將產生一個警告。如果檔案已經不存在,將嘗試創建。
"x+"
謹慎寫
讀/寫模式打開檔案,從檔案頭開始寫,如果檔案已經存在,該檔案將不會被打開,fopen()函式將返回false,而且PHP將產生一個警告,如果檔案不存在,將嘗試創建。
b
二進制
二進制模式——與其他模式進行連線,如果檔案系統能夠區分二進制檔案和文本檔案,你可能會使用它,Windows系統可以區分,UNIX系統則不區分,推薦一直使用這個選項,以便獲得最大程度的可移植性,二進制模式是默認的模式
t
文本
用語與其他模式的結合,這個模式只是Windows系統下的一個選項,它不是一個推薦選項,除非你曾經在代買中使用了b選項。

說明

fopen() 將filename指定的名字資源綁定到一個流上。如果filename是 "scheme://..." 的格式,則被當成一個 URL,PHP 將搜尋協定處理器(也被稱為封裝協定)來處理此模式。如果該協定尚未註冊封裝協定,PHP 將發出一條訊息來幫助檢查腳本中潛在的問題並將filename當成一個普通的檔案名稱繼續執行下去。
如果 PHP 認為filename指定的是一個本地檔案,將嘗試在該檔案上打開一個流。該檔案必須是 PHP 可以訪問的,因此需要確認檔案訪問許可權允許該訪問。如果激活了安全模式或者 open_basedir 則會套用進一步的限制。
如果 PHP 認為filename指定的是一個已註冊的協定,而該協定被註冊為一個網路 URL,PHP 將檢查並確認 allow_url_fopen 已被激活。如果關閉了,PHP 將發出一個警告,而 fopen 的調用則失敗。
context的支持是 PHP 5.0.0 添加的。

提示和注釋

注釋:不同的作業系統家族具有不同的行結束習慣。當寫入一個文本檔案並想插入一個新行時,需要使用符合作業系統的行結束符號。基於 Unix 的系統使用 \n 作為行結束字元,基於 Windows 的系統使用 作為行結束字元,基於 Macintosh 的系統使用 \r 作為行結束字元。 如果寫入檔案時使用了錯誤的行結束符號,則其它應用程式打開這些檔案時可能會表現得很怪異。
Windows 下提供了一個文本轉換標記("t")可以透明地將 \n 轉換為 。與此對應還可以使用 "b" 來強制使用二進制模式,這樣就不會轉換數據。要使用這些標記,要么用 "b" 或者用 "t" 作為 mode 參數的最後一個字元。
默認的轉換模式依賴於 SAPI 和所使用的 PHP 版本,因此為了便於移植鼓勵總是指定恰當的標記。如果是操作純文本檔案並在腳本中使用了 \n 作為行結束符,但還要期望這些檔案可以被其它應用程式例如 Notepad 讀取,則在 mode 中使用 "t"。在所有其它情況下使用 "b"。
在操作二進制檔案時如果沒有指定 "b" 標記,可能會碰到一些奇怪的問題,包括壞掉的圖片檔案以及關於 字元的奇怪問題。
注釋:為移植性考慮,強烈建議在用 fopen() 打開檔案時總是使用 "b" 標記。
注釋:再一次,為移植性考慮,強烈建議你重寫那些依賴於 "t" 模式的代碼使其使用正確的行結束符並改成 "b" 模式。

例子

<?php
$file = fopen("test.txt","r");
$file = fopen("/home/test/test.txt","r");
$file = fopen("/home/test/test.gif","wb");
$file = fopen("網站地址/","r");
$file = fopen("網站地址","w");
?>

例子2

採集遠程內容
<?
if(!($myFile=fopen(http://網站地址,"r")))
{
echo "The news interface is down for maintenance.";
exit;
}
while(!feof($myFile))
{
// Read each line and add to $myLine
$myLine.=fgets($myFile,255);
}
fclose($myFile);
$start="<hr align=";
$end="建立鏡像";
$start_position=strpos($myLine, $start);
$end_position=strpos($myLine, $end)+strlen($end);
$length=$end_position-$start_position;
$myLine=substr($myLine, $start_position, $length);
echo $myLine;
?>
PHP Filesystem 函式

PHP的fopen漏洞

PHP 的 fopen(), file() 及其它函式存在一個缺陷,即用戶隨意地添加額外HTTP報頭信息到HTTP請求數據包中。攻擊者可以利用此缺陷繞過伺服器的安全限制,進行非法訪問。在某些情況下,這個缺陷甚至可以打開任意的網路連線,在代理端執行PHP腳本和打開郵件轉發。 PHP 有一些函式用檔案名稱(如:fopen(), file()等)作為它們的參數。如果在php.ini中allow_url_fopen被設定為打開的,這些函式也允許以接受URL來替代接收檔案,並且用正確的協定連線到伺服器。那么這些函式將很容易遭到 CRLF Injection 攻擊。

熱門詞條

聯絡我們