2016-08-07 51 views
0

我需要檢查上傳的文件是否爲favicon類型,我需要以安全的方式進行操作。如何檢測文件是否是PHP中的圖標?

如果我上傳通過輸入文件中的圖標文件和打印$_FILES變量,我可以看到變量有以下類型的值:

image/vnd.microsoft.icon

我知道我可以檢查,如果該值相匹配,但我認爲用戶可以翻轉它。如果有人能給我一些提示,我會很感激

+0

使用'Fileinfo'獲取MIME類型,然後將其與您所需的MIME類型進行比較。 http://php.net/Fileinfo –

+0

感謝您的評論。這是一個安全的方式來檢查它嗎?我想確保用戶不會篡改它。如果是這樣,你可以給我留下你的評論作爲答案,我會將它標記爲正確答案@CharlotteDunois –

+2

'本模塊中的函數嘗試通過在特定位置查找某些魔法字節序列來猜測文件的內容類型和編碼文件。雖然這不是一個防彈的方法,但是使用的啓發式方法做得非常好。「這比依靠'$ _FILES ['mime']'好得多' –

回答

1

如果你想避免使用任何外部工具,https://github.com/lordelph/icofileloader提供用於解析本地PHP方法。ico文件

$loader = new Elphin\IcoFileLoader\IcoFileService; 
try { 
    /** @var Elphin\IcoFileLoader\Icon $icon */ 
    $icon = $loader->fromFile('/path/to/icon.ico'); 

    //perform further inspection or render the icon as an image here... 

} catch (\Exception $e) { 
    //not an .ico file 
} 
+1

謝謝!奇蹟般有效! –

-1
  1. 使用工具將您的PNG轉換爲ico文件。你可以搜索「favicon generator」,你可以找到許多在線工具。
  2. 放入head向ICO地址與link - 標籤:

    <link rel="shortcut icon" href="http://sstatic.net/stackoverflow/img/favicon.ico"> 
    
+0

這不是OP的答案問題,甚至沒有試圖回答它。 –

+0

對不起,我不是這樣問的。我問如何通過表格檢測,如果一個文件是favicon或不安全的方式 –

2

您可以使用各種工具:

的FileInfo

您可以直接使用FileInfo從PHP:

$finfo = finfo_open(FILEINFO_MIME_TYPE); 
echo finfo_file($finfo, 'the_file_to_check.ico'); 
// Should print something like 'image/x-icon' 
finfo_close($finfo); 

如果FileInfo在您的系統上安裝,這可能是最簡單的方法。

的ImageMagick

ImageMagick的進一步進了一步通過實際解碼該文件的內容,列出被嵌入的圖像:

$ identify favicon.ico 
favicon.ico[0] ICO 16x16 16x16+0+0 32-bit sRGB 15.1KB 0.000u 0:00.000 
favicon.ico[1] ICO 32x32 32x32+0+0 32-bit sRGB 15.1KB 0.000u 0:00.000 
favicon.ico[2] ICO 48x48 48x48+0+0 32-bit sRGB 15.1KB 0.000u 0:00.000 

(在此示例命令行調用)

我不知道FileInfo如何與ICO文件一起使用,但ImageMagick可能更安全,因爲它確實需要解碼文件的重要部分。

由於ImageMagick支持很多格式,因此檢查其輸出並非簡單地返回代碼(它同樣適用於JPG,SVG等),這一點很重要。

IcoUtils

至於ImageMagick的輕量級替代,IcoUtils可以做的伎倆:

$ icotool -l favicon.ico 
--icon --index=1 --width=16 --height=16 --bit-depth=32 --palette-size=0 
--icon --index=2 --width=32 --height=32 --bit-depth=32 --palette-size=0 
--icon --index=3 --width=48 --height=48 --bit-depth=32 --palette-size=0 

$ icotool -l not_a_favicon.svg 
favicon.svg: not an icon or cursor file (reserved non-zero) 

不幸的是它的返回碼始終爲0,迫使你真正把它的輸出。

它可以在Ubuntu上安裝有:

sudo apt-get install icoutils 
相關問題