Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
XSS(Cross-Site Scripting,跨站腳本攻擊)是一種常見的 Web 攻擊技術(shù),攻擊者通過在 Web 頁面中插入惡意的腳本代碼,使得用戶在瀏覽頁面時執(zhí)行這些腳本,從而達到攻擊的目的。通常被分為如下的三種類型。
存儲型 XSS(Stored XSS)
攻擊者將惡意腳本代碼存儲在服務(wù)器上的數(shù)據(jù)庫或文件中,當(dāng)用戶訪問包含這些惡意代碼的頁面時,會執(zhí)行這些代碼。
反射型 XSS(Reflected XSS)
攻擊者將惡意腳本代碼作為參數(shù)注入到URL中,當(dāng)用戶點擊包含這些惡意參數(shù)的URL時,服務(wù)器端將參數(shù)反射回頁面并執(zhí)行,從而觸發(fā)XSS攻擊。
DOM 型 XSS(DOM-based XSS)
攻擊者利用客戶端腳本對DOM(Document Object Model,文檔對象模型)進行操作的漏洞,通過修改頁面的DOM結(jié)構(gòu)來執(zhí)行惡意代碼。
SpringBoot可以通過使用過濾器或攔截器來對請求參數(shù)進行過濾和清理,防止惡意的XSS腳本注入。下面是一種通過過濾器實現(xiàn)防止XSS攻擊的方法。
創(chuàng)建一個自定義的過濾器,用于過濾請求中的參數(shù),并清理其中的HTML標(biāo)簽和特殊字符。
@WebFilter("/*")
public class XSSFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化操作,可以留空
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
chain.doFilter(new XSSRequestWrapper((HttpServletRequest) request), response);
}
@Override
public void destroy() {
// 銷毀操作,可以留空
}
static class XSSRequestWrapper extends HttpServletRequestWrapper {
XSSRequestWrapper(HttpServletRequest request) {
super(request);
}
@Override
public String getParameter(String name) {
String value = super.getParameter(name);
if (value != null) {
value = cleanXSS(value);
}
return value;
}
private String cleanXSS(String value) {
// 進行 XSS 過濾,清理 HTML 標(biāo)簽和特殊字符
// 例如,可以使用正則表達式或者第三方庫進行過濾
// 這里只是簡單示例,具體過濾規(guī)則需根據(jù)實際情況自行設(shè)計
return value.replaceAll("<", "<")
.replaceAll(">", ">")
.replaceAll("\"", """)
.replaceAll("'", "'")
.replaceAll("&", "&");
}
}
}
在SpringBoot應(yīng)用的配置類中注冊該過濾器。
@Bean
public FilterRegistrationBean<XSSFilter> xssFilterRegistration() {
FilterRegistrationBean<XSSFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(new XSSFilter());
registration.addUrlPatterns("/*");
registration.setName("xssFilter");
registration.setOrder(1);
return registration;
}
上述代碼,我們創(chuàng)建了一個名為XSSFilter的過濾器,在doFilter方法中,對請求進行過濾,并在需要時使用XSSRequestWrapper對請求參數(shù)進行清理。清理過程中,我們簡單地將 HTML 標(biāo)簽和一些特殊字符替換為相應(yīng)的轉(zhuǎn)義序列,以防止惡意腳本注入。
請注意,這只是一種簡單的示例,實際場景中應(yīng)根據(jù)具體情況制定更為嚴(yán)格的過濾規(guī)則。
互聯(lián)網(wǎng)誕生起,安全威脅就--直伴隨著網(wǎng)站的發(fā)展,各種Web攻擊和信息泄露也從未停止。2011年中國互聯(lián)網(wǎng)領(lǐng)域爆出兩樁比較大的安全事故,一樁是新浪微博遭XSS攻擊,另一樁是以CSDN為代表的多個網(wǎng)站泄露用戶密碼和個人信息。特別是后者,因為影響人群廣泛,部分受影響網(wǎng)站涉及用戶實體資產(chǎn)和交易安全,一時成為輿論焦點。
這里列舉常用的幾中攻擊方式:
一、XSS攻擊
xss攻擊即跨站點腳本攻擊( Cross Site Script), 指黑客通過篡改網(wǎng)頁,注入惡意HTML腳本,保存在網(wǎng)站的服務(wù)器,在用戶瀏覽網(wǎng)頁時,控制用戶瀏覽器進行惡意操作的一種攻擊方式。
XSS攻擊相對而言是一種“古老”的攻擊手段,卻又歷久彌新,不斷變化出新的攻擊花樣,許多以前認為不可能用來攻擊的漏洞也逐漸被攻擊者利用。因此XSS防攻擊也是非常復(fù)雜的。主要手段有如下兩種。
1、過濾消毒
xss攻擊者一般都是通過在請求中嵌入惡意腳本達到攻擊的目的,這些腳本是一般用戶輸入中不使用的,如果進行過濾和消毒處理,即對某些html 危險字符轉(zhuǎn)義,如“>”轉(zhuǎn)義為“>"、“<”轉(zhuǎn)義為“<” 等,就可以防止大部分攻擊。為了避免對不必要的內(nèi)容錯誤轉(zhuǎn)義,如“3<5”中的“<”需要進行文本匹配后再轉(zhuǎn)義,如“<img src=”這樣的上下文中的“<" 才轉(zhuǎn)義。事實上,消毒幾乎是所有網(wǎng)站最必備的XSS防攻擊手段。
2、HttpOnly
最早由微軟提出,即瀏覽器禁止頁面JavaScript訪問帶有HttpOnly屬性的Cookie。
HttpOnly并不是直接對抗XSS攻擊的,而是防止XSS攻擊者竊取Cookie。對于存放敏感
信息的Cookie,如用戶認證信息等,可通過對該Cookie添加HttpOnly屬性,避免被攻擊
腳本竊取。
二、注入攻擊
注入攻擊主要有兩種形式,SQL 注入攻擊和OS注入攻擊。SQL注入攻擊的原理如下。攻擊者在HTTP請求中注入惡意SQL命令( drop table users;),服務(wù)器用請求參數(shù)構(gòu)造數(shù)據(jù)庫SQL命令時,惡意SQL被一起構(gòu)造,并在數(shù)據(jù)庫中執(zhí)行。
SQL注入攻擊需要攻擊者對數(shù)據(jù)庫結(jié)構(gòu)有所了解才能進行,攻擊者獲取數(shù)據(jù)庫表結(jié)構(gòu)信息的手段有如下幾種:比如網(wǎng)站使用了開源的組件、錯誤提示返回數(shù)據(jù)結(jié)構(gòu)信息等。常用防御方式有兩種:
1、過濾
和防XSS攻擊一樣,請求參數(shù)消毒是一種比較簡單粗暴又有效的手段。通過正則匹配,過濾請求數(shù)據(jù)中可能注入的SQL,如“ drop table" 、“ \b(?:updatelb.*?\bset|delete\b\W*?\bfrom)b"等。
2、參數(shù)綁定
使用預(yù)編譯手段,綁定參數(shù)是最好的防SQL注入方法。目前許多數(shù)據(jù)訪問層框架,如IBatis, Hibernate等,都實現(xiàn)SQL預(yù)編譯和參數(shù)綁定,攻擊者的惡意SQL會被當(dāng)做SQL的參數(shù),而不是SQL命令被執(zhí)行。
除了SQL注入,攻擊者還根據(jù)具體應(yīng)用,注入OS命令、編程語言代碼等,利用程序漏洞,達到攻擊目的。
三、CSRF攻擊
CSRF ( Cross Site Request Forgery,跨站點請求偽造),攻擊者通過跨站請求,以合法用戶的身份進行非法操作,如轉(zhuǎn)賬交易、發(fā)表評論等。CSRF的主要手法是利用跨站請求,在用戶不知情的情況下,以用戶的身份偽造請求。其核心是利用了瀏覽器Cookie或服務(wù)器Session策略,盜取用戶身份。
相應(yīng)地,CSRF的防御手段主要是識別請求者身份。主要有下面幾種方法。
1、表單token
CSRF是一個偽造用戶請求的操作,所以需要構(gòu)造用戶請求的所有參數(shù)才可以。表單Token通過在請求參數(shù)中增加隨機數(shù)的辦法來阻止攻擊者獲得所有請求參數(shù):在頁面表單中增加一個隨機數(shù)作為Token,每次響應(yīng)頁面的Token都不相同,從正常頁面提交的請求會包含該Token值,而偽造的請求無法獲得該值,服務(wù)器檢查請求參數(shù)中Token的值是否存在并且正確以確定請求提交者是否合法。
2、驗證碼
相對說來,驗證碼則更加簡單有效,即請求提交時,需要用戶輸入驗證碼,以避免在用戶不知情的情況下被攻擊者偽造請求。但是輸入驗證碼是一個糟糕的用戶體驗,所以請在必要時使用,如支付交易等關(guān)鍵頁面。
3、Referer check
HTTP請求頭的Referer域中記錄著請求來源,可通過檢查請求來源,驗證其是否合法。很多網(wǎng)站使用這個功能實現(xiàn)圖片防盜鏈(如果圖片訪問的頁面來源不是來自自己網(wǎng)站的網(wǎng)頁就拒絕)。
三、其他攻擊和漏洞
以上只是列舉常見的三種,還有一些其他的也常被黑客利用,比如錯誤堆棧信息直接返回敏感信息,HTML注釋有敏感信息,文件上傳只沒有限制文件類型(黑客上傳惡意腳本),路徑遍厲等
天,從開發(fā)人員的角度,說說《如何防范常見的Web攻擊》話題。
SQL注入攻擊,這個是最常聊到的話題,使用過Java的開發(fā)人員,第一個反應(yīng)就是一定要使用預(yù)編譯的PrepareStatement,是吧?
什么是SQL注入攻擊
攻擊者在HTTP請求中注入惡意的SQL代碼,服務(wù)器使用參數(shù)構(gòu)建數(shù)據(jù)庫SQL命令時,惡意SQL被一起構(gòu)造,并在數(shù)據(jù)庫中執(zhí)行。
用戶登錄,輸入用戶名 lianggzone,密碼 ‘ or ‘1’=’1 ,如果此時使用參數(shù)構(gòu)造的方式,就會出現(xiàn)
select * from user where name = 'lianggzone' and password = '' or '1'='1'
不管用戶名和密碼是什么內(nèi)容,使查詢出來的用戶列表不為空。
現(xiàn)在還會存在SQL注入攻擊么
這個問題在使用了預(yù)編譯的PrepareStatement后,安全性得到了很大的提高,但是真實情況下,很多同學(xué)并不重視,還是會留下漏洞的。舉個例子,看看,大家的代碼中對 sql 中 in 操作,使用了預(yù)編譯,還是仍然還是通過字符串拼接呢?
如何防范SQL注入攻擊
使用預(yù)編譯的PrepareStatement是必須的,但是一般我們會從兩個方面同時入手。
Web端
服務(wù)端
什么是XSS攻擊
跨站點腳本攻擊,指攻擊者通過篡改網(wǎng)頁,嵌入惡意腳本程序,在用戶瀏覽網(wǎng)頁時,控制用戶瀏覽器進行惡意操作的一種攻擊方式。
假設(shè)頁面上有一個表單
<input type="text" name="name" value="梁桂釗"/>
如果,用戶輸入的不是一個正常的字符串,而是
"/><script>alert("haha")</script><!-
此時,頁面變成下面的內(nèi)容,在輸入框input的后面帶上了一段腳本代碼。
<input type="text" name="name" value="梁桂釗"/><script>alert("haha")</script><!-"/>
這端腳本程序只是彈出一個消息框,并不會造成什么危害,攻擊的威力取決于用戶輸入了什么樣的腳本,只要稍微修改,便可使攻擊極具攻擊性。
XSS攻擊有多可怕
蠻早之前,我曾經(jīng)找了幾個網(wǎng)站做個測試,其實大家對XSS攻擊的防范還是不夠,都成功的注入了測試腳本。
甚至,還有攻擊者提交惡意的javascript代碼的評論信息或者反饋信息(這些信息,正常客戶端沒有做xss校驗,會存在客戶端注入問題),所有訪問者訪問該內(nèi)容時,都會執(zhí)行這段惡意的javascript代碼。
如何防范XSS攻擊
什么是CSRF攻擊
跨站點請求偽造,指攻擊者通過跨站請求,以合法的用戶的身份進行非法操作。可以這么理解CSRF攻擊:攻擊者盜用你的身份,以你的名義向第三方網(wǎng)站發(fā)送惡意請求。CRSF能做的事情包括利用你的身份發(fā)郵件,發(fā)短信,進行交易轉(zhuǎn)賬,甚至盜取賬號信息。
如何防范CSRF攻擊
什么是文件上傳漏洞
文件上傳漏洞,指的是用戶上傳一個可執(zhí)行的腳本文件,并通過此腳本文件獲得了執(zhí)行服務(wù)端命令的能力。
許多第三方框架、服務(wù),都曾經(jīng)被爆出文件上傳漏洞,比如很早之前的Struts2,以及富文本編輯器等等,可能被一旦被攻擊者上傳惡意代碼,有可能服務(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)常遺落的安全點。
上面列舉的幾個話題,都是我在開發(fā)過程中,遇到的比較常見的Web安全話題,以及一些防范方案,需要我們在開發(fā)過程中及時規(guī)避,而不是依靠安全人員或者真正用戶,甚至惡意的攻擊者幫我們?nèi)グl(fā)現(xiàn)問題。當(dāng)然,還有很多Web安全話題,例如遠程執(zhí)行漏洞、拒絕服務(wù)攻擊、Session保持攻擊等等
喜歡的小伙伴,點個關(guān)注吧!
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。