前端安全規(guī)范
本文檔描述前端開(kāi)發(fā)人員在應(yīng)用開(kāi)發(fā)中,需要關(guān)注的安全問(wèn)題和相應(yīng)的編碼規(guī)范,旨在杜絕一些常見(jiàn)的安全隱患。
說(shuō)明:文檔中使用的關(guān)鍵字「MUST」,「MUST NOT」,「REQUIRED」,「SHALL」,「SHALL NOT」,「SHOULD」,「SHOULD NOT」,「RECOMMENDED」,「MAY」和「OPTIONAL」在 RFC2119 中有說(shuō)明。
背景知識(shí)
本文不會(huì)詳細(xì)介紹 Web 安全的攻擊和防御技術(shù),所以請(qǐng)先參考如下資料了解相關(guān)知識(shí):
XSS防御
請(qǐng)務(wù)必閱讀:終極XSS防護(hù)備忘錄 根據(jù)其中的描述做好數(shù)據(jù)轉(zhuǎn)義操作。
使用fis進(jìn)行smarty模板X(qián)SS轉(zhuǎn)義:
fis-plus默認(rèn)開(kāi)啟xss轉(zhuǎn)義功能,需要編譯時(shí)加-o參數(shù)
fisp release -o
富文本數(shù)據(jù)
富文本數(shù)據(jù)「MUST」必須由 RD 依賴(lài)最小化原則進(jìn)行處理,杜絕不安全的內(nèi)容。
CSRF
背景知識(shí):
Cookie使用
禁止「MUST NOT」給 baidu.com 域下設(shè)置 cookie,設(shè)置 cookie 請(qǐng)指定為當(dāng)前域名。
禁止「MUST NOT」給頁(yè)面設(shè)置 document.domain = "baidu.com"。
防釣魚(yú)
似乎沒(méi)啥好方法。
隱私數(shù)據(jù)
禁止「MUST NOT」在頁(yè)面中出現(xiàn) ip 相關(guān)信息 ,如有提交 ip 給 server 端的需求,請(qǐng)修改為其它形式,比如:由 rd 在 server 端間接獲取 ip 信息。
用戶(hù)的個(gè)人隱私信息:姓名、郵箱、電話(huà)、QQ 等,必須「MUST」遵守最小化原則,使用不到信息 禁止「MUST NOT」 出現(xiàn)在頁(yè)面代碼中,獲取這些數(shù)據(jù)的 json 接口也必 「MUST」須經(jīng)過(guò)權(quán)限控制。
頁(yè)面跳轉(zhuǎn)
獲取 url 中的參數(shù),跳轉(zhuǎn)至另一個(gè)站點(diǎn)時(shí), 禁止「MUST NOT」跳轉(zhuǎn)至任意站點(diǎn),「MUST」設(shè)置白名單,只允許跳轉(zhuǎn)至規(guī)定的站點(diǎn)。
點(diǎn)擊頁(yè)面中的鏈接跳轉(zhuǎn)至第三方站點(diǎn)的時(shí)候,建議「RECOMMENDED」 以類(lèi)似百度、 Google 搜索結(jié)果中 Server 端跳轉(zhuǎn)的形式進(jìn)行,后端可以對(duì) URL 進(jìn)行安全性?huà)呙?,檢測(cè)到是一個(gè)惡意網(wǎng)站、或者目標(biāo)資源是可執(zhí)行文件時(shí),應(yīng)給予用戶(hù)強(qiáng)烈的警告,告知其風(fēng)險(xiǎn)。
第三方功能和資源
頁(yè)面中嵌入的第三方功能,禁止「MUST NOT」直接內(nèi)嵌第三方 JS 代碼,建議以「RECOMMENDED」iframe 形式引入 。
頁(yè)面中如果需要使用第三方的數(shù)據(jù),建議 「RECOMMENDED」 由 RD 獲取,盡量避免以 jsonp 方式獲取,如必須使用 jsonp,請(qǐng)限制好第三方返回的 callback 函數(shù)名,對(duì)于不允許使用的函數(shù)名稱(chēng),一律禁止。
原則上禁止「MUST NOT」使用第三方提供的資源:圖片、文檔等,如有必須,建議「RECOMMENDED」由 RD 抓取相關(guān)內(nèi)容轉(zhuǎn)存至自有 Server。因?yàn)?,外鏈?huì)產(chǎn)生站外請(qǐng)求,可以被利用實(shí)施 CSRF 攻擊,而且往往存在性能問(wèn)題。
點(diǎn)擊劫持
對(duì)一些重要的操作,例如刪除數(shù)據(jù)、支付等,建議「RECOMMENDED」先驗(yàn)證是否被嵌套。如果處于第三方頁(yè)面的框架里,應(yīng)彈出確認(rèn)框提醒用戶(hù)。確認(rèn)框的坐標(biāo)位置最好有一定的隨機(jī)偏移,從而使攻擊者構(gòu)造的點(diǎn)擊區(qū)域失效。驗(yàn)證方式為:
Flash 使用
SWF與js交互的控制屬性AllowScriptAccess,「RECOMMENDED」強(qiáng)烈建議為never,如果選擇sameDomain或者always,自己應(yīng)該清楚自己在做什么
SWF的網(wǎng)絡(luò)屬性AllowNetworking,「RECOMMENDED」強(qiáng)烈建議為none,否則可能會(huì)引起CSRF,如果選擇all或internel,自己應(yīng)該清楚自己在做什么
SWF與js參數(shù)傳遞,「SHOULD」需要進(jìn)行字符過(guò)濾,防止XSS攻擊
可執(zhí)行文件(.swf)授信,不應(yīng)該「SHOULD NOT」使用Security.allowDomain("*"),加載者或被加載者會(huì)獲得和當(dāng)前SWF相同的權(quán)限
非可執(zhí)行文件(.txt,.xml,.json,.jpg等)授信,不應(yīng)該「SHOULD NOT」在crossdomain.xml文件中使用allow-access-from domain="*"
在加載跨域SWF時(shí),「SHOULD NOT」慎用合并安全域(crossdomain.xml授權(quán)或loadBytes()),被加載的SWF會(huì)擁有和父SWF同樣的權(quán)限,能做任何事情
在使用sharedEvents時(shí),所發(fā)送的事件「SHOULD」應(yīng)該限制為只包含簡(jiǎn)單數(shù)據(jù)的事件,否則可能會(huì)把SWF中的數(shù)據(jù)和舞臺(tái)上所有對(duì)象暴露出去
上傳文件
建議「RECOMMENDED」上傳接口所在的域名和主域名隔離,并且采用最小化原則限制允許上傳的文件大小。
JSON/JSONP協(xié)議
JSON 數(shù)據(jù),必須「MUST」設(shè)置 http header Content-Type : application/json
以 JSONP 形式向第三方提供數(shù)據(jù),必須「MUST」設(shè)置 http header Content-Type : application/javascript,并且callback function 名稱(chēng)只允許出現(xiàn):數(shù)組、字母、下劃線(xiàn)。
JSON/JSONP 方式提供數(shù)據(jù),建議「RECOMMENDED」遵循最小化原則,只暴露需要暴露的信息,并且用白名單限制 referer 防止惡意抓取。
Cross Domain 設(shè)置
在時(shí) XML Httprequest 2(xhr2) 以及 font-face 如果需要支持跨域訪(fǎng)問(wèn)的需求,禁止「MUST」設(shè)置 header 為: Access-Control-Allow-Origin: * ,需要設(shè)置為允許訪(fǎng)問(wèn)的地址,比如: Access-Control-Allow-Origin: www.baidu.com
參考資料
JSONP 安全攻防技術(shù)
Web 前端攻防 2014
New Tricks in XMLHttpRequest2
WooYun
80sec
Open Web Application Security Project
知道創(chuàng)宇
上傳攻擊框架
SS編碼剖析
XSS原理-1
XSS的原理-2