目的:識別使用者上傳的XML
問題1:使用者上傳的XML可能存在修改尾碼的情況,即本身是指令碼語言,卻偽裝成XML,例如PHP
已解決:那麼我通過下面的代碼來準確擷取檔案尾碼
問題2:代碼是通過fread讀取檔案頭兩位元組,在識別圖片方面非常好使,但是在區別xml和PHP方面卻不是很清晰了,因為他們頭兩個位元組都是'
if (($fp = fopen($this->path, 'rb')) == FALSE) { throw new \Exception('開啟檔案失敗。'); } if (!($read = fread($fp, 2))) { throw new \Exception('檔案內容讀取為空白或讀取失敗'); }; $info = unpack('C2chars', $read); $code = intval($info['chars1'].$info['chars2']); fclose($fp); switch ($code) { case 3780: return 'pdf'; case 5666: return 'psd'; case 6033: return 'html'; case 6063: return 'xml'; // php default: throw new \Exception('檔案格式超出了系統識別範圍。'); }
回複內容:
目的:識別使用者上傳的XML
問題1:使用者上傳的XML可能存在修改尾碼的情況,即本身是指令碼語言,卻偽裝成XML,例如PHP
已解決:那麼我通過下面的代碼來準確擷取檔案尾碼
問題2:代碼是通過fread讀取檔案頭兩位元組,在識別圖片方面非常好使,但是在區別xml和PHP方面卻不是很清晰了,因為他們頭兩個位元組都是'
if (($fp = fopen($this->path, 'rb')) == FALSE) { throw new \Exception('開啟檔案失敗。'); } if (!($read = fread($fp, 2))) { throw new \Exception('檔案內容讀取為空白或讀取失敗'); }; $info = unpack('C2chars', $read); $code = intval($info['chars1'].$info['chars2']); fclose($fp); switch ($code) { case 3780: return 'pdf'; case 5666: return 'psd'; case 6033: return 'html'; case 6063: return 'xml'; // php default: throw new \Exception('檔案格式超出了系統識別範圍。'); }
其實我覺得沒你想的那麼複雜啊,不要太在意尾碼這個問題嘛,關鍵是檔案內容。你只要用XML類解析就好咯,比如simplexml,如果不是規範的XML文檔的話是會返回false的,另外最後也可以將內容全部轉換為string防止檔案內代碼的執行。