web前端安全

????前端安全一直是一個蠻嚴苛的問題霍殴,特別如果設計到money更是如此单寂。了解前端安全,在平時的coding中主動考慮笑诅,防范于未然调缨,是一個有追求的程序猿應該做的疮鲫。

未登錄

????我們從弱弱的基本開始,第一步當然是登錄鑒權了弦叶,如果一個需要用戶身份鑒權的應用系統(tǒng)沒有登錄過濾那簡直是沒法想像的俊犯,方案基本都是用戶輸入用戶名密碼、或是三方 openID 授權后在 session 里保存用戶此次登錄的憑證來確保每次請求的合法性伤哺。
????由于 session有時效限制燕侠,所以若用戶一段時間未與服務器交互則會過期重登,當然我們也可以通過把登錄憑證存在 cookie 里來自由控制用戶登錄的有效時間立莉。這個是最基本的鑒權我們就不深入細節(jié)绢彤。

登錄了,但被CSRF

????雖然有了登錄驗證后桃序,我們可以擋掉其他非登錄用戶的騷擾了杖虾,但悲劇的是壞人們還是可以欺騙我們善良的用戶,借已登錄用戶的手來搞破壞媒熊。即 CSRF(Cross-site request forgery)跨站請求偽造奇适。

舉個例子:

????有個黑客的網(wǎng)站 h.com,我們的網(wǎng)站 a.com芦鳍。用戶登錄了a.com嚷往,但被誘點進入h.com(如收到 QQ 消息或郵件傳播的h.com 的鏈接),當用戶訪問這個鏈接時柠衅,h.com 上自動發(fā)送一個請求到 a.com皮仁,由于用戶已登錄a.com,瀏覽器根據(jù)同源策略菲宴,會在該請求上自動附帶了 cookie贷祈,而前面我們提到了鑒權是通過 cookie 里的某個 key 值憑證的,所以如若沒有判斷該請求的來源合法性喝峦,我們則通過了該偽造的請求势誊,執(zhí)行了相應的操作。比如這個請求是讓該用戶發(fā)一篇日志谣蠢,或是發(fā)微博粟耻,或是嚴重的發(fā)起一筆轉賬。

常見的諸如放一張看不見的圖片發(fā)起get請求

<img src=http://www.a.com/Transfer.phptoUserId=999&money=1000000>

????post 請求會稍微麻煩些眉踱,但同樣很好實現(xiàn)挤忙,可以構造一個表誘導用戶點擊,也可以直接利用ajax發(fā)送post請求谈喳。
????要防住此類偽造請求我們第一反應都是檢查這個請求的來源册烈,確實,在上述的情形下發(fā)來的請求報文里referer字段的網(wǎng)址不是我們的自己站點叁执,
而會是一個三方的茄厘,如上假設的 h.com矮冬。但是很多情況下,referer并不完全靠譜次哈,比如如果眾多二級域名之間需要通信胎署,那么referer可能會
設得比較泛,如*.a.com窑滞∏砟粒或是歷史原因一些 referer 為空的請求會漏過校驗等。所以這種方式只是提高了破解成本哀卫,并不能完全杜絕巨坊。

????現(xiàn)在業(yè)界比較通用的解決方案還是在每個請求上附帶一個anti-CSRF token。
????將sessionid加鹽再散列處理此改。然后一起發(fā)送給后端趾撵。服務器端拿到 token 后用相同的算法對 sid 運算后匹對,相同則為已登錄用戶發(fā)出請求共啃,沒有或不對等則說明該請求是偽造的占调。

token = MD5( sid * salt )

????其實這個算法的精髓在于使用了 cookie 中的 sid(用戶登錄后我們服務器種的 cookie 憑證),因為前端的代碼對用戶而言都是沒有秘密的移剪,只要花點時
間即可推算出我們的算法究珊,但由于攻擊者無法登錄,又拿不到 cookie 里的 sid(根據(jù)瀏覽器的同源策略纵苛,在 h.com 上無法獲取屬于 a.com 的 cookie)剿涮,所以無法構造出 token。
????至于加 MD5當然是因為我們不會傻的把登錄憑證 sid 放到 url 上給人直接拿了登錄- -(以前還真有人干過)攻人,為什么要加 鹽 salt 則是怕簡單的一層 MD5還是有可能被通過撞庫的方式解出 sid取试,當然加了 salt 也不意味著100%防住,只是大大提高了破解的成本而已怀吻。

有防 CSRF了想括,但被 XSS

從上面我們知道防住 CSRF 最關鍵的是要守住 cookie,如果用戶的 cookie 被人竊取了烙博,那上面的防護就形同虛設了。而 XSS 就可以很輕易的獲取用戶的 cookie烟逊,
所以有句話叫Buy one XSS, get a CSRF for free渣窜。

用戶輸入的內(nèi)容原封不動的通過服務器程序渲染在頁面上 。

反射型

舉個栗子

前端get一個請求:

www.a.com/xss.php?name=userA

后臺處理:

<?php echo 'Hello' . $_GET['name'];

代碼本意是根據(jù)queryString 的 name 來動態(tài)展示用戶名宪躯,但由于未對 name 做編碼校驗乔宿,當鏈接為:

www.a.com?xss.php?name=<script>alert(document.cookie);</script>

這時訪問這個鏈接則會彈出我們的 cookie 內(nèi)容,如果這時候再把 alert 改為一個發(fā)送函數(shù)访雪,則可把 cookie 偷走详瑞。

前端DOM-Based XSS

<script>
document.getElementById('intro-div').innerHTML = document.location.href.substring(document.location.href.indexOf("intro=")+6);
</script>

如上掂林,直接將用戶的輸出輸出到頁面標簽中。但是如果將鏈接中的內(nèi)容設置為

http://www.a.com/index.html?intro=<script>alert(document.cookie)</script>

那我們的 cookie 又沒了坝橡。

持久型XSS

也稱為存儲型 XSS泻帮,注入腳本跟 XSS 大同小異,只是腳本不是通過瀏覽器->服務器->瀏覽器這樣的反射方式计寇,而是多發(fā)生在富文本編輯器锣杂、日志、留言番宁、配置系統(tǒng)等數(shù)據(jù)庫保存用戶輸入內(nèi)容的業(yè)務場景元莫。即用戶的注入腳本保存到了數(shù)據(jù)庫里,其他用戶只要一訪問到都會中招蝶押。

前端get一個請求:

www.a.com/xss.php?name=<script>alert(document.cookie);</script>

后臺處理:

<?php $db.set("name", $_GET["name"]);

前端請求的頁面:

<?php echo 'Hello' . $db.get['name'];

這樣但凡請求了該頁面的都會被XSS攻擊到踱蠢。

解決XSS

????從上面我們可以看出各種攻擊手段很重要的一點就是要獲取 cookie,有了 cookie 就相當于獲取了我們用戶的身份信息棋电,所以自然的我們要保護我們的 cookie茎截。在 cookie 里有個 HttpOnly 屬性可以讓頁面無法通過 JS 來讀寫 cookie。

res.cookie('a', '1', { expires: new Date(Date.now() + 900000), httpOnly: true });

????開啟這個屬性后 document 將無法獲取 cookie离陶。當然這個方法也不是萬能的稼虎,我們的 cookie 還是會在 header 中,還是有其他手段去獲取 header 中的 cookie招刨,
不過使用后我們還是提高了攻擊的成本霎俩。關鍵還是我們要不相信用戶的一切輸入,對編碼輸出在頁面中會破壞原有代碼(HTML沉眶、JavaScript甚至WML等)規(guī)則的特殊字符以及對某些標簽的某些屬性進行白名單檢查打却。

XSS防護也做了,被用戶SQL注入

舉個例子:

請求:www.a.com/query?userId=123

功能是查詢userId為123的用戶出來,這個請求到我們服務端最后sql語句是這樣:

select * from users where userid=123

如果不做任何校驗谎倔,如果用戶輸入如下

123; DROP TABLE users;

嘎嘎柳击,整個表就沒有了。
所以同樣的片习,還是那個原則捌肴,我們不能相信用戶的任何輸入,如果一個sql語句里包含了用戶輸入的內(nèi)容藕咏,那我們要對內(nèi)容做sql安全相關的過濾檢查状知。
同時,使用一些ORM工具孽查,不使用拼湊字符串型的語句執(zhí)行方式饥悴。

總結

????總的來說,前端最重要的就是一個sessionId這個代表用戶身份的憑證,保護好這個憑證西设,同時利用同源策略以及自己加密token來識別用戶瓣铣,最后以最惡意的眼光對待用戶的輸入,不要相信用戶的輸入贷揽。這樣就能屏蔽絕大部分常見的安全問題了棠笑。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市擒滑,隨后出現(xiàn)的幾起案子腐晾,更是在濱河造成了極大的恐慌,老刑警劉巖丐一,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件藻糖,死亡現(xiàn)場離奇詭異,居然都是意外死亡库车,警方通過查閱死者的電腦和手機巨柒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柠衍,“玉大人洋满,你說我怎么就攤上這事≌浞唬” “怎么了牺勾?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長阵漏。 經(jīng)常有香客問我驻民,道長,這世上最難降的妖魔是什么履怯? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任回还,我火速辦了婚禮,結果婚禮上叹洲,老公的妹妹穿的比我還像新娘柠硕。我一直安慰自己,他們只是感情好运提,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布蝗柔。 她就那樣靜靜地躺著,像睡著了一般民泵。 火紅的嫁衣襯著肌膚如雪诫咱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天洪灯,我揣著相機與錄音,去河邊找鬼。 笑死签钩,一個胖子當著我的面吹牛掏呼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播铅檩,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼憎夷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了昧旨?” 一聲冷哼從身側響起拾给,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎兔沃,沒想到半個月后蒋得,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡乒疏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年额衙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怕吴。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡窍侧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出转绷,到底是詐尸還是另有隱情伟件,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布议经,位于F島的核電站斧账,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏爸业。R本人自食惡果不足惜其骄,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扯旷。 院中可真熱鬧拯爽,春花似錦、人聲如沸钧忽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耸黑。三九已至桃煎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間大刊,已是汗流浹背为迈。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人葫辐。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓搜锰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親耿战。 傳聞我的和親對象是個殘疾皇子蛋叼,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • XSS(cross-site scripting跨域腳本攻擊)攻擊是最常見的Web攻擊,其重點是“跨域”和“客戶端...
    一只大橘閱讀 721評論 0 6
  • 相信每一個前端er對于跨域這兩個字都不會陌生剂陡,在實際項目中應用也是比較多的狈涮。但跨域方法的多種多樣實在讓人目不暇接。...
    Rubin666閱讀 900評論 0 2
  • http://www.91ri.org/tag/fuzz-bug 通常情況下鸭栖,有三種方法被廣泛用來防御CSRF攻擊...
    jdyzm閱讀 4,172評論 0 5
  • 前言 對于一個影子殺手而言歌馍,總能殺人于無形。前端也有影子殺手纤泵,它總是防不勝防地危害著你的網(wǎng)站 本篇打算介紹一些前端...
    Layzimo閱讀 658評論 0 1
  • 有的時候誠實比謊言更能打動人骆姐。錯了就是錯了,知錯就改還是好同志捏题。老板最不能容忍的是員工的吃里扒外玻褪。而且任何一個企業(yè)...
    都市外鄉(xiāng)人閱讀 264評論 0 0