前言 大家好,我是
唐唐 。金九銀十即將來臨啦,我梳理了50道
計算機(jī)網(wǎng)絡(luò) 面試題,每一道題目都特別經(jīng)典,大廠也非常喜歡問。相信大家看完,會有新的收獲滴~
1. 說說HTTP常用的狀態(tài)碼及其含義? 思路: ?這道面試題主要考察候選人,是否掌握HTTP狀態(tài)碼這個基礎(chǔ)知識點。
不管是不是面試需要,我們都要知道,日常開發(fā)中的這幾個狀態(tài)碼的含義哈: 2. HTTP 常用的請求方式,區(qū)別和用途? 思路: ?這道題主要考察候選人,是否掌握
HTTP請求方式 這個基礎(chǔ)知識點,我們用得比較多就是
GET和POST 啦。
3. 請簡單說一下你了解的端口及對應(yīng)的服務(wù)? 4. 說下計算機(jī)網(wǎng)絡(luò)體系結(jié)構(gòu) 思路: ?這道題主要考察候選人,
計算機(jī)網(wǎng)絡(luò)體系結(jié)構(gòu) 這個基礎(chǔ)知識點。計算機(jī)網(wǎng)路體系結(jié)構(gòu)呢,有三層:ISO七層模型、TCP/IP四層模型、五層體系結(jié)構(gòu)。大家可以記住這個圖,如下
計算機(jī)網(wǎng)絡(luò)體系結(jié)構(gòu) 4.1 ISO七層模型 ISO七層模型是國際標(biāo)準(zhǔn)化組織(International Organization for Standardization)制定的一個用于計算機(jī)或通信系統(tǒng)間互聯(lián)的標(biāo)準(zhǔn)體系。
★ 應(yīng)用層:網(wǎng)絡(luò)服務(wù)與最終用戶的一個接口,常見的協(xié)議有:HTTP FTP ?SMTP SNMP DNS . 表示層:數(shù)據(jù)的表示、安全、壓縮。,確保一個系統(tǒng)的應(yīng)用層所發(fā)送的信息可以被另一個系統(tǒng)的應(yīng)用層讀取。 會話層:建立、管理、終止會話,對應(yīng)主機(jī)進(jìn)程,指本地主機(jī)與遠(yuǎn)程主機(jī)正在進(jìn)行的會話. 傳輸層:定義傳輸數(shù)據(jù)的協(xié)議端口號,以及流控和差錯校驗,協(xié)議有TCP UDP . 網(wǎng)絡(luò)層:進(jìn)行邏輯地址尋址,實現(xiàn)不同網(wǎng)絡(luò)之間的路徑選擇,協(xié)議有ICMP IGMP IP等 . 數(shù)據(jù)鏈路層:在物理層提供比特流服務(wù)的基礎(chǔ)上,建立相鄰結(jié)點之間的數(shù)據(jù)鏈路。 物理層:建立、維護(hù)、斷開物理連接。 ” 4.2 TCP/IP 四層模型 ★ 應(yīng)用層:對應(yīng)于OSI參考模型的(應(yīng)用層、表示層、會話層)。 傳輸層: 對應(yīng)OSI的傳輸層,為應(yīng)用層實體提供端到端的通信功能,保證了數(shù)據(jù)包的順序傳送及數(shù)據(jù)的完整性。 網(wǎng)際層:對應(yīng)于OSI參考模型的網(wǎng)絡(luò)層,主要解決主機(jī)到主機(jī)的通信問題。 網(wǎng)絡(luò)接口層:與OSI參考模型的數(shù)據(jù)鏈路層、物理層對應(yīng)。 ” 4.3 五層體系結(jié)構(gòu) ★ 應(yīng)用層:對應(yīng)于OSI參考模型的(應(yīng)用層、表示層、會話層)。 傳輸層:對應(yīng)OSI參考模型的的傳輸層 網(wǎng)絡(luò)層:對應(yīng)OSI參考模型的的網(wǎng)絡(luò)層 數(shù)據(jù)鏈路層:對應(yīng)OSI參考模型的的數(shù)據(jù)鏈路層 物理層:對應(yīng)OSI參考模型的的物理層。 ” 5 如何理解HTTP協(xié)議是無狀態(tài)的 思路: ?這道題主要考察候選人,是否理解Http協(xié)議,它為什么是無狀態(tài)的呢?如何使它有狀態(tài)呢?如何理解無狀態(tài)這個詞呢?
★ 當(dāng)瀏覽器第一次發(fā)送請求給服務(wù)器時,服務(wù)器響應(yīng)了;如果同個瀏覽器發(fā)起第二次請求給服務(wù)器時,它還是會響應(yīng),但是呢,服務(wù)器不知道你就是剛才的那個瀏覽器。簡言之,服務(wù)器不會去記住你是誰,所以是無狀態(tài)協(xié)議。” 可以通過一個生活中的例子,來更好理解并記住它:
有狀態(tài)場景: 小紅:今天吃啥子? 小明:羅非魚~ 小紅:味道怎么樣呀? 小明:還不錯,好香。 無狀態(tài)的場景: 小紅:今天吃啥子? 小明:羅非魚~ 小紅:味道怎么樣呀? 小明:??。磕阏f啥?什么鬼?什么味道怎么樣? Http加了Cookie的話 :
小紅:今天吃啥子? 小明:羅非魚~ 小紅:你今天吃的羅非魚,味道怎么樣呀? 小明:還不錯,好香。 6.從瀏覽器地址欄輸入url到顯示主頁的過程 思路: ?這道題主要考察的知識點是HTTP的請求過程,
DNS解析,TCP三次握手,四次揮手這幾個要點 ,我們都可以講下。
DNS解析,查找域名對應(yīng)的IP地址。 與服務(wù)器通過三次握手,建立TCP連接 向服務(wù)器發(fā)送HTTP請求 服務(wù)器處理請求,返回網(wǎng)頁內(nèi)容 瀏覽器解析并渲染頁面 TCP四次揮手,連接結(jié)束 7. 說下HTTP/1.0,1.1,2.0的區(qū)別 思路: ?這道題主要考察的知識點是HTTP幾個版本的區(qū)別,我們記住
HTTP/1.0 默認(rèn)是短連接,可以強制開啟,HTTP/1.1默認(rèn)長連接,HTTP/2.0采用
多路復(fù)用 就差不多啦。
HTTP/1.0 默認(rèn)使用短連接 ,每次請求都需要建立一個TCP連接。它可以設(shè)置Connection: keep-alive
?這個字段,強制開啟長連接。 HTTP/1.1 引入了持久連接,即TCP連接默認(rèn)不關(guān)閉,可以被多個請求復(fù)用。 分塊傳輸編碼,即服務(wù)端沒產(chǎn)生一塊數(shù)據(jù),就發(fā)送一塊,用”流模式”取代”緩存模式”。 管道機(jī)制,即在同一個TCP連接里面,客戶端可以同時發(fā)送多個請求。 HTTP/2.0 二進(jìn)制協(xié)議,1.1版本的頭信息是文本(ASCII編碼),數(shù)據(jù)體可以是文本或者二進(jìn)制;2.0中,頭信息和數(shù)據(jù)體都是二進(jìn)制。 完全多路復(fù)用,在一個連接里,客戶端和瀏覽器都可以同時發(fā)送多個請求或回應(yīng),而且不用按照順序一一對應(yīng)。 報頭壓縮,HTTP協(xié)議不帶有狀態(tài),每次請求都必須附上所有信息。Http/2.0引入了頭信息壓縮機(jī)制,使用gzip或compress壓縮后再發(fā)送。 服務(wù)端推送,允許服務(wù)器未經(jīng)請求,主動向客戶端發(fā)送資源。 8. ?POST和GET有哪些區(qū)別? 思路: ?這道題主要考察的知識點是POST和GET的區(qū)別,可以從
數(shù)據(jù)包、編碼方式、請求參數(shù)、收藏為書簽、歷史記錄、安全性 等幾方面去回答哈。
9. 在交互過程中如果數(shù)據(jù)傳送完了,還不想斷開連接怎么辦,怎么維持? 這個問題記住
keep-alive
就好,也就是說,在HTTP中響應(yīng)體的
Connection 字段指定為
keep-alive
即可
10. HTTP 如何實現(xiàn)長連接?在什么時候會超時? 思路: ?這道題實際上是考察TCP長連接的知識點,HTTP的長連接實質(zhì)是指TCP的長連接。至于什么時候超時,我們記住這幾個參數(shù)如
tcp_keepalive_time 、
tcp_keepalive_probes 就好啦
什么是HTTP的長連接? HTTP分為長連接和短連接,本質(zhì)上說的是TCP的長短連接 。TCP連接是一個雙向的通道,它是可以保持一段時間不關(guān)閉的,因此TCP連接才具有真正的長連接和短連接這一說法哈。 TCP長連接可以復(fù)用一個TCP連接,來發(fā)起多次的HTTP請求,這樣就可以減少資源消耗,比如一次請求HTML,如果是短連接的話,可能還需要請求后續(xù)的JS/CSS。 如何設(shè)置長連接? 通過在頭部(請求和響應(yīng)頭)設(shè)置
Connection 字段指定為
keep-alive
,HTTP/1.0協(xié)議支持,但是是默認(rèn)關(guān)閉的,從HTTP/1.1以后,連接默認(rèn)都是長連接。
在什么時候會超時呢? ★ HTTP一般會有httpd守護(hù)進(jìn)程,里面可以設(shè)置keep-alive timeout ,當(dāng)tcp連接閑置超過這個時間就會關(guān)閉,也可以在HTTP的header里面設(shè)置超時時間 TCP 的keep-alive 包含三個參數(shù),支持在系統(tǒng)內(nèi)核的net.ipv4里面設(shè)置;當(dāng) TCP 連接之后,閑置了tcp_keepalive_time ,則會發(fā)生偵測包,如果沒有收到對方的ACK,那么會每隔 tcp_keepalive_intvl再發(fā)一次,直到發(fā)送了tcp_keepalive_probes ,就會丟棄該連接。 ” 1.?tcp_keepalive_intvl?=?15 2.?tcp_keepalive_probes?=?5 3.?tcp_keepalive_time?=?1800
11. HTTP 與 HTTPS 的區(qū)別。 思路: ?這道題實際上考察的知識點是HTTP與HTTPS的區(qū)別,這個知識點非常重要,可以
從安全性、數(shù)據(jù)是否加密、默認(rèn)端口 等這幾個方面去回答哈。其實,當(dāng)你理解HTTPS的整個流程,就可以很好回答這個問題啦。
我的答案如下 :HTTP,即超文本傳輸協(xié)議,是一個基于TCP/IP通信協(xié)議來傳遞明文數(shù)據(jù)的協(xié)議。HTTP會存在這
幾個問題 :
請求信息是明文傳輸,容易被竊聽截取。 沒有驗證對方身份,存在被冒充的風(fēng)險 數(shù)據(jù)的完整性未校驗,容易被中間人篡改 為了解決Http存在的問題,Https出現(xiàn)啦。
Https是什么? HTTPS= HTTP SSL/TLS ,可以理解Https是身披SSL(Secure Socket Layer,安全套接層)的HTTP。它們主要區(qū)別如下:
12 . Https流程是怎樣的? 思路: ?這道題實際上考察的知識點是HTTPS的工作流程,大家需要回答這幾個要點,
公私鑰、數(shù)字證書、加密、對稱加密、非對稱加密 。
HTTPS = HTTP SSL/TLS,也就是用SSL/TLS對數(shù)據(jù)進(jìn)行加密和解密,Http進(jìn)行傳輸。 SSL,即Secure Sockets Layer(安全套接層協(xié)議),是網(wǎng)絡(luò)通信提供安全及數(shù)據(jù)完整性的一種安全協(xié)議。 TLS,即Transport Layer Security(安全傳輸層協(xié)議),它是SSL3.0的后續(xù)版本。 Https工作流程 客戶端發(fā)起Https請求,連接到服務(wù)器的443端口。 服務(wù)器必須要有一套數(shù)字證書(證書內(nèi)容有公鑰、證書頒發(fā)機(jī)構(gòu)、失效日期等)。 服務(wù)器將自己的數(shù)字證書發(fā)送給客戶端(公鑰在證書里面,私鑰由服務(wù)器持有)。 客戶端收到數(shù)字證書之后,會驗證證書的合法性。如果證書驗證通過,就會生成一個隨機(jī)的對稱密鑰,用證書的公鑰加密。 客戶端將公鑰加密后的密鑰發(fā)送到服務(wù)器。 服務(wù)器接收到客戶端發(fā)來的密文密鑰之后,用自己之前保留的私鑰對其進(jìn)行非對稱解密,解密之后就得到客戶端的密鑰,然后用客戶端密鑰對返回數(shù)據(jù)進(jìn)行對稱加密,醬紫傳輸?shù)臄?shù)據(jù)都是密文啦。 服務(wù)器將加密后的密文返回到客戶端。 客戶端收到后,用自己的密鑰對其進(jìn)行對稱解密,得到服務(wù)器返回的數(shù)據(jù)。 13. 說說HTTP的狀態(tài)碼,301和302的區(qū)別? 思路: ?這道題考查的知識點,也是HTTP狀態(tài)碼,302和301都有重定向的含義,但是它們也是有區(qū)別的。
301:(永久性轉(zhuǎn)移)請求的網(wǎng)頁已被永久移動到新位置。服務(wù)器返回此響應(yīng)時,會自動將請求者轉(zhuǎn)到新位置。 302:(暫時性轉(zhuǎn)移)服務(wù)器目前正從不同位置的網(wǎng)頁響應(yīng)請求,但請求者應(yīng)繼續(xù)使用原有位置來進(jìn)行以后的請求。此代碼與響應(yīng)GET和HEAD請求的301代碼類似,會自動將請求者轉(zhuǎn)到不同的位置。 網(wǎng)上有個很
形象的例子 比喻:
★ 當(dāng)一個網(wǎng)站或者網(wǎng)頁24—48小時內(nèi)臨時移動到一個新的位置,這時候就要進(jìn)行302跳轉(zhuǎn),打個比方說,我有一套房子,但是最近走親戚去親戚家住了,過兩天我還回來的。而使用301跳轉(zhuǎn)的場景就是之前的網(wǎng)站因為某種原因需要移除掉,然后要到新的地址訪問,是永久性的,就比如你的那套房子其實是租的,現(xiàn)在租期到了,你又在另一個地方找到了房子,之前租的房子不住了。” 14. 說說什么是數(shù)字簽名?什么是數(shù)字證書? 思路: ?這道題考查的知識點,不僅僅是數(shù)字簽名,數(shù)字證書,很可能面試官也會問你https的原理的,因為https原理跟數(shù)字證書有關(guān)的哈,大家需要掌握https原理哦。數(shù)字證書是指在互聯(lián)網(wǎng)通訊中標(biāo)志通訊各方身份信息的一個數(shù)字認(rèn)證,人們可以在網(wǎng)上用它來識別對方的身份。它的出現(xiàn),是為了避免身份被篡改冒充的。比如Https的數(shù)字證書,就是為了避免公鑰被中間人冒充篡改:
數(shù)字證書構(gòu)成 公鑰和個人等信息,經(jīng)過Hash摘要算法加密,形成消息摘要;將消息摘要拿到擁有公信力的認(rèn)證中心(CA),用它的私鑰對消息摘要加密,形成數(shù)字簽名 。 公鑰和個人信息、數(shù)字簽名共同構(gòu)成數(shù)字證書 。 15. 對稱加密與非對稱加密有什么區(qū)別 思路: ?這道題考察的知識點是對稱加密與非對稱加密算法,什么是對稱加密,什么是非對稱加密呢?對稱加密:指加密和解密使用同一密鑰,優(yōu)點是運算速度較快,缺點是如何安全將密鑰傳輸給另一方。常見的對稱加密算法有:DES、AES等。
對稱加密 非對稱加密:指的是加密和解密使用不同的密鑰(即公鑰和私鑰)。公鑰與私鑰是成對存在的,如果用公鑰對數(shù)據(jù)進(jìn)行加密,只有對應(yīng)的私鑰才能解密。常見的非對稱加密算法有RSA。
非對稱加密 16. 說說DNS的解析過程? 思路: ?這道題考察的知識點是
DNS域名解析 ,http請求的過程,是涉及到DNS域名解析的,這道面試題也挺經(jīng)典的,大家可以看下《圖解HTTP》那本書哈。
★ DNS,英文全稱是domain name system ,域名解析系統(tǒng),是Internet上作為域名和IP相互映射的一個分布式數(shù)據(jù)庫。它的作用很明確,就是可以根據(jù)域名查出對應(yīng)的IP地址。在瀏覽器緩存、本地DNS服務(wù)器、根域名服務(wù)器都是怎么查找的,大家回答的時候都可以說下哈。” DNS的解析過程如下圖:
DNS解析查找過程 假設(shè)你要查詢
www.baidu.com 的IP地址:
★ 首先會查找瀏覽器的緩存,看看是否能找到www.baidu.com 對應(yīng)的IP地址,找到就直接返回;否則進(jìn)行下一步。 將請求發(fā)往給本地DNS服務(wù)器,如果查找到也直接返回,否則繼續(xù)進(jìn)行下一步; 本地DNS服務(wù)器向根域名服務(wù)器 發(fā)送請求,根域名服務(wù)器返回負(fù)責(zé).com
的頂級域名服務(wù)器的IP地址的列表。 本地DNS服務(wù)器再向其中一個負(fù)責(zé).com
的頂級域名服務(wù)器發(fā)送一個請求,返回負(fù)責(zé).baidu
的權(quán)威域名服務(wù)器的IP地址列表。 本地DNS服務(wù)器再向其中一個權(quán)威域名服務(wù)器發(fā)送一個請求,返回www.baidu.com 所對應(yīng)的IP地址。 ” 17. 什么是CSRF攻擊,如何避免 思路: ?這道題考察的知識點是
CSRF攻擊 ,它是屬于網(wǎng)絡(luò)安全這塊的知識點,還有
Xss攻擊、SQL注入、DDoS 等這些常見的網(wǎng)絡(luò)攻擊,我們都需要知道攻擊的流程哈。
什么是CSRF 攻擊? ★ CSRF,跨站請求偽造(英文全稱是Cross-site request forgery),是一種挾制用戶在當(dāng)前已登錄的Web應(yīng)用程序上執(zhí)行非本意的操作的攻擊方法。” CSRF是如何攻擊的呢? 來看一個來自百度百科的例子哈:
Tom 登陸銀行,沒有退出,瀏覽器包含了Tom在銀行的身份認(rèn)證信息。 黑客Jerry將偽造的轉(zhuǎn)賬請求,包含在在帖子 Tom在銀行網(wǎng)站保持登陸的情況下,瀏覽帖子 將偽造的轉(zhuǎn)賬請求連同身份認(rèn)證信息,發(fā)送到銀行網(wǎng)站 銀行網(wǎng)站看到身份認(rèn)證信息,以為就是Tom的合法操作,最后造成Tom資金損失。 怎么解決CSRF攻擊呢? 18. 聊聊五層計算機(jī)網(wǎng)絡(luò)體系結(jié)構(gòu)中,每一層對應(yīng)的網(wǎng)絡(luò)協(xié)議有哪些? 為了大家方便記憶,我還是畫個思維導(dǎo)圖吧,如下:
19. 說說 WebSocket與socket的區(qū)別 思路: ?這是一個比較基礎(chǔ)的知識點,經(jīng)常有小伙伴會搞混。
Socket其實就是等于IP地址 端口 協(xié)議 。 ★ 具體來說,Socket是一套標(biāo)準(zhǔn),它完成了對TCP/IP的高度封裝,屏蔽網(wǎng)絡(luò)細(xì)節(jié),以方便開發(fā)者更好地進(jìn)行網(wǎng)絡(luò)編程。” WebSocket是一個持久化的協(xié)議,它是伴隨H5而出的協(xié)議,用來解決http不支持持久化連接 的問題。 Socket一個是網(wǎng)編編程的標(biāo)準(zhǔn)接口 ,而WebSocket則是應(yīng)用層通信協(xié)議。 20. 什么是DoS、DDoS、DRDoS攻擊? 思路: ?這是涉及網(wǎng)絡(luò)安全的一個知識點,DDos還會挺常見的,如SYN Flood。
★ DOS : (Denial of Service),翻譯過來就是拒絕服務(wù),一切能引起DOS行為的攻擊都被稱為DOS攻擊。最常見的DoS攻擊就有計算機(jī)網(wǎng)絡(luò) 寬帶攻擊 、連通性攻擊 。DDoS : (Distributed Denial of Service),翻譯過來是分布式拒絕服務(wù)。是指處于不同位置的多個攻擊者同時向一個或幾個目標(biāo)發(fā)動攻擊,或者一個攻擊者控制了位于不同位置的多臺機(jī)器并利用這些機(jī)器對受害者同時實施攻擊。常見的DDos有SYN Flood、Ping of Death、ACK Flood、UDP Flood 等。DRDoS : (Distributed Reflection Denial of Service),中文是分布式反射拒絕服務(wù),該方式靠的是發(fā)送大量帶有被害者IP地址的數(shù)據(jù)包給攻擊主機(jī),然后攻擊主機(jī)對IP地址源做出大量回應(yīng),從而形成拒絕服務(wù)攻擊。” 21. 什么是XSS攻擊,如何避免? 思路: ?XSS攻擊也是比較常見,XSS,叫
跨站腳本攻擊(Cross-Site Scripting) ,因為會與層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,因此有人將跨站腳本攻擊縮寫為XSS。它指的是惡意攻擊者往Web頁面里插入惡意html代碼,當(dāng)用戶瀏覽該頁之時,嵌入其中Web里面的html代碼會被執(zhí)行,從而達(dá)到惡意攻擊用戶的特殊目的。XSS攻擊一般分三種類型:
存儲型 、反射型 、DOM型XSS 21.1 XSS是如何攻擊的呢? 拿反射型舉個例子吧,流程圖如下:
21.2 如何解決XSS攻擊問題? 對輸入進(jìn)行過濾,過濾標(biāo)簽等,只允許合法值。 HTML轉(zhuǎn)義 對于鏈接跳轉(zhuǎn),如?等,要校驗內(nèi)容,禁止以script開頭的非法鏈接。
限制輸入長度 22. Http請求的過程與原理 思路: ?HTTP請求,一個非常非常基礎(chǔ)的知識點,一定需要掌握的。其實覺得跟瀏覽器地址欄輸入url到顯示主頁這道題有點類似。
我的答案如下 :HTTP是一個基于TCP/IP協(xié)議來傳遞數(shù)據(jù)的超文本傳輸協(xié)議,傳輸?shù)臄?shù)據(jù)類型有HTML,圖片等。以訪問百度有例子,看下一次Http的請求過程吧
Http請求過程 客戶端進(jìn)行DNS域名解析,得到對應(yīng)的IP地址 根據(jù)這個IP,找到對應(yīng)的服務(wù)器建立連接(三次握手) 建立TCP連接后發(fā)起HTTP請求(一個完整的http請求報文) 服務(wù)器響應(yīng)HTTP請求,客戶端得到html代碼 客戶端解析html代碼,用html代碼中的資源(如js,css,圖片等等)渲染頁面。 服務(wù)器關(guān)閉TCP連接(四次揮手) 23. ?forward和redirect的區(qū)別? 思路: ?這道題有點偏Java web方向的。以前記得剛出來實習(xí)找工作的時候,面試官可喜歡問這道題啦,當(dāng)時我記的答案就是,forward是轉(zhuǎn)發(fā),redirect是重定向。
我的答案如下 :
★ 直接轉(zhuǎn)發(fā)方式(Forward) ?,客戶端和瀏覽器只發(fā)出一次請求,Servlet、HTML、JSP或其它信息資源,由第二個信息資源響應(yīng)該請求,在請求對象request中,保存的對象對于每個信息資源是共享的。間接轉(zhuǎn)發(fā)方式(Redirect) ?實際是兩次HTTP請求,服務(wù)器端在響應(yīng)第一次請求的時候,讓瀏覽器再向另外一個URL發(fā)出請求,從而達(dá)到轉(zhuǎn)發(fā)的目的。” 舉個通俗的例子:
★ 直接轉(zhuǎn)發(fā)就相當(dāng)于:“A找B借錢,B說沒有,B去找C借,借到借不到都會把消息傳遞給A”; 間接轉(zhuǎn)發(fā)就相當(dāng)于:"A找B借錢,B說沒有,讓A去找C借"。** ” 看下這兩個圖,可以更容易理解一些:
24. 聊聊SQL注入? 思路: ?SQL注入是最經(jīng)典的安全問題。無論你是前端開發(fā)還是后端開發(fā),都必須掌握的。
★ SQL注入是一種代碼注入技術(shù),一般被應(yīng)用于攻擊web應(yīng)用程序。它通過在web應(yīng)用接口傳入一些特殊參數(shù)字符,來欺騙應(yīng)用服務(wù)器,執(zhí)行惡意的SQL命令,以達(dá)到非法獲取系統(tǒng)信息的目的。它目前是黑客對數(shù)據(jù)庫進(jìn)行攻擊的最常用手段之一。” 24.1 SQL注入是如何攻擊的? 舉個常見的
業(yè)務(wù)場景 :在web表單搜索框輸入員工名字,然后后臺查詢出對應(yīng)名字的員工。
這種場景下,一般都是前端頁面,把一個名字參數(shù)name傳到后臺,然后后臺通過SQL把結(jié)果查詢出來
name?=?"田螺" ;?//前端傳過來的 SQL=?"select?*?from?staff?where?name=" ? ?name;??//根據(jù)前端傳過來的name參數(shù),查詢數(shù)據(jù)庫員工表staff
因為SQL是直接拼接的,如果我們完全信任前端傳的參數(shù)的話。假如前端傳這么一個參數(shù)時
'' or '1'='1'
,SQL就變成醬紫的啦。
select?*?from?staff?where ?name='' ?or?'1' ='1' ;
這個SQL會把所有的員工信息全都查出來了,醬紫就請求用戶已經(jīng)越權(quán)啦。請求者可以獲取所有員工的信息,信息已經(jīng)暴露了啦。
24.2 如何預(yù)防SQL注入問題 1). 使用#{}而不是 ${} 在MyBatis中,使用
#{}
而不是
${}
,可以很大程度防止sql注入。
因為#{}
是一個參數(shù)占位符,對于字符串類型,會自動加上"",其他類型不加。由于Mybatis采用預(yù)編譯 ,其后的參數(shù)不會再進(jìn)行SQL編譯,所以一定程度上防止SQL注入。 ${}
是一個簡單的字符串替換,字符串是什么,就會解析成什么,存在SQL注入風(fēng)險2). 不要暴露一些不必要的日志或者安全信息,比如避免直接響應(yīng)一些sql異常信息。 如果SQL發(fā)生異常了,不要把這些信息暴露響應(yīng)給用戶,可以自定義異常進(jìn)行響應(yīng)
3). 不相信任何外部輸入?yún)?shù),過濾參數(shù)中含有的一些數(shù)據(jù)庫關(guān)鍵詞關(guān)鍵詞 可以加個參數(shù)校驗過濾的方法,過濾
union,or
等數(shù)據(jù)庫關(guān)鍵詞
4). 適當(dāng)?shù)臋?quán)限控制 在你查詢信息時,先校驗下當(dāng)前用戶是否有這個權(quán)限。比如說,實現(xiàn)代碼的時候,可以讓用戶多傳一個企業(yè)Id什么的,或者獲取當(dāng)前用戶的session信息等,在查詢前,先校驗一下當(dāng)前用戶是否是這個企業(yè)下的等等,是的話才有這個查詢員工的權(quán)限。
25. Session和Cookie的區(qū)別。 我們先來看Session和Cookie的概念吧: Cookie是保存在客戶端的一小塊文本串的數(shù)據(jù)??蛻舳讼蚍?wù)器發(fā)起請求時,服務(wù)端會向客戶端發(fā)送一個Cookie,客戶端就把Cookie保存起來。在客戶端下次向同一服務(wù)器再發(fā)起請求時,Cookie被攜帶發(fā)送到服務(wù)器。服務(wù)器就是根據(jù)這個Cookie來確認(rèn)身份的。 session指的就是服務(wù)器和客戶端一次會話的過程。Session利用Cookie進(jìn)行信息處理的,當(dāng)用戶首先進(jìn)行了請求后,服務(wù)端就在用戶瀏覽器上創(chuàng)建了一個Cookie,當(dāng)這個Session結(jié)束時,其實就是意味著這個Cookie就過期了。Session對象存儲著特定用戶會話所需的屬性及配置信息。 Session 和Cookie的區(qū)別主要有這些: 來看個圖吧:
★ 用戶第一次請求服務(wù)器時,服務(wù)器根據(jù)用戶提交的信息,創(chuàng)建對應(yīng)的Session,請求返回時將此Session的唯一標(biāo)識信息SessionID返回給瀏覽器,瀏覽器接收到服務(wù)器返回的SessionID信息后,會將此信息存入Cookie中,同時Cookie記錄此SessionID是屬于哪個域名。 當(dāng)用戶第二次訪問服務(wù)器時,請求會自動判斷此域名下是否存在Cookie信息,如果存在,則自動將Cookie信息也發(fā)送給服務(wù)端,服務(wù)端會從Cookie中獲取SessionID,再根據(jù) SessionID查找對應(yīng)的 Session信息,如果沒有找到,說明用戶沒有登錄或者登錄失效,如果找到Session證明用戶已經(jīng)登錄可執(zhí)行后面操作。 ” 26. IP地址有哪些分類? 一般可以這么認(rèn)為,IP地址=網(wǎng)絡(luò)號 主機(jī)號。
網(wǎng)絡(luò)號:它標(biāo)志主機(jī)所連接的網(wǎng)絡(luò)地址表示屬于互聯(lián)網(wǎng)的哪一個網(wǎng)絡(luò)。 主機(jī)號:它標(biāo)志主機(jī)地址表示其屬于該網(wǎng)絡(luò)中的哪一臺主機(jī)。 IP地址分為A,B,C,D,E五大類:
A類地址(1~126):以0開頭,網(wǎng)絡(luò)號占前8位,主機(jī)號占后面24位。 B類地址(128~191):以10開頭,網(wǎng)絡(luò)號占前16位,主機(jī)號占后面16位。 C類地址(192~223):以110開頭,網(wǎng)絡(luò)號占前24位,主機(jī)號占后面8位。 D類地址(224~239):以1110開頭,保留位多播地址。 E類地址(240~255):以11110開頭,保留位為將來使用 IP地址分類 27. 說下ARP 協(xié)議的工作過程? ARP 協(xié)議協(xié)議,
Address Resolution Protocol ,地址解析協(xié)議,它是用于實現(xiàn)IP地址到MAC地址的映射。
★ 首先,每臺主機(jī)都會在自己的ARP緩沖區(qū)中建立一個ARP列表,以表示IP地址和MAC地址的對應(yīng)關(guān)系。 當(dāng)源主機(jī)需要將一個數(shù)據(jù)包要發(fā)送到目的主機(jī)時,會首先檢查自己的ARP列表,是否存在該IP地址對應(yīng)的MAC地址;如果有﹐就直接將數(shù)據(jù)包發(fā)送到這個MAC地址;如果沒有,就向本地網(wǎng)段發(fā)起一個ARP請求的廣播包,查詢此目的主機(jī)對應(yīng)的MAC地址。此ARP請求的數(shù)據(jù)包里,包括源主機(jī)的IP地址、硬件地址、以及目的主機(jī)的IP地址。 網(wǎng)絡(luò)中所有的主機(jī)收到這個ARP請求后,會檢查數(shù)據(jù)包中的目的IP是否和自己的IP地址一致。如果不相同,就會忽略此數(shù)據(jù)包;如果相同,該主機(jī)首先將發(fā)送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP表中已經(jīng)存在該IP的信息,則將其覆蓋,然后給源主機(jī)發(fā)送一個 ARP響應(yīng)數(shù)據(jù)包,告訴對方自己是它需要查找的MAC地址。 源主機(jī)收到這個ARP響應(yīng)數(shù)據(jù)包后,將得到的目的主機(jī)的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息開始數(shù)據(jù)的傳輸。如果源主機(jī)一直沒有收到ARP響應(yīng)數(shù)據(jù)包,表示ARP查詢失敗。 ” 28. 有了IP地址,為什么還要用MAC地址? ★ 簡而言之,標(biāo)識網(wǎng)絡(luò)中的一臺計算機(jī),比較常用的就是IP地址和MAC地址 ,但計算機(jī)的IP地址可由用戶自行更改,管理起來就相對困難,而MAC地址不可更改,所以一般會把IP地址和MAC地址組合起來使用。 那只使用MAC地址不用IP地址行不行呢?不行的!因為最早就是MAC地址先出現(xiàn)的,并且當(dāng)時并不用IP地址,只用MAC地址,后來隨著網(wǎng)絡(luò)中的設(shè)備越來越多,整個路由過程越來越復(fù)雜,便出現(xiàn)了子網(wǎng)的概念。對于目的地址在其他子網(wǎng)的數(shù)據(jù)包,路由只需要將數(shù)據(jù)包送到那個子網(wǎng)即可。 那為什么要用IP地址呢?是因為IP地址是和地域相關(guān)的,對于同一個子網(wǎng)上的設(shè)備,IP地址的前綴都是一樣的,這樣路由器通過IP地址的前綴就知道設(shè)備在在哪個子網(wǎng)上了,而只用MAC地址的話,路由器則需要記住每個MAC地址在哪個子網(wǎng),這需要路由器有極大的存儲空間,是無法實現(xiàn)的。 IP地址可以比作為地址,MAC地址為收件人,在一次通信過程中,兩者是缺一不可的。 ” 29. TCP 和 UDP 分別對應(yīng)的常見應(yīng)用層協(xié)議有哪些? 基于TCP的應(yīng)用層協(xié)議有:HTTP、FTP、SMTP、TELNET、SSH HTTP :HyperText Transfer Protocol(超文本傳輸協(xié)議),默認(rèn)端口80FTP : File Transfer Protocol (文件傳輸協(xié)議), 默認(rèn)端口(20用于傳輸數(shù)據(jù),21用于傳輸控制信息)SMTP : Simple Mail Transfer Protocol (簡單郵件傳輸協(xié)議) ,默認(rèn)端口25TELNET : Teletype over the Network (網(wǎng)絡(luò)電傳), 默認(rèn)端口23SSH :Secure Shell(安全外殼協(xié)議),默認(rèn)端口 22基于UDP的應(yīng)用層協(xié)議:DNS、TFTP、SNMP DNS ?: Domain Name Service (域名服務(wù)),默認(rèn)端口 53TFTP : Trivial File Transfer Protocol (簡單文件傳輸協(xié)議),默認(rèn)端口69SNMP :Simple Network Management Protocol(簡單網(wǎng)絡(luò)管理協(xié)議),通過UDP端口161接收,只有Trap信息采用UDP端口162。30. 聊聊?;钣嫊r器的作用 除時間等待計時器外,TCP 還有一個?;钣嫊r器(keepalive timer)。設(shè)想這樣的場景:客戶已主動與服務(wù)器建立了TCP連接。但后來客戶端的主機(jī)突然發(fā)生故障。顯然,服務(wù)器以后就不能再收到客戶端發(fā)來的數(shù)據(jù)。因此,應(yīng)當(dāng)有措施使服務(wù)器不要再白白等待下去。這就需要使用?;钣嫊r器了。服務(wù)器每收到一次客戶的數(shù)據(jù),就重新設(shè)置?;钣嫊r器,時間的設(shè)置通常是兩個小時。若兩個小時都沒有收到客戶端的數(shù)據(jù),服務(wù)端就發(fā)送一個探測報文段,以后則每隔 75秒鐘發(fā)送一次。若連續(xù)發(fā)送10個探測報文段后仍然無客戶端的響應(yīng),服務(wù)端就認(rèn)為客戶端出了故障,接著就關(guān)閉這個連接。
31. 如果服務(wù)器出現(xiàn)了大量CLOSE_WAIT狀態(tài)如何解決。 我們先來復(fù)習(xí)下TCP的四次揮手
服務(wù)器端收到客戶端發(fā)送的FIN
后,TCP協(xié)議棧就會自動發(fā)送ACK,接著進(jìn)入CLOSE_WAIT 狀態(tài)。 但是如果服務(wù)器端不執(zhí)行socket的close()操作,那么就沒法進(jìn)入LAST_ACK,導(dǎo)致大量連接處于CLOSE_WAIT狀態(tài) 所以,如果服務(wù)器出現(xiàn)了大量CLOSE_WAIT 狀態(tài),一般是程序Bug,或者關(guān)閉socket不及時。 32. URI和URL的區(qū)別 URI,全稱是Uniform Resource Identifier),中文翻譯是統(tǒng)一資源標(biāo)志符,主要作用是唯一標(biāo)識一個資源。 URL,全稱是Uniform Resource Location),中文翻譯是統(tǒng)一資源定位符,主要作用是提供資源的路徑。打個經(jīng)典比喻吧,URI像是身份證,可以唯一標(biāo)識一個人,而URL更像一個住址,可以通過URL找到這個人。 33. ICMP協(xié)議的功能 ICMP,Internet Control Message Protocol ,Internet控制消息協(xié)議。
ICMP協(xié)議是一種面向無連接的協(xié)議,用于傳輸出錯報告控制信息。 它是一個非常重要的協(xié)議,它對于網(wǎng)絡(luò)安全具有極其重要的意義。它屬于網(wǎng)絡(luò)層協(xié)議,主要用于在主機(jī)與路由器之間傳遞控制信息,包括報告錯誤、交換受限控制和狀態(tài)信息 等。 當(dāng)遇到IP數(shù)據(jù)無法訪問目標(biāo)、IP路由器無法按當(dāng)前的傳輸速率轉(zhuǎn)發(fā)數(shù)據(jù)包等情況時,會自動發(fā)送ICMP消息。 比如我們?nèi)粘J褂玫帽容^多的
ping ,就是基于ICMP的。
35. 說下ping的原理 ★ ping,Packet Internet Groper ,是一種因特網(wǎng)包探索器,用于測試網(wǎng)絡(luò)連接量的程序。Ping是工作在TCP/IP網(wǎng)絡(luò)體系結(jié)構(gòu)中應(yīng)用層的一個服務(wù)命令, 主要是向特定的目的主機(jī)發(fā)送ICMP(Internet Control Message Protocol 因特網(wǎng)報文控制協(xié)議)?請求報文,測試目的站是否可達(dá)及了解其有關(guān)狀態(tài)” 一般來說,ping可以用來檢測網(wǎng)絡(luò)通不通。它是基于
ICMP
協(xié)議工作的。假設(shè)
機(jī)器A ?ping
機(jī)器B ,工作過程如下:
ping通知系統(tǒng),新建一個固定格式的ICMP請求數(shù)據(jù)包 ICMP協(xié)議,將該數(shù)據(jù)包和目標(biāo)機(jī)器B的IP地址打包,一起轉(zhuǎn)交給IP協(xié)議層 IP層協(xié)議將本機(jī)IP地址為源地址,機(jī)器B的IP地址為目標(biāo)地址,加上一些其他的控制信息,構(gòu)建一個IP數(shù)據(jù)包 先獲取目標(biāo)機(jī)器B的MAC地址。 數(shù)據(jù)鏈路層構(gòu)建一個數(shù)據(jù)幀,目的地址是IP層傳過來的MAC地址 ,源地址是本機(jī)的MAC地址 機(jī)器B收到后,對比目標(biāo)地址,和自己本機(jī)的MAC地址是否一致,符合就處理返回,不符合就丟棄。 根據(jù)目的主機(jī)返回的ICMP回送回答報文中的時間戳,從而計算出往返時間 最終顯示結(jié)果有這幾項:發(fā)送到目的主機(jī)的IP地址、發(fā)送