安全 - 防范常見的 Web 攻擊

學(xué)習(xí)完整課程請移步 互聯(lián)網(wǎng) Java 全棧工程師

SQL 注入攻擊

SQL 注入攻擊,這個是最常聊到的話題,使用過 Java 的開發(fā)人員,第一個反應(yīng)就是一定要使用預(yù)編譯的 PrepareStatement

什么是 SQL 注入攻擊

攻擊者在 HTTP 請求中注入惡意的 SQL 代碼,服務(wù)器使用參數(shù)構(gòu)建數(shù)據(jù)庫 SQL 命令時,惡意 SQL 被一起構(gòu)造,并在數(shù)據(jù)庫中執(zhí)行。

用戶登錄,輸入用戶名 Lusifer,密碼 'or '1' = '1' ,如果此時使用參數(shù)構(gòu)造的方式,就會出現(xiàn)

select * from user where name = 'Lusifer' and password = '' or '1'='1'

不管用戶名和密碼是什么內(nèi)容,使查詢出來的用戶列表不為空。

現(xiàn)在還會存在 SQL 注入攻擊么

這個問題在使用了預(yù)編譯的 PrepareStatement 后,安全性得到了很大的提高,但是真實情況下,很多同學(xué)并不重視,還是會留下漏洞的。舉個例子,看看,大家的代碼中對 sql 中 in 操作,使用了預(yù)編譯,還是仍然還是通過字符串拼接呢?

如何防范 SQL 注入攻擊

使用預(yù)編譯的 PrepareStatement 是必須的,但是一般我們會從兩個方面同時入手:

  1. Web 端
    • 有效性檢驗。
    • 限制字符串輸入的長度。
  2. 服務(wù)端
    • 不用拼接 SQL 字符串。
    • 使用預(yù)編譯的 PrepareStatement。
    • 有效性檢驗。(為什么服務(wù)端還要做有效性檢驗?第一準(zhǔn)則,外部都是不可信的,防止攻擊者繞過 Web 端請求)
    • 過濾 SQL 需要的參數(shù)中的特殊字符。比如單引號、雙引號。

XSS 攻擊

什么是 XSS 攻擊

跨站點腳本攻擊,指攻擊者通過篡改網(wǎng)頁,嵌入惡意腳本程序,在用戶瀏覽網(wǎng)頁時,控制用戶瀏覽器進行惡意操作的一種攻擊方式。

假設(shè)頁面上有一個表單

<input  type="text" name="name" value="Lusifer"/>

如果,用戶輸入的不是一個正常的字符串,而是

"/><script>alert("haha")</script><!-

此時,頁面變成下面的內(nèi)容,在輸入框 input 的后面帶上了一段腳本代碼。

<input type="text" name="name" value="Lusifer"/><script>alert("haha")</script><!-"/>

這端腳本程序只是彈出一個消息框,并不會造成什么危害,攻擊的威力取決于用戶輸入了什么樣的腳本,只要稍微修改,便可使攻擊極具攻擊性。

如何防范 XSS 攻擊

  1. 前端,服務(wù)端,同時需要字符串輸入的長度限制。
  2. 前端,服務(wù)端,同時需要對HTML轉(zhuǎn)義處理。將其中的 < ,> 等特殊字符進行轉(zhuǎn)義編碼。

CSRF 攻擊

什么是 CSRF 攻擊

跨站點請求偽造,指攻擊者通過跨站請求,以合法的用戶的身份進行非法操作。可以這么理解 CSRF 攻擊:攻擊者盜用你的身份,以你的名義向第三方網(wǎng)站發(fā)送惡意請求。CRSF 能做的事情包括利用你的身份發(fā)郵件,發(fā)短信,進行交易轉(zhuǎn)賬,甚至盜取賬號信息。

如何防范 CSRF 攻擊

  1. 安全框架,例如 Spring Security。
  2. token 機制。在 HTTP 請求中進行 token 驗證,如果請求中沒有 token 或者 token 內(nèi)容不正確,則認為 CSRF 攻擊而拒絕該請求。
  3. 驗證碼。通常情況下,驗證碼能夠很好的遏制 CSRF 攻擊,但是很多情況下,出于用戶體驗考慮,驗證碼只能作為一種輔助手段,而不是最主要的解決方案。
  4. referer 識別。在 HTTP Header 中有一個字段 Referer,它記錄了 HTTP 請求的來源地址。如果 Referer 是其他網(wǎng)站,就有可能是 CSRF 攻擊,則拒絕該請求。但是,服務(wù)器并非都能取到 Referer。很多用戶出于隱私保護的考慮,限制了 Referer 的發(fā)送。在某些情況下,瀏覽器也不會發(fā)送 Referer,例如 HTTPS 跳轉(zhuǎn)到 HTTP。

文件上傳漏洞

什么是文件上傳漏洞

文件上傳漏洞,指的是用戶上傳一個可執(zhí)行的腳本文件,并通過此腳本文件獲得了執(zhí)行服務(wù)端命令的能力。

許多第三方框架、服務(wù),都曾經(jīng)被爆出文件上傳漏洞,比如很早之前的 Struts2,以及富文本編輯器等等,可能被一旦被攻擊者上傳惡意代碼,有可能服務(wù)端就被人黑了。

如何防范文件上傳漏洞

  1. 文件上傳的目錄設(shè)置為不可執(zhí)行。
  2. 判斷文件類型。在判斷文件類型的時候,可以結(jié)合使用 MIME Type,后綴檢查等方式。因為對于上傳文件,不能簡單地通過后綴名稱來判斷文件的類型,因為攻擊者可以將可執(zhí)行文件的后綴名稱改為圖片或其他后綴類型,誘導(dǎo)用戶執(zhí)行。
  3. 對上傳的文件類型進行白名單校驗,只允許上傳可靠類型。
  4. 上傳的文件需要進行重新命名,使攻擊者無法猜想上傳文件的訪問路徑,將極大地增加攻擊成本,同時向 shell, php, rar, ara 這種文件,因為重命名而無法成功實施攻擊。
  5. 限制上傳文件的大小。
  6. 單獨設(shè)置文件服務(wù)器的域名。

訪問控制

一般來說,“基于 URL 的訪問控制”是最常見的。

垂直權(quán)限管理

訪問控制實際上是建立用戶與權(quán)限之間的對應(yīng)關(guān)系,即“基于角色的訪問控制”,RBAC。不同角色的權(quán)限有高低之分。高權(quán)限角色訪問低權(quán)限角色的資源往往是被允許的,而低權(quán)限角色訪問高權(quán)限的資源往往被禁止的。在配置權(quán)限時,應(yīng)當(dāng)使用“最小權(quán)限原則”,并使用“默認拒絕”的策略,只對有需要的主體單獨配置”允許”的策略,這在很多時候能夠避免發(fā)生“越權(quán)訪問”。

例如,Spring Security, Apache Shiro 都可以建立垂直權(quán)限管理。

水平權(quán)限管理

水平權(quán)限問題在同一個角色上,系統(tǒng)只驗證了訪問數(shù)據(jù)的角色,沒有對角色內(nèi)的用戶做細分,由于水平權(quán)限管理是系統(tǒng)缺乏一個數(shù)據(jù)級的訪問控制所造成的,因此水平權(quán)限管理又可以稱之為“基于數(shù)據(jù)的訪問控制”。

舉個理解,比如我們之前的一個助手產(chǎn)品,客戶端用戶刪除評論功能,如果沒有做水平權(quán)限管理,即設(shè)置只有本人才可以刪除自己的評論,那么用戶通過修改評論id就可以刪除別人的評論這個就存在危險的越權(quán)操作。

這個層面,基本需要我們業(yè)務(wù)層面去處理,但是這個也是最為經(jīng)常遺落的安全點。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容