一千萬個為什麽

搜索

使用文件擴展名和MIME類型(由文件-i -b輸出)組合來確定不安全的文件?

我們允許用戶上傳一些文件,我們要麽將這些文件發送到scribd(doc,xls,ppts等),要麽自己顯示為視頻(flv,mov,mp4等在流程播放器中)。 為了避免用戶上傳不安全的文件,我們檢查一組已知的“安全”文件擴展名,然後檢查文件-i -b命令的輸出,該命令為我們提供了MIME類型。 Usage: file [OPTION]... [FILE]... Determine file type of FILEs. ... -i, --mime output mime type strings

這是否足以保護我們的服務器上的“不安全腳本”,或者人們使用不同的東西?

最佳答案

Warning. The steps you describe are not enough to be safe, if those files are available from your servers. Explanation. Because browsers do content-sniffing in a variety of circumstances to guess at the appropriate MIME type, there are a variety of subtle cross-site scripting attacks that remain possible. The general category is sometimes known as content-sniffing XSS. 請參閱以下研究論文:

Adam Barth, Juan Caballero, and Dawn Song. Secure Content Sniffing for Web Browsers, or How to Stop Papers from Reviewing Themselves. IEEE Security & Privacy 2009.

以下博客文章和消息也討論了這種威脅:

Andreas Gohr,Chris Smith。 MSIE促進跨站點腳本。 2007年2月。

Jessica Hope,rotwang。 SMF上傳XSS漏洞。 2006年12月。

Robert McMillan。 可以竊取您的Facebook帳戶的照片。 2008年7月。

Defenses. I recommend that you adopt the following defenses and mitigations:

將內容托管在單獨的域上,該域僅用於托管用戶上傳的內容。這將沙箱化,因此內容嗅探XSS攻擊只能攻擊其他用戶的內容,並且無法攻擊您的站點。 (例如,維基百科和Facebook使用這種辯護。)

確保在為用戶上傳的內容提供服務的每個響應中設置正確的 Content-Type:標頭。保存內容類型以確保它是安全內容類型白名單中的幾個選項之一。避免發送無效的MIME類型(例如, / , unknown/unknown , application/unknown ),並避免缺少< code> Content-Type: header;這些都受到瀏覽器內容類型的嗅探,因此具有很高的攻擊風險。避免導致IE7進行內容類型嗅探的MIME類型(參見表4中Barth等人的文章列表)。

在提供用戶提供的內容時,永遠不要使用可以觸發活動代碼執行的不安全MIME類型。例如,避免以下所有內容: text/html , application/x-shockwave-flash ,因為它們可以包含特權代碼。不幸的是,我認為從您的網站提供用戶提供的Flash內容並不安全。

在提供用戶提供的內容時,請包含 X-Content-Type-Options:nosniff 標頭以及 Content-Type:標頭,以禁用內容類型嗅探某些版本的IE。

對於您不希望在瀏覽器中顯示的內容,請將其標記為以便瀏覽器將其作為文件下載處理:例如,添加 Content-Disposition:attachment 報頭中。

(如果這聽起來很煩人,你肯定是對的。責怪Apache人員包括破壞網絡標準的糟糕的默認配置多年,並且忽略了對此做點什麽的請求。不幸的是,現在為時已晚:我們陷入困境使用大量部署的瀏覽器來執行危險的操作。)

轉載註明原文: 使用文件擴展名和MIME類型(由文件-i -b輸出)組合來確定不安全的文件?