整合營(yíng)銷(xiāo)服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢(xún)熱線:

          Google Chrome 77引入新的網(wǎng)站隔離安全特性

          著 Chrome 77 的發(fā)布,谷歌也為 Android 和桌面版本引入了全新的站點(diǎn)隔離安全特性。此前,當(dāng)熔毀(Meltdown)和幽靈(Spectre)漏洞被披露的時(shí)候,谷歌就快速推出了這項(xiàng)安全特性,以便 Chrome 67 用戶(hù)啟用。開(kāi)啟之后,Chrome 瀏覽器將把用戶(hù)訪問(wèn)的每個(gè)網(wǎng)站,都加載到單獨(dú)的沙盒進(jìn)程中,以限制其對(duì)資源和功能的訪問(wèn)。

          (題圖 via Bleeping Computer)

          通過(guò)這種方式,能夠有效地防止惡意網(wǎng)站利用推測(cè)執(zhí)行攻擊漏洞,來(lái)訪問(wèn)加載在其它瀏覽器選項(xiàng)卡中的數(shù)據(jù)。

          然而啟用站點(diǎn)隔離的代價(jià),就是耗費(fèi)更多的進(jìn)程和內(nèi)存資源,導(dǎo)致某些網(wǎng)站的內(nèi)存用量爆炸。但在安全性和資源利用率之間,總要作出一定的權(quán)衡。

          隨著 Android 版 CChrome 77 的發(fā)布,谷歌決定進(jìn)一步增強(qiáng)對(duì)移動(dòng)用戶(hù)的防護(hù),所以引入了與桌面版本略有不同的網(wǎng)站隔離措施。

          據(jù)悉,Android 版“網(wǎng)站隔離”特性,僅會(huì)保護(hù)用戶(hù)通過(guò)密碼登陸的站點(diǎn),以減少移動(dòng)設(shè)備的資源占用率,畢竟其處理器和內(nèi)存性能都低于臺(tái)式機(jī)計(jì)算機(jī)。

          谷歌表示,目前已有 99% 運(yùn)行 Android 且內(nèi)存超過(guò) 2GB 的用戶(hù)啟用了此功能,且有 1% 用戶(hù)保留了監(jiān)測(cè)功能以提升性能。在未來(lái),谷歌還考慮向更多設(shè)備提供支持。

          對(duì)于想要提供完整站點(diǎn)隔離保護(hù)功能的用戶(hù),可在地址欄輸入 chrome:// flags/#enable-site-per-process 并跳轉(zhuǎn),然后啟用這個(gè)標(biāo)記。

          至于臺(tái)式機(jī)用戶(hù),目前 Chrome 77 的“站點(diǎn)隔離”功能亦可保護(hù)用戶(hù)免受渲染器進(jìn)程的影響。這些進(jìn)程負(fù)責(zé)各個(gè)標(biāo)簽頁(yè)中發(fā)生的事情,例如將 HTML、CSS 和 JavaScript 代碼轉(zhuǎn)義為網(wǎng)頁(yè)并顯示。

          一些攻擊者試圖對(duì)其它標(biāo)簽頁(yè)中的網(wǎng)頁(yè)代碼展開(kāi)攻擊,但新加入的隔離措施,可有效防止此類(lèi)惡意活動(dòng)的發(fā)生。

          者:HelloGitHub-追夢(mèng)人物

          文中涉及的示例代碼,已同步更新到HelloGitHub-Team 倉(cāng)庫(kù)[1]

          上一篇中我們使用了 Markdown 來(lái)為文章提供排版支持。Markdown 在解析內(nèi)容的同時(shí)還可以自動(dòng)提取整個(gè)內(nèi)容的目錄結(jié)構(gòu),現(xiàn)在我們來(lái)使用 Markdown 為文章自動(dòng)生成目錄。

          在文中插入目錄

          先來(lái)回顧一下博客的 Post(文章)模型,其中 body 是我們存儲(chǔ) Markdown 文本的字段:

          blog/models.py
          
          
          from django.db import models
          
          
          class Post(models.Model):
          	# Other fields ...
          	body = models.TextField()
          

          再來(lái)回顧一下文章詳情頁(yè)的視圖,我們?cè)?detail 視圖函數(shù)中將 postbody 字段中的 Markdown 文本解析成了 HTML 文本,然后傳遞給模板顯示。

          blog/views.py
          
          def detail(request, pk):
          	post = get_object_or_404(Post, pk=pk)
          	post.body = markdown.markdown(post.body,
           				extensions=[
           					'markdown.extensions.extra',
           		 			'markdown.extensions.codehilite',
           					'markdown.extensions.toc',
           				])
          	return render(request, 'blog/detail.html', context={'post': post})
          

          markdown.markdown() 方法把 post.body 中的 Markdown 文本解析成了 HTML 文本。同時(shí)我們還給該方法提供了一個(gè) extensions 的額外參數(shù)。其中 markdown.extensions.toc 就是自動(dòng)生成目錄的拓展(這里可以看出我們有先見(jiàn)之明,如果你之前沒(méi)有添加的話記得現(xiàn)在添加進(jìn)去)。

          在渲染 Markdown 文本時(shí)加入了 toc 拓展后,就可以在文中插入目錄了。方法是在書(shū)寫(xiě) Markdown 文本時(shí),在你想生成目錄的地方插入 [TOC] 標(biāo)記即可。例如新寫(xiě)一篇 Markdown 博文,其 Markdown 文本內(nèi)容如下:

          [TOC]
          
          ## 我是標(biāo)題一
          
          這是標(biāo)題一下的正文
          
          ## 我是標(biāo)題二
          
          這是標(biāo)題二下的正文
          
          ### 我是標(biāo)題二下的子標(biāo)題
          這是標(biāo)題二下的子標(biāo)題的正文
          
          ## 我是標(biāo)題三
          這是標(biāo)題三下的正文
          

          其最終解析后的效果就是:

          原本 [TOC] 標(biāo)記的地方被內(nèi)容的目錄替換了。

          在頁(yè)面的任何地方插入目錄

          上述方式的一個(gè)局限性就是只能通過(guò) [TOC] 標(biāo)記在文章內(nèi)容中插入目錄。如果我想在頁(yè)面的其它地方,比如側(cè)邊欄插入一個(gè)目錄該怎么做呢?方法其實(shí)也很簡(jiǎn)單,只需要稍微改動(dòng)一下解析 Markdown 文本內(nèi)容的方式即可,具體代碼就像這樣:

          blog/views.py
          
          def detail(request, pk):
          	post = get_object_or_404(Post, pk=pk)
          	md = markdown.Markdown(extensions=[
          		 'markdown.extensions.extra',
          		 'markdown.extensions.codehilite',
          		 'markdown.extensions.toc',
          	])
          	post.body = md.convert(post.body)
          	post.toc = md.toc
          
          	return render(request, 'blog/detail.html', context={'post': post})
          

          和之前的代碼不同,我們沒(méi)有直接用 markdown.markdown() 方法來(lái)渲染 post.body 中的內(nèi)容,而是先實(shí)例化了一個(gè) markdown.Markdown 對(duì)象 md,和 markdown.markdown() 方法一樣,也傳入了 extensions 參數(shù)。接著我們便使用該實(shí)例的 convert 方法將 post.body 中的 Markdown 文本解析成 HTML 文本。而一旦調(diào)用該方法后,實(shí)例 md 就會(huì)多出一個(gè) toc 屬性,這個(gè)屬性的值就是內(nèi)容的目錄,我們把 md.toc 的值賦給 post.toc 屬性(要注意這個(gè) post 實(shí)例本身是沒(méi)有 toc 屬性的,我們給它動(dòng)態(tài)添加了 toc 屬性,這就是 Python 動(dòng)態(tài)語(yǔ)言的好處)。

          接下來(lái)就在博客文章詳情頁(yè)的文章目錄側(cè)邊欄渲染文章的目錄吧!刪掉占位用的目錄內(nèi)容,替換成如下代碼:

          {% block toc %}
          	<div class="widget widget-content">
          		<h3 class="widget-title">文章目錄</h3>
           	{{ post.toc|safe }}
           	</div>
          {% endblock toc %}
          

          即使用模板變量標(biāo)簽 {{ post.toc }} 顯示模板變量的值,注意 post.toc 實(shí)際是一段 HTML 代碼,我們知道 django 會(huì)對(duì)模板中的 HTML 代碼進(jìn)行轉(zhuǎn)義,所以要使用 safe 標(biāo)簽防止 django 對(duì)其轉(zhuǎn)義。其最終渲染后的效果就是:

          處理空目錄

          現(xiàn)在目錄已經(jīng)可以完美生成了,不過(guò)還有一個(gè)異常情況,當(dāng)文章沒(méi)有任何標(biāo)題元素時(shí),Markdown 就提取不出目錄結(jié)構(gòu),post.toc 就是一個(gè)空的 div 標(biāo)簽,如下:

          <div class="toc">
           	<ul></ul>
          </div>
          

          對(duì)于這種沒(méi)有目錄結(jié)構(gòu)的文章,在側(cè)邊欄顯示一個(gè)目錄是沒(méi)有意義的,所以我們希望只有在文章存在目錄結(jié)構(gòu)時(shí),才顯示側(cè)邊欄的目錄。那么應(yīng)該怎么做呢?

          分析 toc 的內(nèi)容,如果有目錄結(jié)構(gòu),ul 標(biāo)簽中就有值,否則就沒(méi)有值。我們可以使用正則表達(dá)式來(lái)測(cè)試 ul 標(biāo)簽中是否包裹有元素來(lái)確定是否存在目錄。

          def detail(request, pk):
           	post = get_object_or_404(Post, pk=pk)
           	md = markdown.Markdown(extensions=[
           	'markdown.extensions.extra',
           	 	'markdown.extensions.codehilite',
           	'markdown.extensions.toc',
           	])
           	post.body = md.convert(post.body)
           
           	m = re.search(r'<div class="toc">\s*<ul>(.*)</ul>\s*</div>', md.toc, re.S)
           	post.toc = m.group(1) if m is not None else ''
           
           	return render(request, 'blog/detail.html', context={'post': post})
          

          這里我們正則表達(dá)式去匹配生成的目錄中包裹在 ul 標(biāo)簽中的內(nèi)容,如果不為空,說(shuō)明目錄,就把 ul 標(biāo)簽中的值提取出來(lái)(目的是只要包含目錄內(nèi)容的最核心部分,多余的 HTML 標(biāo)簽結(jié)構(gòu)丟掉)賦值給 post.toc;否則,將 post 的 toc 置為空字符串,然后我們就可以在模板中通過(guò)判斷 post.toc 是否為空,來(lái)決定是否顯示側(cè)欄目錄:

          {% block toc %}
           	{% if post.toc %}
           	 <div class="widget widget-content">
           		<h3 class="widget-title">文章目錄</h3>
           		<div class="toc">
           		<ul>
           			{{ post.toc|safe }}
           		</ul>
           		</div>
           	 </div>
           	{% endif %}
          {% endblock toc %}
          

          這里我們看到了一個(gè)新的模板標(biāo)簽 {% if %},這個(gè)標(biāo)簽用來(lái)做條件判斷,和 Python 中的 if 條件判斷是類(lèi)似的。

          美化標(biāo)題的錨點(diǎn) URL

          文章內(nèi)容的標(biāo)題被設(shè)置了錨點(diǎn),點(diǎn)擊目錄中的某個(gè)標(biāo)題,頁(yè)面就會(huì)跳到該文章內(nèi)容中標(biāo)題所在的位置,這時(shí)候?yàn)g覽器的 URL 顯示的值可能不太美觀,比如像下面的樣子:

          http://127.0.0.1:8000/posts/8/#_1
          
          http://127.0.0.1:8000/posts/8/#_3
          

          #_1 就是錨點(diǎn),Markdown 在設(shè)置錨點(diǎn)時(shí)利用的是標(biāo)題的值,由于通常我們的標(biāo)題都是中文,Markdown 沒(méi)法處理,所以它就忽略的標(biāo)題的值,而是簡(jiǎn)單地在后面加了個(gè) \_1 這樣的錨點(diǎn)值。為了解決這一個(gè)問(wèn)題,需要修改一下傳給 extentions 的參數(shù),其具體做法如下:

          blog/views.py
          
          from django.utils.text import slugify
          from markdown.extensions.toc import TocExtension
          
          def detail(request, pk):
           	post = get_object_or_404(Post, pk=pk)
           	md = markdown.Markdown(extensions=[
           	 'markdown.extensions.extra',
           	 'markdown.extensions.codehilite',
           	 # 記得在頂部引入 TocExtension 和 slugify
           	 TocExtension(slugify=slugify),
           	])
           	post.body = md.convert(post.body)
           
           	m = re.search(r'<div class="toc">\s*<ul>(.*)</ul>\s*</div>', md.toc, re.S)
           	post.toc = m.group(1) if m is not None else ''
           
           	return render(request, 'blog/detail.html', context={'post': post})
          

          和之前不同的是,extensions 中的 toc 拓展不再是字符串 markdown.extensions.toc ,而是 TocExtension 的實(shí)例。TocExtension 在實(shí)例化時(shí)其 slugify 參數(shù)可以接受一個(gè)函數(shù),這個(gè)函數(shù)將被用于處理標(biāo)題的錨點(diǎn)值。Markdown 內(nèi)置的處理方法不能處理中文標(biāo)題,所以我們使用了 django.utils.text 中的 slugify 方法,該方法可以很好地處理中文。

          這時(shí)候標(biāo)題的錨點(diǎn) URL 變得好看多了。

          http://127.0.0.1:8000/posts/8/#我是標(biāo)題一
          
          http://127.0.0.1:8000/posts/8/#我是標(biāo)題二下的子標(biāo)題
          

          References

          [1] HelloGitHub-Team 倉(cāng)庫(kù): https://github.com/HelloGitHub-Team/HelloDjango-blog-tutorial

          歡迎關(guān)注 HelloGitHub 公眾號(hào),獲取更多開(kāi)源項(xiàng)目的資料和內(nèi)容

          『講解開(kāi)源項(xiàng)目系列』啟動(dòng)——讓對(duì)開(kāi)源項(xiàng)目感興趣的人不再畏懼、讓開(kāi)源項(xiàng)目的發(fā)起者不再孤單。跟著我們的文章,你會(huì)發(fā)現(xiàn)編程的樂(lè)趣、使用和發(fā)現(xiàn)參與開(kāi)源項(xiàng)目如此簡(jiǎn)單。歡迎聯(lián)系我們給我們投稿,讓更多人愛(ài)上開(kāi)源、貢獻(xiàn)開(kāi)源~

          . 安全

          1.1. 關(guān)乎人類(lèi)心理學(xué)

          1.1.1. 接受開(kāi)發(fā)者有著人類(lèi)的弱點(diǎn),主要的弱點(diǎn)就是對(duì)概率的錯(cuò)誤估計(jì)

          1.2. 安全從來(lái)不只跟軟件和信息有關(guān),也跟人和環(huán)境有關(guān)

          1.2.1. 有不計(jì)其數(shù)的公司讓它們的數(shù)據(jù)庫(kù)在互聯(lián)網(wǎng)上沒(méi)有密碼就可以被訪問(wèn)

          1.3. 安全漏洞本身總是被叫作事故(incident),絕不是不負(fù)責(zé)任的

          1.4. 安全,就像測(cè)試一樣,是你的服務(wù)、數(shù)據(jù)和業(yè)務(wù)的可靠性的一個(gè)子集

          1.5. 應(yīng)當(dāng)將與安全有關(guān)的決定看作可靠性技術(shù)債,它能幫你優(yōu)化整個(gè)人生

          1.6. 安全問(wèn)題的不可避免也強(qiáng)調(diào)了事無(wú)絕對(duì),沒(méi)有絕對(duì)安全的系統(tǒng)

          1.7. 完美的安全是不可能實(shí)現(xiàn)的,你總會(huì)遇到用戶(hù)體驗(yàn)和安全之間的權(quán)衡

          2. 復(fù)盤(pán)報(bào)告

          2.1. postmortem blog post

          2.2. 通常是在一次非常讓人尷尬的安全事件發(fā)生之后寫(xiě)的,目的是清晰地、極盡細(xì)節(jié)地向管理層描述事件始末

          2.2.1. 實(shí)際上是為了掩蓋他們搞砸了的事實(shí)

          3. 負(fù)責(zé)任的披露

          3.1. responsible disclosure

          3.2. 指的是那些沒(méi)有在快速識(shí)別問(wèn)題方面投入較多資源的公司,在利用充足的時(shí)間來(lái)修復(fù)問(wèn)題后,再向公眾公布修復(fù)安全漏洞的做法

          3.3. 負(fù)責(zé)任的披露從一開(kāi)始就應(yīng)該被稱(chēng)為限時(shí)披露

          4. 黑客之外

          4.1. 安全可能還與那些你認(rèn)為不相關(guān)的因素有關(guān)

          4.2. “不要在星期五進(jìn)行部署”

          4.2.1. 這句話的邏輯很簡(jiǎn)單,即如果你把事情搞砸了,周末不會(huì)有人來(lái)處理,所以你應(yīng)該在一周的第一天來(lái)進(jìn)行一些高危操作

          4.2.2. 周末存在的本身不是一個(gè)安全漏洞,但它仍然可能導(dǎo)致災(zāi)難性的結(jié)果

          4.3. Facebook給開(kāi)發(fā)者提供了一個(gè)API,讓他們可以瀏覽用戶(hù)的好友列表

          4.3.1. 2016年,一個(gè)公司通過(guò)這些信息生成用戶(hù)的政治傾向圖,然后通過(guò)精準(zhǔn)投放廣告影響大選

          4.3.2. 這個(gè)功能是完全按照需求來(lái)設(shè)計(jì)的,沒(méi)有錯(cuò)誤,沒(méi)有安全漏洞,沒(méi)有后門(mén),也沒(méi)有黑客介入

          4.3.3. 某些人創(chuàng)造了這個(gè)功能,另一些人使用它,但是獲得的數(shù)據(jù)卻能違背他人意愿而操控他們,并因此導(dǎo)致傷害

          5. 威脅模型

          5.1. 對(duì)腦海里或者紙面上的威脅模型確定需要設(shè)置的安全措施的優(yōu)先次序,并找出其中的漏洞

          5.2. 最常見(jiàn)的威脅模型之一可能是用“反正我也沒(méi)什么值得看的東西!”的想法來(lái)應(yīng)對(duì)黑客攻擊、平臺(tái)管控,或者心懷惡意的前合作伙伴

          5.3. 我們并不真正關(guān)心數(shù)據(jù)是否被泄露和濫用,這種情況產(chǎn)生的原因主要是我們?nèi)狈ο胂罅?lái)思考數(shù)據(jù)的用途

          5.4. 隱私就像安全帶:你在大多數(shù)時(shí)間里不需要它,但當(dāng)你需要它的時(shí)候,它可以救你的命

          5.5. 實(shí)際的威脅建模涉及分析行為者(analyzing actor)、數(shù)據(jù)流(data flow)和信任邊界(trust boundary)

          5.6. 袖珍威脅模型

          5.6.1. 你的應(yīng)用程序的資產(chǎn)

          5.6.1.1. 任何你不想丟失或泄露的東西都是資產(chǎn),包括你的源代碼、設(shè)計(jì)文檔、數(shù)據(jù)庫(kù)、私鑰、API令牌、服務(wù)器配置,還有Netflix觀看清單

          5.6.2. 資產(chǎn)所處的服務(wù)器

          5.6.2.1. 每臺(tái)服務(wù)器都會(huì)被一些人訪問(wèn),而每臺(tái)服務(wù)器都會(huì)訪問(wèn)其他一些服務(wù)器

          5.6.3. 信息敏感性

          5.6.4. 訪問(wèn)資源的路徑

          5.7. 你服務(wù)器上的所有第三方組件都經(jīng)過(guò)了數(shù)百萬(wàn)次的測(cè)試、錯(cuò)誤修復(fù)和安全審計(jì)

          6. 編寫(xiě)安全的網(wǎng)絡(luò)應(yīng)用程序

          6.1. 在設(shè)計(jì)時(shí)考慮到安全問(wèn)題

          6.1.1. 安全是很難后續(xù)改造的,主要是因?yàn)樗械脑O(shè)計(jì)導(dǎo)致你一開(kāi)始就寫(xiě)了不安全的代碼

          6.1.1.1. 設(shè)計(jì)時(shí)首先要考慮到安全問(wèn)題,因?yàn)樵诩扔谢A(chǔ)上去改造安全措施是很難的

          6.1.2. 審查你紙面的或腦海里的威脅模型

          6.1.2.1. 了解風(fēng)險(xiǎn),以及現(xiàn)在使之安全的成本和以后使之安全的成本

          6.1.3. 決定你將把應(yīng)用程序的秘密(數(shù)據(jù)庫(kù)密碼、API密鑰)存儲(chǔ)在哪里

          6.1.3.1. 讓它成為一個(gè)鐵打不動(dòng)的原則

          6.1.4. 設(shè)計(jì)最少的權(quán)限

          6.1.4.1. 代碼不應(yīng)該得到除它必須用到的之外的權(quán)限

          6.1.4.2. 如果只有少數(shù)任務(wù)需要更高的權(quán)限,可以考慮將它們分解成單獨(dú)的、隔離的實(shí)體

          6.1.4.3. 盡可能在最低權(quán)限的賬戶(hù)下運(yùn)行網(wǎng)頁(yè)應(yīng)用程序

          6.1.5. 將安全原則應(yīng)用于你的整個(gè)組織

          6.1.5.1. 員工不應(yīng)該訪問(wèn)他們執(zhí)行日常任務(wù)時(shí)不需要的資源

          6.1.5.2. CEO根本就不該有訪問(wèn)數(shù)據(jù)庫(kù)或服務(wù)器的權(quán)限

          6.1.5.3. 沒(méi)有人可以被信任,而是因?yàn)樗麄兊脑L問(wèn)權(quán)可能會(huì)被外部人員惡意取得

          6.2. 隱蔽性安全的用處

          6.2.1. 軟件安全是一場(chǎng)與時(shí)間的競(jìng)賽

          6.2.1.1. 所有安全措施的唯一目的是為你贏得時(shí)間,讓攻擊者做無(wú)用功

          6.2.2. 信息安全專(zhuān)家厭惡隱蔽性安全

          6.2.2.1. 它不能為你贏得時(shí)間,或者也許它可以,但只是杯水車(chē)薪

          6.2.3. 隱蔽性并不會(huì)給你帶來(lái)真正的安全,但它偶爾會(huì)給你爭(zhēng)取補(bǔ)救時(shí)間,直到你把問(wèn)題解決掉

          6.2.4. 邊際安全并不是真正的安全

          6.2.5. 當(dāng)你在安全這件事上努力的程度是大是小都沒(méi)什么區(qū)別而且風(fēng)險(xiǎn)很大時(shí),更推薦你采用真正的安全而不是隱蔽性安全

          6.2.6. 隱蔽性安全并不是真正的安全,但它可能是真正的損害。你得權(quán)衡利弊

          6.3. 不要光靠你自己去實(shí)現(xiàn)安全

          6.3.1. 你不應(yīng)該編寫(xiě)一種僅屬于自己的安全機(jī)制,無(wú)論它是哈希、加密還是節(jié)流

          6.3.2. 一個(gè)普通的開(kāi)發(fā)者在實(shí)現(xiàn)自己軟件的安全時(shí)可能會(huì)錯(cuò)過(guò)關(guān)鍵的細(xì)節(jié),基本上造成的結(jié)果就是毫不安全(zero security)

          6.4. SQL注入攻擊

          6.4.1. 解決SQL注入問(wèn)題的最安全方法是使用參數(shù)化查詢(xún)(parameterized query)

          6.4.1.1. 參數(shù)化查詢(xún)并不是靈丹妙藥

          6.4.1.2. 有些數(shù)據(jù)庫(kù)的抽象似乎不支持常見(jiàn)的參數(shù)化查詢(xún),這些數(shù)據(jù)庫(kù)的抽象有其他的方法來(lái)進(jìn)行參數(shù)化查詢(xún)

          6.4.1.3. 不要力求全部查詢(xún)都實(shí)現(xiàn)參數(shù)化

          6.4.2. 使用參數(shù)化查詢(xún)的另一個(gè)好處是可以減少查詢(xún)計(jì)劃緩存(query plan cache)污染

          6.4.3. 因?yàn)椴樵?xún)計(jì)劃緩存的容量是有限的,如果你用大量的不同用戶(hù)名運(yùn)行這個(gè)查詢(xún),其他有用的查詢(xún)計(jì)劃條目將從緩存中被擠出,而緩存將被這些可能無(wú)用的條目填滿(mǎn),這就叫作查詢(xún)計(jì)劃緩存污染

          6.5. 備份

          6.5.1. 回退是最糟糕的錯(cuò)誤類(lèi)型,會(huì)浪費(fèi)我們的時(shí)間

          6.5.2. "3-2-1備份規(guī)則”(3-2-1 backup rule)

          6.5.2.1. 有三個(gè)獨(dú)立的備份,兩個(gè)在獨(dú)立的媒介上,一個(gè)在獨(dú)立的地點(diǎn)

          6.6. 跨站腳本攻擊

          6.6.1. 跨站腳本(cross-site scripting)攻擊應(yīng)該被叫作“JavaScript注入攻擊”

          6.6.2. 第一階段是將JavaScript的代碼插入網(wǎng)頁(yè)當(dāng)中

          6.6.3. 第二階段就是通過(guò)網(wǎng)絡(luò)傳輸更多的JavaScript代碼,并在網(wǎng)頁(yè)上執(zhí)行

          6.6.4. 通過(guò)從其他會(huì)話中竊取會(huì)話cookie來(lái)捕獲這些會(huì)話,這個(gè)操作叫作會(huì)話劫持(session hijacking)

          6.6.5. 導(dǎo)致XSS攻擊出現(xiàn)的原因往往是存在問(wèn)題的HTML代碼

          6.6.6. 抵御XSS攻擊的最簡(jiǎn)單方法是對(duì)文本進(jìn)行重編碼,使特殊的HTML字符被轉(zhuǎn)義

          6.6.7. CSP是應(yīng)對(duì)XSS攻擊的另一個(gè)手段

          6.6.7.1. CSP(content security policy,內(nèi)容安全策略)

          6.6.7.2. 它是一個(gè)HTTP頭,限制了可以從第三方服務(wù)器請(qǐng)求的資源

          6.6.7.3. 維護(hù)一個(gè)可信域列表并且使它保持最新?tīng)顟B(tài)是一件很費(fèi)力、費(fèi)時(shí)的事情

          6.6.7.4. 無(wú)論你是否打算使用CSP,都應(yīng)該注意正確編碼HTML輸出

          6.6.8. 只要不忽略注入HTML代碼和完全不進(jìn)行編碼等問(wèn)題,那么避免XSS攻擊還是很容易的

          6.7. 跨站請(qǐng)求偽造

          6.7.1. 在HTTP中,修改網(wǎng)絡(luò)內(nèi)容的操作是用POST,而不是用GET來(lái)實(shí)現(xiàn)的,這是有原因的

          6.7.1.1. 你沒(méi)辦法生成指向POST地址的可單擊鏈接

          6.7.1.2. 它只能被POST一次,如果操作失敗,瀏覽器會(huì)警告你是否需要再次提交

          6.7.1.3. POST的這種性質(zhì)使我們對(duì)它過(guò)于信任

          6.7.1.4. POST的隱患是,原始表單不一定要和POST請(qǐng)求所在的域相同

          6.7.1.4.1. 要避免這種問(wèn)題的產(chǎn)生,可以對(duì)每個(gè)生成的form使用一個(gè)隨機(jī)生成的數(shù)字,這個(gè)數(shù)字會(huì)被復(fù)制在form本身和網(wǎng)站響應(yīng)標(biāo)題上

          6.7.1.4.2. 你需要確保它在服務(wù)器端也得到了驗(yàn)證

          6.8. 永遠(yuǎn)不要相信用戶(hù)的輸入


          主站蜘蛛池模板: 丰满人妻一区二区三区视频| 亚洲AV无码一区二区大桥未久| 国产精品久久久久一区二区三区 | 亚洲国产精品第一区二区| 国产一区二区三区在线免费观看| 亚洲一区二区久久| 国产激情无码一区二区| 亚洲无线码一区二区三区| a级午夜毛片免费一区二区| 一区视频免费观看| 亚洲人AV永久一区二区三区久久| 中文字幕一区二区三区四区| 亚洲国产精品自在线一区二区| 亚洲综合在线一区二区三区| 精品一区二区91| 亚洲AV无码一区二区二三区入口 | 亚洲综合色一区二区三区| 中文字幕精品一区二区2021年 | 一区二区三区四区视频在线| 日韩一区在线视频| 精品视频一区二区三区| 久久久久人妻精品一区蜜桃| 亚洲无圣光一区二区| 日韩成人一区ftp在线播放| 天码av无码一区二区三区四区| 国产精品无码一区二区三区电影| 久久精品视频一区二区三区| 国精产品999一区二区三区有限 | 99精品一区二区三区无码吞精| 老熟妇高潮一区二区三区| 亚洲电影国产一区| 亚洲毛片不卡av在线播放一区| 相泽南亚洲一区二区在线播放| 国产一区二区精品久久岳| 亚洲AV网一区二区三区| 亚洲无线码一区二区三区| 国产一区二区三区视频在线观看| 国产麻豆精品一区二区三区v视界| 无码aⅴ精品一区二区三区| 国模少妇一区二区三区| 久久精品国产一区二区电影|