從“爲什麼不能直接打開PDF文件”說到“腳本***”

先從一個簡單的問題說起。

前兩天在網上,有網友問我這樣一個問題:“上載到SharePoint 2010文檔庫中的一個PDF文件,當直接點擊此文件鏈接時,爲什麼瀏覽器彈出的對話框只有保存,而沒有打開?”

image

就像上面的截圖所顯示的,在瀏覽器彈出的對話框上,只能讓用戶保存(Save)的選項,而沒有一個打開(Open)的選項。但可能有人會記得,以前SharePoint 2007的時候,並不是這樣的。用戶直接點擊一個存放在SharePoint 2007文檔庫裏面的PDF文件時,瀏覽器會提示用戶,可以直接打開它,然後本地安裝的PDF Reader就會直接打開這個PDF文件,開始閱讀。

先說解決這個問題的方法。打開SharePoint 2010管理中心,管理Web應用程序,選擇一個Web應用程序,點擊Ribbon區域的“常規設置”,然後在彈出的設置對話框中,將“瀏覽器文件處理程序”這個設置項從默認的“嚴格”,修改爲“許可”。

image

搞定!你會發現修改了這個設置之後,瀏覽器會重新顯示出“打開”選項,讓用戶可以直接打開PDF文件。

好了,如果你只是想解決這個問題,可以不用繼續往下閱讀了。

嗯,想知道爲什麼?好吧,這就是原因。重新將Web應用程序常規設置中的“瀏覽器文件處理程序”設置項改回默認的“嚴格”。打開文檔庫,這次在點擊PDF文件鏈接之前,打開瀏覽器的Developer Tools(在IE瀏覽器中是通過F12打開它,下面將使用IE瀏覽器做例子,FireFox和Chrome也有各自的類似工具可以使用)。在“Network”選項卡中點擊“Start capturing”按鈕,它會捕獲當前瀏覽器窗口與服務器之間的所有網絡通信。然後,點擊那個PDF文件鏈接。

image

在“Network”選項卡里面,找到用戶點擊PDF鏈接時所產生的網絡請求,雙擊它,就可以看到這次請求的所有詳細的Request和Response信息。點擊“Response headers”選項卡,就可以看到從SharePoint 2010服務器所返回的HTTP頭信息。嗯,如下圖所示,你會看到一個有趣的頭信息,“X-Download-Options = noopen”。

image

就是這個HTTP頭信息,告訴瀏覽器:“不要直接打開這個文件,不要給用戶顯示出打開選項!”

當我們在SharePoint 2010管理中心裏面,將Web應用程序的“瀏覽器文件處理程序”設置項從默認的“嚴格”修改爲“許可”時,SharePoint 2010服務器就會停止在HTTP頭裏面添加這個頭信息,於是,瀏覽器又會允許用戶直接打開文件了。

SharePoint 2010默認會禁止瀏覽器直接打開所有存放在文檔庫中的任何文件,方法就是向返回給瀏覽器的HTTP頭信息中添加那個額外的metadata。爲什麼當用戶點擊Office文檔的時候,仍然會自動打開本地的Office程序,打開Office文檔呢?這其實是因爲頁面上的腳本會調用OpenDocuments這個ActiveX控件,由它來啓動客戶端的Office程序,打開Office文檔。

SharePoint 2010爲什麼這麼做?原因就是爲了更好的安全性。由於SharePoint通常會允許非網站管理員上載文件到文檔庫裏面,所以讓瀏覽器隨便打開這些用戶上載的文件,實際上是一件非常危險的事情。在最嚴重的情況下,這會給惡意用戶提供實施腳本***的漏洞,甚至引發跨站點腳本***。比如,一個僅僅具備Contributor(參與討論)角色的用戶,可能會上載一個擴展名是.docx,但實際上確實一個含有惡意腳本的.html文件,到文檔庫中。當管理員嘗試打開這個“Word文檔”時,瀏覽器可能會嘗試直接打開它,並無意中運行那個文件中所包含的腳本。

當然,除了禁止用戶直接在瀏覽器中打開文檔庫中的文件之外,SharePoint 2010還在網站的安全性上做了其他一些增強。比如,Contributor現在不能直接上載一個頁面文件到Pages(頁面)庫中,而只能通過Pages庫內置的“創建頁面”功能,來新建頁面。又比如,通過在web.config的<SaveControl>節點中添加“SafeAgainstScript”和“RequiresDesignerPermission”屬性,系統管理員可以禁止Contributor修改Web部件的屬性。當然,這些又是另外一個話題了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章