以下為讀AJAX 網頁程式設計--Google成功背後的技術一書的筆記

AJAX的安全性問題

●網路服務與安全問題
在伺服器端對伺服器資料庫的攻擊:SQL Injection
在用戶端對使用者的攻擊:XSS

●AJAX的限制
1.不能存取用戶端的任何檔案。
ajax.open('GET', 'file://c:\\\\hello.html', ture); //錯誤
2..不能存取不同來源位置的檔案。
避免對第三者的伺服器造成影響所設的限制。
瀏覽器會禁止AJAX嘗試存取一個不同於該來源位置的URL,例如http://www.abc.com/scripts/script1.js中的AJAX程式碼只能存取網域為abc.com的URL,無法存取其他的URL如http://www.def.com/index.html。
範例:
http://www.abc.com/script1.js
http://www.abc.com/script2.js
視為同來源(網域皆為abc.com)
http://www.abc.com/scripts/script1.js
http://www.abc.com/html/index.html
視為同來源(網域皆為abc.com)
http://www.abc.com/script1.js
http://www.def.com/script2.js
視為不同來源(網域不同)
http://www.abc.com/script1.js
http://www.abc.com:8080/script2.js
視為不同來源(port不同)
http://www.abc.com/script1.js
https://www.abc.com/script2.js
視為不同來源(協定不同)
http://www.abc.com/script1.js
http://192.168.1.1/script2.js
視為不同來源(即使192.168.1.1為www.abc.com的IP網址,也視為不同來源)
http://www.abc.com/script1.js
http://srv1.def.com/script2.js
視為不同來源(主機名稱不同)
http://www.abc.com/script1.js
http://www.abc-clone.com/script2.js
視為不同來源(即使www.abc-clone.com同樣指向www.abc.com,也視為不同來源)

AJAX程式若存取不同於來源位置的URL時,通常瀏覽器會給予警告,在IE上會出現JavaScript錯誤的圖示,點選後顯示「沒有使用權限」。在Firefox上,不會有任何的錯誤指示,若打開JavaScript Console,會顯示Permission denied to call method XMLHttpRequest.open。

●如何突破AJAX的安全限制
1.網頁代理
2.徵詢使用者同意

●網頁代理
採用類似網頁代理伺服器(Proxy Server)的作法。

●徵詢使用者同意
Internet Explorer
微軟的Internet Explorer是以「區域」的觀念來區分不同的網站,套用不同的安全設定。
通常在測試AJAX實作時,會在自己的機器上架WWW伺服器,例如http://localhost/index.html,IE會將這樣的網址視為「近端內部網路」,在「近端內部網路」的安全性設定中,存取第三者網站是合法且不會有任何提示的,就就是當我們把相同的程式碼搬到真正的伺服器上時,就會發現執行出來的行為會有所不同。
如何讓AJAX能夠去存取第三者的網站,需要「要求」使用者修改他的安全設定
1.點選「工具/網際網路/安全性」
2.點選「網際網路/自訂層級」,找到「存取各網域的資料來源」將停用改為「提示」。

Mozilla/Firefox
Mozilla的安全機制是透過PrivilegeManager來管理,透過PrivilegeManager的enablePrivilege()函式來開啟這項設定。
下面範例在open()之前呼叫enablePrivilege()開啟UniversalBrowserRead權限。
ajax=createAJAX();
ajax.onreadystatechange=onRcvData;
if(netscape && 
 netscape.security.PrivilegeManager.enablePrivilege){
 netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');
}
ajax.open('GET', 'http://www.google.com', true);
ajax.send('');
上面程式碼在測試時可能無效,則需修改程式碼更改安全設定的屬性。
1.在Firefox瀏覽器網址列上輸入about:config
2.找到signed.applets.codebase_principal_support,將設定值改為true

●存取需要帳號密碼的網頁
以Apache伺服器為例,所有要存取secure目錄的使用者都需經過帳號及密碼的認証
1.選好一組帳號及密碼
2.在secure目錄下建一個.htaccess檔案,內容如下
AuthUserFile /home/user1/public_html/secure/.htpasswd
AuthName "帳號認證,請蛉入帳號密碼"
AuthType Basic
<Limit GET>
require valid-user
</Limit>
這個檔案會保護整個secure目錄下的所有檔案,包括所有子目錄及子目錄下所有檔案。
3.設定帳號及密碼
htpasswd -c .htpasswd test
輸入密碼(abc123)

利用XMLHttpRequest來存取經過伺服器保護的檔案
open('GET', 'secure/index.html', true, 'test', 'abc123');

參考資料:AJAX 網頁程式設計--Google成功背後的技術

jck11 發表在 痞客邦 PIXNET 留言(0) 人氣()