作者forkome (初心者)
看板Ajax
標題[問題] AJAX跨網域POST呼叫
時間Wed May 22 11:13:24 2013
各位前輩好
近日在評估ajax安全性問題
若整個頁面的新增、修改、刪除都用ajax來做
考量到程式碼外漏,可能會被人CSRF
故測了一下跨網域呼叫,之前爬文是說瀏覽器會擋不同網域
但測試結果Crome / Firefox 會擋
IE 8則出現「這網頁正在存取非其控制下的資訊....要繼續?」
按下「是」則呼叫成功
故認為瀏覽器並非一定可以擋XSS
若小弟在使用ajax時,想保護程式被解讀,是否有什麼方法呢?
還是說insert/delete本身就不適合使用ajax ??
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 60.249.154.130
1F:→ musie:最簡單的就是檢查referer..防君子不防小人 05/22 13:01
2F:→ musie:ajax要做到保密就要做one time token.. 05/22 13:02
4F:推 mrbigmouth:獲取權限時 給瀏覽端一個亂數token 每個新增修改刪除 05/22 13:40
5F:→ mrbigmouth:動作都得附上該token 伺服器在驗證該token與ip與瀏覽器 05/22 13:40
6F:→ mrbigmouth:皆正確符合之後才真的動作 05/22 13:41
7F:→ mrbigmouth:還有所有token一定都要有時效性 05/22 13:41
8F:→ nenpow:只有我看不懂原PO的問題嗎...CSRF,XSS, Cross Domain Ajax 05/22 14:39
9F:→ nenpow:程式混碼應該不能混在一起討論吧.. 05/22 14:40
10F:→ nenpow:不確定觀念是否完全正確,但要防XSS或CSRF首要應該是印網頁 05/22 14:49
11F:→ nenpow:時purify所有使用者自己上傳的data, 另外Server可定期更換 05/22 14:51
12F:→ nenpow:JSESSIONID或其他類似cookie降低token被偷時的損失 05/22 14:52
13F:推 nenpow:和ajax或是使不使用ajax應該沒有關係.. 05/22 14:59
14F:→ nenpow:而檢查token,referer或ip,都比較像是給偽造來源者麻煩 05/22 15:02
15F:推 mrbigmouth:我想原po擔心的是別的網站被利用來CSRF/XSS 讓有權限 05/22 17:37
16F:→ mrbigmouth:的使用者亂刪改他做的網站 05/22 17:37
17F:→ mrbigmouth:方法就是每次執行動作時都需要附token 使用者逛到其他 05/22 17:39
18F:→ mrbigmouth:網站時 即使能被XSS送需求到你的網站 但沒有token還 05/22 17:39
19F:→ mrbigmouth:是會失敗 05/22 17:39
20F:推 Seraphy:AJAX送HTML FORM的話可以藏TOKEN在FORM裡 05/23 00:34
21F:→ Seraphy:送JSON的話就放在HTTP HEADER裡 如果我理解問題正確的話.. 05/23 00:37
22F:→ TonyQ:AJAX 跟會被 CSRF 不是同一回事,可能但不總是 05/23 14:05
23F:→ TonyQ:你要不要直接舉情境比較好討論。 05/23 14:06
24F:→ TonyQ:說白了,你以為用 ajax 會被 CSRF 的,寫成 form 就不會嗎? 05/23 14:06
25F:→ forkome:T大,會只針對ajax討論,是因為小弟用的是.net 05/24 09:26
26F:→ forkome:.net本身機制有加token保護 05/24 09:27
27F:→ forkome:我擔心的確實如M大所說的 05/24 09:27
28F:→ forkome:就是javascript被解讀,被偽造的資料來Insert或delete 05/24 09:30
29F:→ forkome:舉例來說,加入會員的功能,若以ajax來做新增資料的動作 05/24 09:37
30F:→ forkome:而原先設計的頁面寫了一堆javascript驗證 05/24 09:38
31F:→ forkome:但程式碼被看懂後,別人直接寫個新網頁來丟參數到我的後台 05/24 09:39
32F:→ forkome:所以才想說使用ajax前,先請益大家如何防守 05/24 09:40
33F:→ forkome:小弟再去研究一下token的作法,感謝大家 05/24 09:43
34F:推 Seraphy:TRY HtmlHelper.AntiForgeryToken 05/24 13:47
35F:→ tyf99:要雙向驗證啊,不然還是會被 man in the middle 攻擊.. 05/24 14:49
36F:→ nenpow:任何需要驗證的資料在後端一定都需要驗證一次,前端驗證 05/24 14:52
37F:→ nenpow:說到底只是讓使用者及時能知道自己填錯資料罷了 05/24 14:53
38F:→ nenpow:鐵則就是絕不能相信使用者送來的任何資料 05/24 14:54
39F:→ nenpow:各種加token的方法都只是輔助,後端塞入DB前一定要驗證 05/24 14:55
40F:推 nenpow:原PO可以打開firbug或chrome的開發工具看看Browser是 05/24 14:58
41F:→ nenpow:怎麼跟後端間互動的(其實就是http request和response) 05/24 14:59
42F:→ nenpow:要偽造真的一定都做得到 05/24 14:59
43F:推 lovdkkkk:我記得 cookie 本身有綁 domain, ajax 跨 domain 也有很 05/29 08:34
44F:→ lovdkkkk:多限制, 許多安全性問題可能瀏覽器都幫你擋掉了, 可以先 05/29 08:35
45F:→ lovdkkkk:查一下 spec 或做一些實測並用 sniffer 檢查看看 05/29 08:36
46F:→ lovdkkkk:例如像 chrome 在發 ajax 時收到 302 回應要求跳頁時就是 05/29 08:38
47F:→ lovdkkkk:直接擋掉, 不幫你發跳頁的 request, 這本身也是 w3c spec 05/29 08:39
48F:→ lovdkkkk:至於驗證邏輯一定要以 server 為主, 前端只是貼心提示用 05/29 08:41
49F:推 jinmin88:你可以GOOGLE看看jsonp 05/29 15:44
50F:推 lovdkkkk:jsonp 基本上是在堆疊的上方用其它方式達到相同效果, 基 05/30 11:25
51F:→ lovdkkkk:本上算是 workaround...部份也需要 server 配合 05/30 11:26
52F:→ lovdkkkk:server 端沒做配合的話不必擔心別人用 jsonp 就會怎樣的 05/30 11:34
53F:→ lovdkkkk: * 就可以把你 server 怎樣 05/30 11:35
54F:→ forkome:了解,感謝前輩們指導 06/09 20:29