HTML面試題整理

HTML5 新特性、語義化

新特性
  • 新的 DOCTYPE 聲明<!DOCTYPE html>

  • 新增 vedio 和 audio 標簽

  • 繪畫 canvas

  • 語意化更好內(nèi)容元素

    article、footer赊时、header、nav沐序、section

  • 表單控件

    calendar、date堕绩、time策幼、email、url

  • 新的技術(shù)

    webworker奴紧、websocket特姐、Geolocation

  • 本地離線存儲 localStorage 長期存儲數(shù)據(jù),瀏覽器關(guān)閉后數(shù)據(jù)不丟失

  • sessionStorage 的數(shù)據(jù)在瀏覽器關(guān)閉后自動刪除

語義化
  • 用正確的標簽做正確的事

  • 計算機能快速讀懂內(nèi)容黍氮,高效處理信息唐含,對搜索引擎更友好

  • 頁面結(jié)構(gòu)清晰

  • 有利于 SEO

  • 方便其他設(shè)備解析

  • 便于團隊開發(fā)和維護浅浮,語義化更具有可讀性

區(qū)分 HTML 和 HTML5
  • 聲明不同,HTML5<!DOCTYPE html>捷枯,HTML 很長一段
  • 結(jié)構(gòu)語義不同滚秩,HTML5 有很多新的標簽,而 HTML 沒有體現(xiàn)結(jié)構(gòu)語義的標簽淮捆,用<div id="header"></div>來表示網(wǎng)站頭部
DOCTYPE 作用

<!Doctype>聲明位于文檔中的最前面郁油,處于<html>標簽之前。告知瀏覽器的解析器攀痊,用什么文檔類型規(guī)范來解析這個文檔桐腌。

HTML5 離線緩存原理
  • 用戶沒有網(wǎng)絡(luò)時可正常訪問站點或應(yīng)用,當用戶有網(wǎng)絡(luò)時苟径,更新用戶機器上的緩存文件

  • 原理:離線緩存技術(shù)基于.appcache文件案站,通過此文件的解析清單離線存儲資源,這些資源像 cookie 一樣被存儲下來棘街,之后再網(wǎng)絡(luò)離線狀態(tài)下蟆盐,瀏覽器會通過被離線存儲的數(shù)據(jù)進行頁面展示

  • 使用:頁面頭部添加 manifest 屬性,在 cache.mainfest 文件的編寫離線存儲的資源

    CACHE MANIFEST
    #v0.11
    CACHE:
    js/app.js
    css/style.css
    NETWORK:
    resourse/logo.png
    FALLBACK:
    / /offline.html
    
處理 HTML5 離線儲存資源
  • 在線時遭殉,瀏覽器發(fā)現(xiàn) html 頭部有 manifest 屬性時會請求 manifest 文件舱禽,如果是第一次訪問就會根據(jù) manifest 文件內(nèi)容下載相應(yīng)的資源進行離線存儲,如果已經(jīng)訪問過恩沽,瀏覽器使用緩存的資源加載頁面,同時會對比新的 mainfest 文件和舊的 mainfest 是否有改變翔始,決定是否重新下載
  • 離線時罗心,瀏覽器直接使用離線緩存資源

cookie,sessionStorage 和 localStorage 的區(qū)別

  • 區(qū)別
    cookie 是網(wǎng)站為了標示用戶身份存在用戶本地終端上的數(shù)據(jù)(經(jīng)過加密)
    cookie 數(shù)據(jù)始終在同源的 htto 請求中攜帶(即使不需要)城瞎,即會在瀏覽器和服務(wù)器之間傳遞
    sessionStorage 和 localStorage 不會自動把數(shù)據(jù)發(fā)給服務(wù)器渤闷,僅在本地保存

  • 存儲大小
    cookie 大小不能超過 4k
    sessionStorage 和 localStorage 也有大小要求,5m

  • 過期時間
    localStorage: 永久儲存脖镀,手動刪除
    sessionStorage:窗口關(guān)閉自動刪除
    cookie:設(shè)置的 cookie 過期時間之前一直存在瀏覽器內(nèi)核

  • IE: trident 內(nèi)核

  • Firefox:gecko 內(nèi)核

  • Safari:webkit 內(nèi)核

  • Opera:以前是 presto 內(nèi)核飒箭,Opera 現(xiàn)已改用 Google Chrome 的 Blink 內(nèi)核

  • Chrome:Blink(基于 webkit,Google 與 Opera Software 共同開發(fā))

理解
  • 主要分成兩部分:渲染引擎(layout engineerRendering Engine)和JS引擎
  • 渲染引擎:負責取得網(wǎng)頁的內(nèi)容(HTML蜒灰、XML弦蹂、圖像等等)、整理訊息(例如加入CSS等)强窖,以及計算網(wǎng)頁的顯示方式凸椿,然后會輸出至顯示器或打印機。瀏覽器的內(nèi)核的不同對于網(wǎng)頁的語法解釋會有不同翅溺,所以渲染的效果也不相同脑漫。所有網(wǎng)頁瀏覽器髓抑、電子郵件客戶端以及其它需要編輯、顯示網(wǎng)絡(luò)內(nèi)容的應(yīng)用程序都需要內(nèi)核
  • JS引擎則:解析和執(zhí)行javascript來實現(xiàn)網(wǎng)頁的動態(tài)效果
  • 最開始渲染引擎和JS引擎并沒有區(qū)分的很明確优幸,后來 JS 引擎越來越獨立吨拍,內(nèi)核就傾向于只指渲染引擎

Canvas 和 SVG 區(qū)別

  • svg 繪制除的圖形元素都是獨立的 DOM 節(jié)點,能方便的綁定事件和用來修改网杆;canvas 輸出是一整幅畫布
  • svg 輸出的圖形的矢量圖形羹饰,放大縮小不受影響,canvas 輸出的是標量畫布跛璧,像一張圖片一樣放大縮小會失真或者鋸齒
  • svg 使用 xml 文檔來描述繪圖严里,canvas 是 HTML5 提供的繪圖 API,通過 getContent 方法獲取畫筆才可繪圖

使用 date-的好處

  • 自定義屬性可以統(tǒng)一化
  • 維護方便追城,頁面結(jié)構(gòu)清晰

meta 標簽

  • charset 聲明文檔字符編碼
  • description刹碾、keywords、author 等頁面描述
  • viewport 為移動設(shè)備添加 viewport
  • cache-control座柱、expires 設(shè)置頁面緩存狀態(tài)

attribute 和 property 的區(qū)別是什么迷帜?

  • attribute 是 dom 元素在文檔中作為 html 標簽擁有的屬性
  • property 是 dom 元素在 js 中作為對象擁有的屬性
  • 對于 html 標準屬性來說,attribute 和 property 是同步的色洞,會自動更新
  • 對于自定義屬性來說是不同步的

頁面顯示 HTML 過程

過程:構(gòu)建 dom 樹-->構(gòu)建 render 樹-->布局 render 樹-->繪制 render 樹

  • 瀏覽器加載 html 文件戏锹,自上而下,構(gòu)建 DOM 樹
  • 遇到請求外部資源(css火诸、圖片等)時锦针,不影響 DOM 樹的加載,請求時異步的
  • 解析 CSS 文件構(gòu)建渲染樹置蜀,等渲染樹構(gòu)建完成奈搜,瀏覽器開始布局渲染樹并繪制到屏幕上(css 放在最上面,瀏覽器預先加載 css 后盯荤,可以不必等待 HTML 加載完畢就可以渲染頁面了)馋吗,此時會涉及:reflow 回流和 repain 重繪
    • reflow 回流:DOM 節(jié)點中元素都是以盒模型的形式存在,需要瀏覽器去計算其位置和大小秋秤,此過程稱為回流
    • repain 重繪:當盒模型的位置宏粤、大小及其他屬性(字體、顏色等)確定后灼卢,瀏覽器便開始繪制內(nèi)容绍哎,此過程稱為重繪
  • 頁面首次訪問必然會經(jīng)歷 reflow 和 repain,這兩個過程非常消耗性能鞋真,尤其在移動設(shè)備上蛇摸,所以應(yīng)盡量減少 reflow 和 repain
  • 當文檔掛載過程遇到 js 文件,html 文檔會掛起渲染的線程灿巧,等待 js 文件加載完畢并解析執(zhí)行完成赶袄,才可以恢復 html 文檔的渲染線程(JS 可能會修改 DOM揽涮,意味著,在 js 執(zhí)行完成前饿肺,后續(xù)所有資源加載可能時沒有必要的蒋困,這是 js 阻塞后續(xù)資源下載的根本原因,所以 js 會放在文檔末尾)
  • JS 的解析有瀏覽器的 js 引擎完成敬辣,例如 v8 引擎

說一下強制緩存和協(xié)商緩存

緩存指在本地磁盤中對訪問過的資源保存的副本文件

  • 請求過程:瀏覽器在第一次請求后緩存資源雪标,再次請求時,會進行下面兩個步驟
    瀏覽器會獲取該緩存資源的 header 中的信息溉跃,根據(jù) response header 中的 expires 和 cache-control 來判斷是否命中強緩存村刨,如果命中則直接從緩存中獲取資源。

    如果沒有命中強緩存撰茎,瀏覽器就會發(fā)送請求到服務(wù)器嵌牺,這次請求會帶上 IF-Modified-Since 或者 IF-None-Match, 它們的值分別是第一次請求返回 Last-Modified 或者 Etag,由服務(wù)器來對比這一對字段來判斷是否命中龄糊。如果命中逆粹,則服務(wù)器返回 304 狀態(tài)碼,并且不會返回資源內(nèi)容炫惩,瀏覽器會直接從緩存獲绕У;否則服務(wù)器最終會返回資源的實際內(nèi)容他嚷,并更新 header 中的相關(guān)緩存字段蹋绽。

  • 強緩存:不會像服務(wù)器發(fā)送請求,直接從緩存中讀取資源筋蓖,狀態(tài)為 200
    Expires:過期時間卸耘,GMT(格林尼標準時間,世界標準時間扭勉,0 時區(qū),北京處于東 8 區(qū)苛聘,所以北京時間=GMT 時間+8 小時)格式時間點字符串(Expires:Mon,18 Oct 2066 23:59:59 GMT)代表資源失效時間涂炎,瀏覽器再次請求加載資源時,如果在這個過期時間內(nèi)设哗,則命中強緩存
    Cache-Control:以 max-age 值來判斷唱捣,相對時間(Cache-Control:max-age=3600)代表資源有效期為 3600s,返回頭中 Date 標識消息發(fā)送時間网梢,表示當前資源在 Date - Date + 3600s 時間段內(nèi)都有效
    no-cache 不使用本地緩存震缭,使用協(xié)商緩存
    no-store 直接禁止瀏覽器緩存數(shù)據(jù),每次加載資源都會想服務(wù)器要完整的資源战虏,類似于 network 中的 disabled cache
    public 可以被所有用戶緩存拣宰,包括終端用戶和 cdn 等中間件代理服務(wù)器
    private 只能被終端用戶瀏覽器緩存
    如果 cache-control 與 expires 同時存在的話党涕,cache-control 的優(yōu)先級高于 expires。

  • 協(xié)商緩存:由服務(wù)器決定緩存資源是否可用巡社。第一次請求時會帶著 Last-Modified 或 Etag膛堤,后續(xù)請求則會帶著對應(yīng)的請求字段 If-Modified-Since 或者 If-None-Match,若響應(yīng)頭沒有 Last-Modified 或 Etag 字段時晌该,則響應(yīng)頭也不會有對應(yīng)的字段
    Last-Modified/If-Modified-Since:標記文件最后修改時間肥荔,下一次請求時,請求頭會帶上 If-Modified-Since 值就是 Last-Modified 告訴服務(wù)器本地緩存的文件最后修改時間朝群,判斷資源是否有變化燕耿,無變化時直接返回 304,瀏覽器直接使用本地緩存姜胖;有變化時正常返回請求資源內(nèi)容誉帅,新的 Last-Modified 會在 response header 中返回,并在下次請求時更新本地緩存的 Last-Modified
    Etag/If-None-Match:服務(wù)器為每個資源生成一個 hash 值谭期,資源有變化值就會改變堵第,并將 ETag 字段返回給瀏覽器,服務(wù)器接收到 If-None-Match 后隧出,比較兩者是否一致來判定文件內(nèi)容是否改變踏志。每次都會返回 ETag

  • 共同點
    都是從客戶端緩存中讀取資源,區(qū)別是強緩存不發(fā)請求胀瞪,協(xié)商緩存發(fā)請求

  • 區(qū)別
    強緩存不需要向服務(wù)器發(fā)請求针余,協(xié)商緩存有服務(wù)器決定是否使用緩存,存在依次通信
    強緩存狀態(tài)碼是 200(from cache)凄诞,而協(xié)商緩存如果命中緩存的話圆雁,狀態(tài)碼是 304(not modified)
    from cache 分為 from memory cache 和 from disk cache,從內(nèi)存中獲取最快伪朽,但是是 session 級別的緩存,關(guān)閉瀏覽器之后就沒有了西土。

  • 優(yōu)先級
    Cache-Control > expires > Etag > Last-Modified

  • 最后總結(jié)一下瀏覽器的三級緩存原理:
    先去內(nèi)存看,如果有欣除,直接加載
    如果內(nèi)存沒有杠娱,擇取硬盤獲取室叉,如果有直接加載
    如果硬盤也沒有踪旷,那么就進行網(wǎng)絡(luò)請求
    加載到的資源緩存到硬盤和內(nèi)存
    Ctrl + F5 強制刷新的時候气破,會暫時禁用強緩存和協(xié)商緩存努咐。

  • 配置

    // 1.服務(wù)端配置
    res.setHeader('max-age': '3600 public')
    res.setHeader(etag: '5c20abbd-e2e8')
    res.setHeader('last-modified': Mon, 24 Dec 2018 09:49:49 GMT)
    // 2. nginx配置
    add_header Cache-Control "max-age=3600"
    

什么是預加載和懶加載

  • 預加載:提交加載資源殴胧,當用戶需要時可直接從本地緩存中渲染
  • 懶加載:主要目的是作為服務(wù)器前端的優(yōu)化,減少請求次數(shù)或延遲請求
  • 行為相反,一個是提前加載团滥,一個是遲緩甚至不加載
  • 懶加載對服務(wù)器有一定的緩解壓力作用竿屹,而預加載會增加服務(wù)器前端壓力
  • 圖片的加載是由 src 的值引起的,當對 src 賦值時瀏覽器回請求國片資源,基于這個【逆ⅲ可以利用 html5 的特性 data-xxx 保存圖片的路經(jīng),當我們需要加載圖片的時候才將 data-xxx 的值賦予 src拱燃,就能實現(xiàn)圖片的按需加載。也就是懶加載

常見 web 安全及防護原理

  • sql 注入原理:將 sql 插入到 web 表單提交或輸入域名或頁面請求的查詢字符串力惯,最終達到欺騙服務(wù)器進行惡意的 SQL 命令

  • xss 原理及規(guī)范:跨站腳本(cross-site scripting)攻擊指攻擊者往 web 頁面插入惡意 html 標簽或 javascript 代碼碗誉,使用戶訪問都會執(zhí)行相應(yīng)的嵌入代碼,從而獲取用戶資料等父晶。比如:攻擊者在論壇中放一個看似安全的鏈接哮缺,騙取用戶點擊后,竊取cookie中的用戶私密信息甲喝;或者攻擊者在論壇中加一個惡意表單尝苇,當用戶提交表單的時候,卻把信息傳送到攻擊者的服務(wù)器中埠胖,而不是用戶原本以為的信任站點

    防御措施:

    1. 輸入過濾:只要有輸入的地方糠溜,就存在 xss 攻擊 1.攻擊者提交惡意代碼(前后臺都需要做過濾檢查或轉(zhuǎn)碼),2.瀏覽器執(zhí)行惡意代碼
    2. 利用 CSP 內(nèi)容安全策略:建立白名單直撤,告訴瀏覽器哪些外部資源可以加載和執(zhí)行非竿,只需要配置規(guī)則,如何攔截是瀏覽器自己實現(xiàn)的
    • 設(shè)置 heep header 中的 Content-Security-Policy: default-src 'self' img-src child-src
    • 設(shè)置 meta 標簽 http-equiv="content-Securoty-Policy"
    1. cookie 的 HttpOnly 禁止 js 讀取 Cookie 信息
    2. 通過驗證碼方法驗證用戶提交

    如果還有的話谊惭,像限制用戶輸入長度汽馋,因為 js 腳本一般都是比較長的

  • csrf 原理:跨站請求偽造(cross-site request forgery),挾制用戶在當前已登錄的 web 應(yīng)用程序上執(zhí)行非本意的操作的攻擊方法圈盔。就是說冒充用戶發(fā)起請求豹芯,完成一些違背用戶意愿的請求,與 xss 不同的是驱敲,xss 是攻擊者直接對我們的網(wǎng)站 A 進行注入攻擊铁蹈,而 CSRF 是通過網(wǎng)站 B 對網(wǎng)站 A 進行滾偽造請求;例如众眨,在購物網(wǎng)站 A 點擊一個惡意鏈接 B握牧,B 請求網(wǎng)站 A 下的下單接口,結(jié)果在 A 網(wǎng)站就真的會生成一個訂單娩梨;原理是:網(wǎng)站 B 通過表單沿腰、get 請求來偽造網(wǎng)站 A 的請求,這時候請求會帶上網(wǎng)站 A 的 cookie狈定,若登陸信息保存在 cooklie 中颂龙,就實現(xiàn)了偽造攻擊

    • 驗證 csrf token习蓬,目前相對成熟的方案

      服務(wù)端隨機生成 token,保存在服務(wù)端 session 中措嵌,同時保存到客戶端中躲叼,客戶端發(fā)送請求時,把 token 帶到 HTTP 請求頭或參數(shù)中企巢,服務(wù)端接收到請求枫慷,驗證請求中的 token 與 session 中的是否一致。
      token 可以在登錄時寫入到 cookies 中浪规,發(fā)送請求時或听,js 讀取 cookies 中的 token,并設(shè)置到 HTTP 請求頭中笋婿。

    • 針對偽造請求的域名不是網(wǎng)站 A神帅,限制 cookie 中的 sameSite 屬性為 strict,只有同源網(wǎng)站的請求才會帶上 cookie

    • 更換登錄態(tài)方案

      由于 CSRF 本質(zhì)是偽造請求攜帶了保存在 cookie 中的信息萌抵,所以對 session 機制的登錄態(tài)比較不利找御,可以使用 JWT(JSON WEB TOken)方案,其 token 信息一般設(shè)置到 HTTP 請求頭中绍填,所以可以預防 CSRF 攻擊

  • XSS是獲取信息霎桅,不需要提前知道其他用戶頁面的代碼和數(shù)據(jù)包。CSRF是代替用戶完成指定的動作讨永,需要知道其他用戶頁面的代碼和數(shù)據(jù)包

  • TOKEN 可能被竊取滔驶,可以通過 XSS 攻擊這種方式去竊取,可以結(jié)合一些其他的手段卿闹,預防 xss 攻擊

  • referer 字段

  • vue 中的 xss 防御
    vue 框架已經(jīng)進行了一些 xss 防御揭糕,對于一些外來的內(nèi)容(例如接口或 url 參數(shù)),盡量用{{}}表達式顯示({{{}}}表示不經(jīng)轉(zhuǎn)義直接輸出)锻霎,因為{{}}中的內(nèi)容進行了字符串化著角,瀏覽器不會對其中的內(nèi)容進行執(zhí)行操作;盡量避免 v-html 指令旋恼,或者先對內(nèi)容進行 xss 過濾

cookie 面試題

由于 HTTP 是無狀態(tài)協(xié)議吏口,無狀態(tài)指的是服務(wù)端對于客戶端每次發(fā)送的請求都會認為是新的一個請求,上一次會話和下一次會話沒有聯(lián)系冰更。但是很多場景需要直到上次會話和下一次會話的關(guān)系(比如登陸之后記住登陸狀態(tài))产徊,這時就引入和 cookie 和 session 體系。

  • cookie
    客戶端請求服務(wù)器時蜀细,如果服務(wù)器需要記錄該用戶狀態(tài)舟铜,就通過 response Headers 像客戶端瀏覽器頒發(fā)一個 cookie,而客戶端瀏覽器會把 cookie 保存起來奠衔,當瀏覽器在請求服務(wù)器時谆刨,瀏覽器把請求的網(wǎng)址連同該 cookie 一同提交給服務(wù)器奕谭,服務(wù)器通過檢查該 cookie 來獲取用戶狀態(tài)
  • session
    當服務(wù)器接收請求時,就從存儲在服務(wù)器上的無數(shù) session 信息中去查找客戶端請求時帶過來的 cookie 的狀態(tài)痴荐,如果服務(wù)器中沒有這條 session 信息則添加一條 session 信息
    通常 cookie 中存的是 session 信息經(jīng)過計算后的唯一 id sessionid
cookie 時如何工作的
  • request

    當瀏覽器發(fā)送一個請求時,瀏覽器回自動檢查是否有相應(yīng)的 cookie官册,如果有則將 cookie 添加到 Request Headers 的 Cookie 字段中(cookie 字段是很多 name=value 以分號分隔的字符串)

  • response

    當服務(wù)端需要種 cookie 時生兆,在 http 請求的 Response Headers 中添加 Set-Cookie 字段,瀏覽器接收之后會自動解析識別膝宁,將 cookie 保存起來

    Set-Cookle:_ _hsid_t=3eac583831cb5952_t;Path=/;Domain=360.com; Max-Age=86400
    

##### cookie 和 session 的區(qū)別

- 存儲位置不同

  cookie 存儲在客戶瀏覽器上鸦难,而 session 數(shù)據(jù)保存在服務(wù)器上

- 存儲大小不同

  一般單個 cookie 保存的數(shù)據(jù)不能超過 4 個,單個域名最多保存 20 個 cookie员淫;session 則無大小和限制

##### cookie 屬性

- Name:cookie 名
- Value:cookie 值
- Domain:cookie 的域名合蔽。如果設(shè)置.example.com,那么子域名 a.example.com 和 b.example.com介返,都可以使用.example.com 的 cookie拴事,反之則不行
- Path:允許讀取 cookie 的 url 路徑,一般設(shè)置為/
- Expires:cookie 過期時間圣蝎。不設(shè)置刃宵,則為 session 會話期,頁面退出時 cookie 失效
- HttpOnly:設(shè)置為 true 時徘公,只有 http 能讀取牲证,js 只能讀取未設(shè)置 HttpOnly 的 cookie
- Secure:標記為 Secure 的 cookie,只有 https 的請求可以攜帶
- SameSite:限制第三方 url 是否可以攜帶 cookie
  - Strict:僅允許同站點請求的 cookie
  - Lax:允許部分第三方請求攜帶 cookie关面,即導航到目標網(wǎng)址的 get 請求坦袍,包括超鏈接,預加載和 get 表單三種形式發(fā)送 cookie
  - None:任意發(fā)送 cookie等太,需要設(shè)置 Secure捂齐,網(wǎng)站必須采用 https
- Priority:優(yōu)先級

##### 操作 cookie,js 和服務(wù)端

當設(shè)置了 HttpOnly 為 true 時缩抡,只有 http 請求讀取辛燥,不能被 js 讀取,具體表現(xiàn)為 document.cookie 讀取到的值不包含設(shè)置的 HttpOnly

js 操作 cookie 使用 document.cookie

- 讀取
  document.cookie 讀取到字符串缝其,包含 cookie 的 name 和 value挎塌,需要解析
- 寫入
  ```js
  document.cookie =
    'uid=123;expires=Mon Jan 04 2022 17:42:40 GMT;path=/;secure;'
  document.cookie =
    'uid=123;expires=Mon Jan 04 2022 17:42:40 GMT;path=/caikuai;domain=edu.#;secure;samesite=lax'

一次只能寫入一個 cookie

  • 刪除

    只需要將一個已經(jīng)存在的 cookie 名字過期時間設(shè)置為過去時間即可

    document.cookie = 'uid=123;expires=' + new Date(0) + ';path=/;secure;'
    
  • 修改
    重新賦值,要保證 path 和 domain 兩個值不變内边,否則會添加新的 cookie

    document.cookie =
      'uid=123;expires=Mon Jan 04 2082 17:42:40 GMT;path=/;secure;'
    
服務(wù)器端如何讀寫 cookie
  • 寫 cookie

    res.setHeader('Set-Cookie', ['uid=123;maxAge: 900000; httpOnly: true'])
    // 或者
    res.cookie('uid', '123', { maxAge: 900000, httpOnly: true })
    
  • 讀取 cookie

    console.log(req.getHeader('Cookie')) // 拿到所有cookie
    // 或者
    console.log(req.cookie.name)
    
查看瀏覽器是否打開 Cookie 功能
window.navigator.cookieEnabled // true
cookie 的共享策略是什么

domain 和 path 共同決定 cookie 可以被哪些 url 訪問
訪問一個 url 時榴都,如果 url 的 host 和 domain 一致或者時 domain 的子域名,并且 url 的路徑和 path 部分匹配漠其,那么 cookie 才可以被獲取

cookie 的編碼
document.cookie =
  'uid=123;expires=Mon Jan 04 2022 17:42:40 GMT;path=/caikuai;domain=edu.#;secure;samesite=lax'

cookie 一般包含等號嘴高、冒號竿音、分號、空格拴驮、逗號春瞬、斜杠等特殊字符,需要對其進行編碼套啤,使用 encodeURIComponent/decodeURIComponent 操作

不使用 escape 和 encodeURI 的原因是宽气,encodeURIComponent 可以將更多字符進行編碼,比如‘/’

cookie 應(yīng)對 xss 漏洞

xss 漏洞原理是:由于未對用戶提交的表單數(shù)據(jù)或者 url 參數(shù)等數(shù)據(jù)做處理就顯示在頁面上潜沦,導致用戶提交的內(nèi)容在頁面上被作為 html 解析執(zhí)行

常規(guī)方案:對特殊字符進行滾處理萄涯,如對“<”或“>“進行轉(zhuǎn)義

cookie 設(shè)置:對用用戶利用 script 腳本采集 cookie 信息,可以將重要的 cookie 信息設(shè)置為 HttpOnly 來避免 cookie 被 js 采集

cookie 應(yīng)對 csrf 攻擊

跨站請求偽造原理:用戶登陸 A 網(wǎng)站唆鸡,然后因為某些原理訪問 B 網(wǎng)站(比如跳轉(zhuǎn))涝影,B 網(wǎng)站直接發(fā)送一個 A 網(wǎng)站的請求進行一些危險操作,由于 A 網(wǎng)站處理登陸狀態(tài)争占,就發(fā)生了 CSRF 攻擊燃逻,核心是利用了 cookie 信息可以被跨站攜帶

常規(guī)方案:采用驗證碼或 token 等

cookie 設(shè)置:由于 CSRF 攻擊核心是利用 cookie 信息可以被跨站攜帶,可以對核心 cookie 的 SameSite 設(shè)置為 Strict 或 Lax 來避免

不同瀏覽器共享 cookie 嗎

不共享臂痕,是對立的 cookie

web 端 cookie 的設(shè)置和獲取

//寫cookie
function setCookie(name, value) {
  var Days = 30
  var exp = new Date()
  exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000)
  document.cookie = name + '=' + escape(value) + ';expires=' + exp.toGMTString()
}
//讀取cookie
function getCookie(name) {
  var arr,
    reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)')
  if ((arr = document.cookie.match(reg))) {
    return unescape(arr[2])
  } else {
    return null
  }
}
//刪除cookie
function delCookie(name) {
  var exp = new Date()
  exp.setTime(exp.getTime() - 1)
  var cval = getCookie(name)
  if (cval != null) {
    document.cookie = name + '=' + cval + ';expires=' + exp.toGMTString()
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末唆樊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子刻蟹,更是在濱河造成了極大的恐慌逗旁,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舆瘪,死亡現(xiàn)場離奇詭異片效,居然都是意外死亡,警方通過查閱死者的電腦和手機英古,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門淀衣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人召调,你說我怎么就攤上這事膨桥。” “怎么了唠叛?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵只嚣,是天一觀的道長。 經(jīng)常有香客問我艺沼,道長册舞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任障般,我火速辦了婚禮调鲸,結(jié)果婚禮上盛杰,老公的妹妹穿的比我還像新娘。我一直安慰自己藐石,他們只是感情好即供,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著于微,像睡著了一般逗嫡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上角雷,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音性穿,去河邊找鬼勺三。 笑死,一個胖子當著我的面吹牛需曾,可吹牛的內(nèi)容都是我干的吗坚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼呆万,長吁一口氣:“原來是場噩夢啊……” “哼商源!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谋减,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤牡彻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后出爹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體庄吼,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年严就,在試婚紗的時候發(fā)現(xiàn)自己被綠了总寻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡梢为,死狀恐怖渐行,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情铸董,我是刑警寧澤祟印,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站粟害,受9級特大地震影響旁理,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜我磁,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一孽文、第九天 我趴在偏房一處隱蔽的房頂上張望驻襟。 院中可真熱鬧,春花似錦芋哭、人聲如沸沉衣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豌习。三九已至,卻和暖如春拔疚,著一層夾襖步出監(jiān)牢的瞬間肥隆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工稚失, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留栋艳,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓句各,卻偏偏與公主長得像吸占,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子凿宾,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容

  • doctype(?檔類型) 告知瀏覽器的解析器?什么?檔標準解析這個?檔<!DOCTYPE HTML>矾屯,不同的渲染...
    Territory_Cheng閱讀 3,009評論 0 1
  • 在線閱讀 http://blog.poetries.top/FE-Interview-Questions 目錄 $...
    Aniugel閱讀 885評論 0 1
  • 在線閱讀 http://interview.poetries.top[http://interview.poetr...
    程序員poetry閱讀 114,401評論 24 450
  • 目錄 $HTML, HTTP初厚,web綜合問題 1件蚕、前端需要注意哪些SEO 3、HTTP的幾種請求方法用途 4产禾、從瀏...
    hudaren閱讀 643評論 0 0
  • 一骤坐、理論基礎(chǔ)知識部分 1.1、講講輸入完網(wǎng)址按下回車下愈,到看到網(wǎng)頁這個過程中發(fā)生了什么 a. 域名解析 b. 發(fā)起T...
    我家媳婦蠢蠢噠閱讀 3,128評論 2 106