安全性主要分爲兩大塊。 私密性:不被非法獲取和利用。 可靠性:不丟失、不損壞、不被篡改javascript
XSS ( Cross Site Scripting ) 是指惡意攻擊者利用網站沒有對用戶提交數據進行轉義處理或者過濾不足的缺點,進而添加一些代碼,嵌入到web頁面中去。使別的用戶訪問都會執行相應的嵌入代碼。html
從而盜取用戶資料、利用用戶身份進行某種動做或者對訪問者進行病毒侵害的一種攻擊方式。前端
經過url參數直接注入。java
發出請求時,XSS代碼出如今URL中,做爲輸入提交到服務器端,服務端解析後返回,XSS代碼隨響應內容一塊兒傳回給瀏覽器,最後瀏覽器執行XSS代碼。這個過程像一次反射,故叫作反射型XSS。git
舉個例子github
一個連接,裏面的query字段中包含一個script標籤,這個標籤的src就是惡意代碼,用戶點擊了這個連接後會先向服務器發送請求,服務器返回時也攜帶了這個XSS代碼,而後瀏覽器將查詢的結果寫入Html,這時惡意代碼就被執行了。web
並非在url中沒有包含script標籤的網址都是安全的,可使用短網址來讓網址變得很短。sql
存儲型XSS會被保存到數據庫,在其餘用戶訪問(前端)到這條數據時,這個代碼會在訪問用戶的瀏覽器端執行。數據庫
舉個例子npm
好比攻擊者在一篇文章的評論中寫入了script標籤,這個評論被保存數據庫,當其餘用戶看到這篇文章時就會執行這個腳本。
<img src="${image}"/>
<img src="1" onerror="alert(1)" />複製代碼
var data = "#{data}";
var data = "hello"; alert(1);"";複製代碼
對於 XSS 攻擊來講,一般有兩種方式能夠用來防護。
普通的輸入 - 編碼
富文本 - 過濾(黑名單、白名單)
較正
< 轉義爲 <
轉義爲 >
" 轉義爲 " ' 轉義爲 &9039; 空格轉義爲 但這可能形成多個連續的空格,也能夠不對空格轉義,可是必定要爲屬性加雙引號
& 這個字符若是要轉義,那麼必定要放在轉移函數的第一個來作
var data = "#{data}";
var data = "hello"; alert(1);"";複製代碼
由於是用引號將變量包裹起來的,並且被攻擊也由於引號被提早結束,因此要作的就是將引號轉義
先 \\ -> \\\\
再 " -> \\"
複製代碼
按照黑名單過濾: script等 可是html標籤中能執行html代碼的屬性太多了,好比onclick, onhover,onerror,
function xssFilter = function (html) {
html = html.replace(/<\s*\/?script\s*>/g, '');
html = html.repalce(/javascript:[^'"]/g, ''); html = html.replace(/onerror\s*=\s*['"]?[^'"]*['"]?/g, ''); //.... return html; }複製代碼
按照白名單過濾: 只容許某些標籤和屬性存在
作法:將HTML解析成樹狀結構,對於這個DOM樹,一個一個的去看是否存在合法的標籤和屬性,若是不是就去掉。
使用cheerio就能夠快速的解析DOM
function xssFilter (html) {
const cheerio = require('cheerio');
const $ = cheerio.load(html);
//白名單
const whiteList = {'img': ['src']}
$('*').each((index, elem) => {
if(!whiteList[elem.name]) {
$(elem).remove();
return;
}
for(let attr in elem.attribs) {
if(whiteList[elem.name].indexOf(attr) === -1) {
$(elem).attr(attr, null);
}
}
})
return html;
}複製代碼
CSP 本質上就是創建白名單,開發者明確告訴瀏覽器哪些外部資源能夠加載和執行。咱們只須要配置規則,如何攔截是由瀏覽器本身實現的。咱們能夠經過這種方式來儘可能減小 XSS 攻擊。
一般能夠經過兩種方式來開啓 CSP:
<meta http-equiv="Content-Security-Policy">
以設置 HTTP Header 來舉例
Content-Security-Policy: default-src ‘self’
複製代碼
Content-Security-Policy: img-src https://*
複製代碼
Content-Security-Policy: child-src 'none'
複製代碼
CSP ( Content Security Policy )
(Cross Site Request Forgy) 打開同一瀏覽器時其餘的網站對本網站形成的影響。原理就是攻擊者構造出一個後端請求地址,誘導用戶點擊或者經過某些途徑自動發起請求。若是用戶是在登陸狀態下的話,後端就覺得是用戶在操做,從而進行相應的邏輯。
舉個例子,用戶同時打開了A網站和釣魚網站。 假設A網站中有一個經過 GET 請求提交用戶評論的接口,那麼攻擊者就能夠在釣魚網站中加入一個圖片,圖片的地址就是評論接口。
<img src="http://www.domain.com/xxx?comment='attack'"/>複製代碼
禁止第三方網站帶cookies
same-site屬性。 設置只有同一站點的請求才能攜帶cookie
若是某個用戶打開了被攻擊網頁,而且用戶同時訪問了攻擊者的網頁。 那麼攻擊者的網頁就會使用用戶的身份發送一些請求,而且經常使用用戶的身份發佈一些評論或文章,裏面包含攻擊者的網頁連接。若是其餘用戶看到了這個用戶的這條評論,都甚至能夠不點擊,其餘用戶也會被盜用身份發送一些惡意請求。這樣病毒的傳播就會愈來愈快,影響愈來愈大。
所謂SQL注入,就是經過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,後臺執行SQL語句時直接把前端傳入的字段拿來作SQL查詢。
點擊劫持是一種視覺欺騙的攻擊手段。攻擊者將須要攻擊的網站經過 iframe 嵌套的方式嵌入本身的網頁中,並將 iframe 設置爲透明,在頁面中透出一個按鈕誘導用戶點擊。
對於這種攻擊方式,推薦防護的方法有兩種。
X-FRAME-OPTIONS
是一個 HTTP 響應頭,在現代瀏覽器有一個很好的支持。這個 HTTP 響應頭 就是爲了防護用 iframe 嵌套的點擊劫持攻擊。
該響應頭有三個值可選,分別是
DENY
,表示頁面不容許經過iframe
的方式展現SAMEORIGIN
,表示頁面能夠在相同域名下經過iframe
的方式展現ALLOW-FROM
,表示頁面能夠在指定來源的iframe
中展現對於某些低版本瀏覽器來講,並不能支持上面的這種方式,那咱們只有經過 JS 的方式來防護點擊劫持了。
<head>
<style id="click-jack">
html {
display: none !important;
}
</style>
</head>
<body>
<script>
if (self == top) {
var style = document.getElementById('click-jack')
document.body.removeChild(style)
} else {
top.location = self.location
}
</script>
</body>複製代碼
中間人攻擊是攻擊方同時與服務端和客戶端創建起了鏈接,並讓對方認爲鏈接是安全的,可是實際上整個通訊過程都被攻擊者控制了。攻擊者不只能得到雙方的通訊信息,還能修改通訊信息。
一般來講不建議使用公共的 Wi-Fi,由於極可能就會發生中間人攻擊的狀況。若是你在通訊的過程當中涉及到了某些敏感信息,就徹底暴露給攻擊方了。
固然防護中間人攻擊其實並不難,只須要增長一個安全通道來傳輸信息。HTTPS 就能夠用來防護中間人攻擊,可是並非說使用了 HTTPS 就能夠高枕無憂了,由於若是你沒有徹底關閉 HTTP 訪問的話,攻擊方能夠經過某些方式將 HTTPS 降級爲 HTTP 從而實現中間人攻擊。
你的點贊是我持續輸出的動力 但願能幫助到你們 互相學習 有任何問題下面留言 必定回覆