Re: [問題] 一些javascript問題想請教

看板Ajax作者 (沉默是金。)時間14年前 (2011/07/27 02:16), 編輯推噓6(6012)
留言18則, 6人參與, 最新討論串3/3 (看更多)
※ [本文轉錄自 Web_Design 看板 #1EBlbxSa ] 作者: TonyQ (沉默是金。) 看板: Web_Design 標題: Re: [問題] 一些javascript問題想請教 時間: Wed Jul 27 01:29:29 2011 ※ 引述《Derix (PalaPala)》之銘言: : 在下為js新手,想請問各位前輩些許問題... : 1.是否可能使用js開啟新頁面後,接著自動在該新頁面執行指定的js函式? : 如:在A頁面的網址執行javascript:window.open('B.html');後,接著自動在B頁面執 : 行其他script如alert('HI');呢(並非在B頁面寫入alert函式)? 沒有經過使用者自己有任何行為, 或者該目標頁面有任何行為幫助的話,基本上是不可能的。 舉幾個該目標頁面沒有良好設計的隱憂: 像是新頁面有倚賴網址參數去作一些行為, 因此從網址被注入攻擊,比方說 iframe src 是用 param 帶入的這種笨行為, 或者新頁面內容根本就有已經放好得內鬼。 : 2.在A頁面執行,從B網域得到的xmlhttprequest.responsetext的script內容,因為same : origin policy的關係,不能直接eval使用,那是否有其他方法可以間接執行該script : 呢? 1.這裡有幾件事情要講清楚 a.ajax 在 cross domain 時, 被 request 的目標頁面的確會收到,也會處理給你回應。 b.但是這個回應browser會擋掉把他當空氣,所以不只是不能直接eval使用, 應該是連 xmlhttprequest.responsetext 你都會拿不到。 c.目前要解決跨domain 處理的方式, getJSONP 是唯一解,他不是走 ajax 而是走 script tag, 而且使用上很有局限性。(限定用get) : 3.承問題2,如果有的話,是否就代表該same origin policy事實上是不夠完備的? 請注意你談論的這兩件事情是A網站網站開發者設計的, 而且 B 網站如果A網站不信任他的話,根本不應該試著引入B網站的script。 same origin policy 事實上是一種防止 B 網站被A網站任意存取的機制, 而 JSONP 的實做方案,則是B網站提供其願意被存取的部份給A網站存取, 要討論完備這件事情,要先討論目的及其意義。 不然一個網站可以引入外界的 script tag , 這樣某個角度上一樣是 violate same origin policy 。 : 4.在HTML裡,嵌入<script src = "" rel="nofollow">http://xxx.xx/A.js">的動作可以跨網域取得A.js的 : script執行,那為何還需要same origin policy來防止XSS的攻擊呢? : 感謝指點迷津的各位大大們,如果小的觀念錯誤的話,還希望不吝給小的指導! : 謝謝Orz 1.這樣限定 javascript 的格式,而大幅的限制你獲取資料的方式 不代表任意html頁面資料都可以透過ajax去要求跟存取。 這方面其實要多參考 user script ,你就會知道兩者有多大的差別, 巧婦難為無米之炊,一般而言我們要存取外部網站,那些資料是重點。 如果你要對一篇文章作增刪的動作,你沒有先從頁面中拿到其連結或id, 你根本無從下手起,所以有這個限制是差很多的。 2.這樣就把事情限定在"get" 的層級裡, 一是可以擋掉get所不支援的大量資料存取, 另一方面是只要website 有確實把 get 跟post分清楚,就不會有問題。 XSS 目前的熱門危險區域還是在於使用者可以寫入 script 位置, 比方說使用者自由編輯區塊或者iframe url是由user 提供的。 但憑良心講 XSS 防堵上非常困難,目前最有效的 sub domain 方案, 實做起來非常累,而且又阻絕了內容本身跟外面的連結方式,會造成很多限制。 這也是為什麼目前各大 blog 平台,大致上都是採用 script 白名單的方式, 或者直接不允許使用者自行寫入 script tag 的作法。 -- I am a person, and I am always thinking . Thinking in love , Thinking in life , Thinking in why , Thinking in worth. I can't believe any of what , I am just thinking then thinking , but worst of all , most of mine is thinking not actioning... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 198.203.175.175 ※ 編輯: TonyQ 來自: 198.203.175.175 (07/27 01:30) ※ 編輯: TonyQ 來自: 198.203.175.175 (07/27 01:31) ※ 編輯: TonyQ 來自: 198.203.175.175 (07/27 01:32)

07/27 02:09,
oh..我回了一樣的問題,只是你人比較好XD
07/27 02:09
-- 我:一半的日子讓你說,我聽你說你的所有______________________________________ ______________________________________一半的日子我想說,對你說過去的所有:我 _______________________________________________________ 在討論中妥善扮演兼具聆聽與分享的角色,是我們一生的課題。 _______________________________________________________ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 198.203.175.175

07/27 02:40, , 1F
感謝東尼大熱心轉來回覆,容小的再消化消化一下QQ
07/27 02:40, 1F

07/27 09:42, , 2F
原來跨站只有jsonp能辦到而已阿O.O
07/27 09:42, 2F

07/28 10:02, , 3F
好文推
07/28 10:02, 3F

07/28 10:29, , 4F
推一下
07/28 10:29, 4F

07/29 00:20, , 5F
server side proxy法我是覺得那有點作弊 而且跟真正的跨站有
07/29 00:20, 5F

07/29 00:21, , 6F
一點區別,所以我沒有提近來,在某些狀況下server side作一
07/29 00:21, 6F

07/29 00:21, , 7F
個 proxy 頁面(由server去跟遠方要html/json)再給ajax撈
07/29 00:21, 7F

07/29 00:21, , 8F
也是一種可行的作法。
07/29 00:21, 8F

07/29 00:21, , 9F
只是這樣就沒辦法利用使用者的session狀態 會複雜很多
07/29 00:21, 9F
※ 編輯: TonyQ 來自: 198.203.175.175 (07/29 00:23)

07/29 02:35, , 10F
好文推
07/29 02:35, 10F

07/29 02:39, , 11F
對 跨網域的問題 如果不用jsonp 通常就是用proxy
07/29 02:39, 11F

07/29 02:40, , 12F
而且這是很常見的方式 可以看看yahoo這篇 講的挺清楚
07/29 02:40, 12F

07/29 02:44, , 14F
Tony大有提到 request實際上是會處理的 是browser的問題
07/29 02:44, 14F

07/29 02:48, , 15F
除了proxy 外可以看一下他的 others solutions
07/29 02:48, 15F

07/29 02:50, , 16F
裡面也有大家提到的jsonp和<script> 方式
07/29 02:50, 16F

07/29 02:56, , 17F
事實上大家常用的api如google 都會提供跨網域的web service
07/29 02:56, 17F

07/29 02:57, , 18F
你的request 裡加上output=json跟callback 就會當js處理
07/29 02:57, 18F
文章代碼(AID): #1EBmID81 (Ajax)
討論串 (同標題文章)
文章代碼(AID): #1EBmID81 (Ajax)