2016-04-18 25 views
2

用websharper玩一下,試圖讓我的系統上運行的webgl演示。我修改了給定的演示代碼,以便可以在SinglePage應用程序中使用它。另外,我將演示使用的紋理更改爲我實際在系統中使用的紋理。websharper webgl演示安全問題?

let MakeAndBindTexture (gl : WebGL.RenderingContext) f = 
    Img [] 
    |>! Events.OnLoad (fun img ev -> 
     let tex = gl.CreateTexture() 
     gl.ActiveTexture(gl.TEXTURE0) 
     gl.BindTexture(gl.TEXTURE_2D, tex) 
     gl.PixelStorei(gl.UNPACK_FLIP_Y_WEBGL, 1) 
     gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img.Dom) 
     gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) 
     gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) 
     f()) 
    |> fun img -> img -< [Attr.Src "mandel.jpg"] // <<-- located in project root 
    |> ignore 

測試它與谷歌Chrome,(不涉及網絡服務器 - 運行從項目的根文件夾中的index.html,我收到以下錯誤日誌:

SinglePageApplication1.min.js:42 Uncaught SecurityError: Failed to execute 'texImage2D' on 'WebGLRenderingContext': The cross-origin image at file:///E:/R/playground/ConsoleApplication7/SinglePageApplication1/mandel.jpg may not be loaded.

微軟邊緣,另一方面成功運行併產生預期的結果。

現在,我當然不知道,作爲其餘相同的路徑.jpg格式如何可能會導致谷歌瀏覽器的安全性錯誤。

另外,我想知道我是否有機會使它在谷歌瀏覽器中運行,不知何故...

我也嘗試mandel.jpg的其他位置,例如... min.js文件旁邊。但所有地點都產生相同的錯誤。

回答

2

Chrome在本地網頁in order to protect you from attacks where you may open a malicious webpage locally, for example because someone sent it to you as an email attachment上強制執行非常嚴格的同源策略。

換句話說,假設文件SinglePageApplication1.min.js已由不可信來源發送給您。是否允許加載(並可能偵察/修改)文件mandel.jpg?也許你只是碰巧把.js文件放在你的Documents文件夾中,而mandel.jpg是一個私人文件,你也一直保存在那裏。所以Chrome說不,不能訪問。

對於開發目的,你有兩個選擇,詳細的here

  1. 通過與--allow-file-access-from-files標誌

  2. 上的本地Web服務器安裝您的SPA開始關閉Chrome的安全措施(倜儻或IIS),並通過它訪問http://localhost/

+0

有道理 - 答案但在我眼裏,這是一個非常ra ndom做出的決定。因此,無服務器的HTML是好的,直到它加載...嗯...不...腳本加載工程...和... CSS文件加載工作...但沒有辦法加載圖像?我認爲他們應該克服它,並拒絕從本地文件系統加載任何東西。 – BitTickler

+0

問題是*誰正在做加載。 Chrome相信*自己的渲染引擎*可以加載和顯示文件,而不會做任何惡意的事情,但是它不知道一些隨機腳本真的在做什麼。所以''標籤來源不同的文件將顯示得很好,但腳本既不能直接加載圖像,也不能訪問該標籤(它有不同的來源)的內容。 – piaste

+0

他說什麼,但**不要使用該標誌!有一個原因是存在的*「你不需要爲安裝像Suave或IIS這樣的服務器而付出巨大的痛苦,如果你在linux或OSX上,只需用你的文件cd到文件夾並鍵入'python -m SimpleHTTPServer'。在任何操作系統上,另一個選項是[devd](https://github.com/cortesi/devd)。超級簡單。一個小文件,它只是起作用。 – gman