一、安全類
1、csrf:跨站請求僞造;
原理:
(1) 使用者C打開浏覽器,通路受信任網站A,輸入使用者名和密碼請求登入網站A;
(2)在使用者資訊通過驗證後,網站A産生Cookie資訊并傳回給浏覽器,此時使用者登入網站A成功,可以正常發送請求到網站A; (3)使用者未退出網站A之前,在同一浏覽器中,打開一個TAB頁通路網站B;
(4)網站B接收到使用者請求後,傳回一些攻擊性代碼,并發出一個請求要求通路第三方站點A;
(5)浏覽器在接收到這些攻擊性代碼後,根據網站B的請求,在使用者不知情的情況下攜帶Cookie資訊,向網站A送出請求。網站A并不知道該請求其實是由B發起的,是以會根據使用者C的Cookie資訊以C的權限處理該請求,導緻來自網站B的惡意代碼被執行。
防禦:
(1)驗證 HTTP Referer 字段,判斷頁面來源
(2)在請求位址中添加 token 并驗證;
(3)在 HTTP 頭中自定義屬性并驗證
2、xss:跨站腳本攻擊;
原理:向頁面注入腳本,(如:評論區)
防禦:
(1)對使用者輸入的資料進行HTML Entity編碼
(2)對資料過濾
二、渲染機制
1、DOCTYPE作用:用來聲明文檔類型和DTD規範,用途:檔案的合法性驗證
HTML4.0有一個嚴格模式(不包括展示性的和棄用的元素)和一個傳統模式(包括)
2、浏覽器如何渲染:
(1)解析HTML形成DOM Tree
(2)解析css産生css規則樹(css rule tree)
(3)根據DOM Tree和css規則樹來構造rendering Tree
(4)下一步操作稱之為Layout,用來計算每個節點在螢幕中的位置
(5)繪制,即周遊render樹,使用UI後端層繪制每個節點
Reflow:重排,當某個部分發生了變化影響了布局,就需要倒回去重新渲染
原因:
(1)增加、較少DOM節點
(2)修改css樣式的時候
(3)修改網頁的預設字型時
避免:
(1)HTML元素使用fixed或absolute,不會引起reflow
(2)使用預先定義好的css的class,修改DOM的className
Repaint:重繪,隻改變某個元素的背景顔色,不影響元素周圍或内部布局屬性,将隻會引起浏覽器的repaint,重畫某一部分
原因:
(1)操作DOM節點
(2)修改css樣式
減少repaint:
(1)建立一個節點,将最終的結果放進去,一次性插入
三、js運作機制
<script type="text/javascript"> // 最終輸出1、3、2
console.log(1);
setTimeout(function() {
console.log(2);
}, 0);
console.log(3);
</script>
1、js是單線程的:同一時間隻能做一件事
2、任務隊列:同步任務和異步任務,
3、機制:從上往下執行,先執行同步任務,遇到異步任務先挂起,執行完同步任務在回去執行異步任務
4、異步任務:DOM事件、setTimeout、setInterval、es6中的promise
for (var i = 0; i < 4; i++) { // 輸出4個4
setTimeout(function () {
console.log(i);
}, 1000); // 過1s後,才會放入異步隊列中,
}
将var改為let便會輸出0/1/2/3,作用域不同了
四、頁面性能
2、減少http請求
(1)HTML的map圖
<img usemap='#map1' src='./music.png'>
<map name="map1">
<area shape="rect" coords="0, 0, 45, 180" href="javascript:alert(1);" target="_blank" rel="external nofollow" alt="">
<area shape="rect" coords="45, 0, 90, 180" href="javascript:alert(2);" target="_blank" rel="external nofollow" alt="">
<area shape="rect" coords="90, 0, 135, 180" href="javascript:alert(3);" target="_blank" rel="external nofollow" alt="">
<area shape="rect" coords="135, 0, 180, 180" href="javascript:alert(4);" target="_blank" rel="external nofollow" alt="">
</map>
(2)css精靈
<a href="javascript: alert(1);" target="_blank" rel="external nofollow" >
<span class="span1"></span>
</a>
<a href="javascript: alert(2);" target="_blank" rel="external nofollow" >
<span class="span2"></span>
</a>
<a href="javascript: alert(3);" target="_blank" rel="external nofollow" >
<span class="span3"></span>
</a>
<a href="javascript: alert(4);" target="_blank" rel="external nofollow" >
<span class="span4"></span>
</a>
span {
display: inline-block;
width: 45px;
height: 45px;
background: url('./music.png');
}
.span1 {
background-position: 0 0;
}
.span2 {
background-position: -45px 0;
}
.span3 {
background-position: -90px 0;
}
.span4 {
background-position: -135px 0;
}
(3)合并css或js檔案
(4)使用base64位圖檔
3、緩存
(1)強緩存:直接從緩存中取
(2)304協商緩存:問一下伺服器緩存中的能不能用
(3)http請求頭:
Cache-Control: no-store // 禁止浏覽器緩存
Cache-Control: no-cache // 不允許直接緩存,即協商緩存
Cache-Control: max-age // 秒,緩存的有效時間
pragma: no-cache // 禁止浏覽器緩存
expires: 時間 // 格林威治時間,在之前有效
優先級:pragma>Cache-Control>expires
(4)響應頭
Last-Modified // 通知資源最後修改的時間
ETag // 文章内容修改
緩存先expires->Last-Modified->ETag 都沒過期,返304響應
4、異步加載
<script src="./xxx.js" charset="utf-8" async></script>
<script src="./xxx.js" charset="utf-8" defer>
defer
:用于開啟新的線程下載下傳腳本檔案,并使腳本在文檔解析完成後執行。
async
:HTML5新增屬性,用于異步下載下傳腳本檔案,下載下傳完畢立即解釋執行代碼。
5、預解析DNS
<meta http-quiv="x-dns-prefetch-control" content="on"> // 強制打開預解析DNS,http是預設開啟的,https是預設關閉的
<link rel="dns-prefetch" href="//local_name.com" target="_blank" rel="external nofollow" > // 将裡面的位址預解析
五、錯誤監控
1、錯誤分類:
(1)即時運作錯誤
捕獲:
1)try...catch
2)window.onerror
(2)資源加載錯誤(沒有冒泡)
1)object.onerror
2)performance.getEntries()
performance.getEntries().forEach((item) => { console.log(item.name) } ) // 擷取所有已經加載的資源
3)Error事件捕獲
<head>
<meta charset="utf-8">
<title>錯誤監控</title>
<script type="text/javascript">
window.addEventListener('error', function (e) {
console.log('捕獲', e);
}, true); // 一定要加true
</script>
</head>
<body>
<script src="//badu.com/test.js" charset="utf-8"></script>
</body>
2、跨域錯誤能捕獲嗎?可以
(1)用戶端:在script标簽中加crossorigin屬性
<script crossorigin src="http://www.lmj.com/demo/crossoriginAttribute/error.js"></script>
(2)服務端:在響應頭Access-Control-Allow-Origin:域名或*
3、上報錯誤的基本原理
(1)采用Ajax通信的方式上報
(2)利用Image對象上報
(new Image()).src = 'http://baidu.com/tesjk?r=tksjk'; // 後面為上報的的位址