八月面試題-2018-9-6

楊季布發表於2018-09-06

1、電商網站A和電影票網站B合作,A的使用者,可以通過A網站下單購買電影票,之後跳轉跳轉到B(不需要登入)去選座位。 如果A、B是同域名,比如,比如a.domain.com,b.d,om,b.domain.com能不能共能不能共享cookie?如果不同域如何處理?

答:同域下 單點登陸的問題;不同域下,跨域請求的問題
不同域名cookie不能共享。A和B相同一級域名 .domain.com 就可以共享cookie。 A網站登入成功後生成token,帶著訪問B網站進行。 如果是淘寶和天貓的關係,就會有專門處理所有資源許可權的服務 OAuth

2、請說說什麼是XSS?如何攻擊?如何防禦?

答:XSS 跨網站指令碼(英語:Cross-site scripting,通常簡稱為:XSS)是一種網站應用程式的安全漏洞攻擊,是程式碼注入的一種。它允許惡意使用者將程式碼注入到網頁上,其他使用者在觀看網頁時 就會受到影響。這類攻擊通常包含了 HTML 以及使用者端指令碼語言。 XSS 分為三種:反射型,儲存型和 DOM-based 如何攻擊 XSS 通過修改 HTML 節點或者執行 JS 程式碼來攻擊網站。 例如通過 URL 獲取某些引數 上述 URL 輸入可能會將 HTML 改為

,這樣頁面中就憑空多了一段可執行指令碼。這種攻擊型別是反射型攻擊,也可以說是 DOM-based 攻擊。 也有另一種場景,比如寫了一篇包含攻擊程式碼 的文章,那麼可能瀏覽文章的使用者都會被攻擊到。這種攻擊型別是儲存型攻擊,也可以說是 DOM-based 攻擊,並且這 種攻擊打擊面更廣。 以上示例使用了 js-xss 來實現。可以看到在輸出中保留了 h1 標籤且過濾了 script 標籤 如何防禦 最普遍的做法是轉義輸入輸出的內容,對於引號,尖括號,斜槓進行轉義 通過轉義可以將攻擊程式碼 變成 對於顯示富文字來說,不能通過上面的辦法來轉義所有字元,因為這樣會把需要的格式也過濾掉。這種情況通常採用白名單過濾的辦法,當然也可以通過黑名單過濾,但是考慮到需要過濾的標籤 和標籤屬性實在太多,更加推薦使用白名單的方式。 內容安全策略 (CSP) 是一個額外的安全層,用於檢測並削弱某些特定型別的攻擊,包括跨站指令碼 (XSS) 和資料注入攻擊等。無論是資料盜取、網站內容汙染還是散發惡意軟體,這些攻擊都是主 要的手段。 我們可以通過 CSP 來儘量減少 XSS 攻擊。CSP 本質上也是建立白名單,規定了瀏覽器只能夠執行特定來源的程式碼。 通常可以通過 HTTP Header 中的 Content-Security-Policy 來開啟 CSP content-security-policy.com/ eggjs.org/zh-cn/core/… 只允許載入本站資源 只允許載入 HTTPS 協議圖片 允許載入任何來源框架 www.owasp.org/index.php/X… 上面這種就必要隱蔽,不好排查 也可以寫個while迴圈一直往cookie中塞東西,把cookie塞爆,使用者就再也打不開你的網站了。 http-only 可以防一部分xss,用js讀不到cookie。 樣式也可以寫js的進行xss攻擊 body { background-image: url('javascript:alert("XSS");') }

3、CSRF攻擊是什麼?如何防範?

答: CSRF 跨站請求偽造(英語:Cross-site request forgery),也被稱為 one-click attack或者 session riding,通常縮寫為 CSRF 或者 XSRF, 是一種挾制使用者在當前已登入的Web應用程式上執行非本意的操作的攻擊方法。[1] 跟跨網站指令碼(XSS)相比,XSS 利用的是使用者對指定網站的信任,CSRF 利用的是網站對使用者網頁瀏覽器的信任。 簡單點說,CSRF 就是利用使用者的登入態發起惡意請求。

4、如果發現在某個使用者的電腦上,網站的靜態資源打不開了,如何確定是CDN的問題還是那個使用者機器、瀏覽器的問題?

5、請說說在hybrid端實現類似原生般流暢的體驗,要注意哪些事項。

6、請說說瀏覽器事件機制中事件觸發三個階段?

答:事件觸發三階段 事件觸發有三個階段 document 往事件觸發處傳播,遇到註冊的捕獲事件會觸發 傳播到事件觸發處時觸發註冊的事件 從事件觸發處往 document 傳播,遇到註冊的冒泡事件會觸發 事件觸發一般來說會按照上面的順序進行,但是也有特例,如果給一個目標節點同時註冊冒泡和捕獲事件,事件觸發會按照註冊的順序執行。

// 以下會先列印冒泡然後是捕獲 node.addEventListener('click',(event) =>{ console.log('冒泡') },false); node.addEventListener('click',(event) =>{ console.log('捕獲 ') },true)

註冊事件 通常我們使用 addEventListener 註冊事件,該函式的第三個引數可以是布林值,也可以是物件。對於布林值 useCapture 引數來說,該引數預設值為 false 。useCapture 決定了註冊的事件是捕獲事件還是冒泡事件。對於物件引數來說,可以使用以下幾個屬性 capture,布林值,和 useCapture 作用一樣 once,布林值,值為 true 表示該回撥只會呼叫一次,呼叫後會移除監聽 passive,布林值,表示永遠不會呼叫 preventDefault 一般來說,我們只希望事件只觸發在目標上,這時候可以使用 stopPropagation 來阻止事件的進一步傳播。通常我們認為 stopPropagation 是用來阻止事件冒泡的,其實該函式也可以阻止捕獲事件。stopImmediatePropagation 同樣也能實現阻止事件,但是還能阻止該事件目標執行別的註冊事件。

node.addEventListener('click',(event) =>{ event.stopImmediatePropagation() console.log('冒泡') },false); // 點選 node 只會執行上面的函式,該函式不會執行 node.addEventListener('click',(event) => { console.log('捕獲 ') },true) 事件代理 如果一個節點中的子節點是動態生成的,那麼子節點需要註冊事件的話應該註冊在父節點上

  • 1
  • 2
  • 3
  • 4
  • 5
z

事件代理的方式相對於直接給目標註冊事件來說,有以下優點 節省記憶體 不需要給子節點登出事件

相關文章