http://msdn.microsoft.com/en-us/library/cc645032(VS.95).aspx
一切都是臨時的,beta2相對於beta1改了很多,不知道正式發布時是否還會改變。
翻譯的作用是備忘。
Silverlight 2 beta 支援2種訪問遠程伺服器的方式:
System.Net命名空間中的WebClient和HTTP類。這些類使用HTTP或者HTTPS訪問。
System.Net.Sockets命名空間中的Socket類。這些類提供更低層次的socket介面,可以用在更普通的網路通訊應用中。
這兩種情況都需要提供安全機制以防止silverlight程式發起未經允許的串連。潛在風險包括:
DOS攻擊:大量的遠程PC用來攻擊一個特定的網站
DNS改寫攻擊:把受害網站的DNS該寫為silverlight來源站點點,從而讓silverlight訪問非來源站點點
反向串連攻擊:讓使用者的silverlight訪問某個遠程節點,從而攻擊者可以通過此串連訪問使用者的私人網路(這個攻擊的模式是,使用者訪問了一個惡意silverlight網站,下載了silverlight並運行,該silverlight建立一個到私人網路的串連,例如內部file server,從而實現偷竊內部file server資料的功能)
Silverlight設計出了防止以上的攻擊之外,還立足於提供管理員更好的控制。
原有的設計是僅允許silverlight訪問來源站點點。beta1的這個安全模型僅僅允許silverlight通過socket訪問下載的那個網站。這個來源站點點可以是localhost,如果這個silverlight直接從檔案中開啟的話。
beta包含了跨域串連的支援從而允許訪問非來源站點點。這個重要特性允許silverlight程式使用已有的web service。Silverlight 2 Runtime在允許一個網路連接之前,需要首先從該網站下載一個安全性原則檔案。這個安全性原則檔案僅影響WebClient和HTTP類的跨網域網路訪問。WebClient和HTTP類在訪問源的時候,無須安全性原則檔案。
對於socket,這個安全性原則系統不僅影響跨域訪問,也影響源訪問。即便是源訪問,也需要安全性原則。這和beta1不一樣。beta1中源訪問總是被允許的。
安全性原則系統基礎
Silverlight 存在2種安全性原則檔案:
Flash policy file - Adobe Flash所使用的crossdomain.xml檔案。這個策略檔案僅僅用於WebClient和HTTP類。
Silverlight policy file - 可以用來在Web/Socket兩種。該檔案和Flash策略檔案有不同的格式。
在允許到某個網路資源的串連之前,Silverlight2 Runtime會試圖從該網路資源下載一個安全性原則檔案。不同的訪問方式有不同的下載方式。
如果串連是WEB跨域,Silverlight2 運行時使用HTTP協議下載安全性原則檔案。Silverlight2 運行時首先試圖從目標域的根下載Silverlight策略檔案clientaccesspolicy.xml,如果能獲得這個檔案(即便解析該檔案出現錯誤),它也用該檔案做跨域策略檔案。如果找不到該檔案,Silverlight運行時試圖從目標域的根下載flash策略檔案crossdomain.xml。這個flash策略檔案必須允許串連所有域。
如果是socket串連(跨域或者源訪問),Silverlight2運行時試圖串連目標網站的943連接埠(固定連接埠)。如果可以建立,Silverlight運行時發送一個特殊的字串<policy-file-request>到伺服器以獲得策略檔案。Silverlight2運行時會等待目標網站返回Silverlight策略檔案。如果返回了(即便解析出錯),也會用作策略檔案。
如果策略檔案正確解析,並且保證了許可權,串連會建立。否則,串連以及以後的串連均被阻止。
另一個socket串連的限制是伺服器連接埠必須在4502-4534之內。如果伺服器提供伺服器的連接埠不在其內,可以用程式重新導向(例如ssh)
為WebClient/HTTP部署安全性原則檔案,系統管理員需要配置web service,以便可以下載策略檔案。
為socket部署安全性原則檔案,系統管理員需要配置一個單獨的認證服務。
如下是一個開放socket 4502~4506連接埠的策略檔案。必須listen在943連接埠。(這個問題很令人鬱悶,這個綁定衝突怎麼解決?)
<?xml version="1.0" encoding ="utf-8"?><access-policy> <cross-domain-access> <policy> <allow-from> <domain uri="*" /> </allow-from> <grant-to> <socket-resource port="4502-4506" protocol="tcp" /> </grant-to> </policy> </cross-domain-access></access-policy>
如果發現943被bind,kill掉該process,啟動自己的server,同時策略檔案允許所有。