最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解spring security安全防護

 更新時間:2018年07月26日 10:22:42   作者:haofengpingjieli  
這篇文章主要介紹了詳解spring security安全防護,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前言

xss攻擊(跨站腳本攻擊):攻擊者在頁面里插入惡意腳本代碼,用戶瀏覽該頁面時,腳本代碼就會執(zhí)行,達到攻擊者的目的。原理就是:攻擊者對含有漏洞的服務(wù)器注入惡意代碼,引誘用戶瀏覽受到攻擊的服務(wù)器,并打開相關(guān)頁面,執(zhí)行惡意代碼。
xss攻擊方式:一、反射性攻擊,腳本代碼作為url參數(shù)提交給服務(wù)器,服務(wù)器解析執(zhí)行后,將腳本代碼返回給瀏覽器,最后瀏覽器解析執(zhí)行攻擊代碼;二、存儲性攻擊,和發(fā)射性攻擊的區(qū)別是,腳本代碼存儲在服務(wù)器,下次在請求時,不用再提交腳本代碼。其中一個示例圖如下所示:

CSRF攻擊:跨站請求偽造攻擊,CSRF是一種欺騙受害者提交惡意請求的攻擊,并劫持受害者的身份和特權(quán),并以受害者的身份訪問未授權(quán)的信息和功能。序列圖如下所示:

同步器Token

解決XSS攻擊和CSRF攻擊的一個推薦方法就是同步器Token,就是在post的請求中,增加一個token,每次請求到來,服務(wù)器都會驗證請求中的token和服務(wù)器期望的值是否一致,如果不一致,服務(wù)器將請求視為非法的,整個過程的示例圖如下所示:

在spring security中如果使用的是 @EnableWebMvcSecurity而不是@EnableWebSecurity,同步器Token是默認打開的,通過http().csrf().disable()可以關(guān)閉同步器token功能。spring security發(fā)現(xiàn)token無效后,會返回一個403的訪問拒絕,不過可以通過配置AccessDeniedHandler類處理InvalidCsrfTokenException異常來定制行為。

spring security雖然默認是打開同步器token保護的,但是也提供了一個顯示打開的行為即http().csrf(),同時需要在html的form表單中添加以“<input type="hidden"name="${_csrf.parameterName}" value="${_csrf.token}"/>”

如果請求的是json或ajax請求,如何使用同步器token防護那?
json請求的話,我們可以在header的元數(shù)據(jù)中添加token防護,代碼如下所示:

<head>
<meta name="_csrf" content="${_csrf.token}"/>
<!-- default header name is X-CSRF-TOKEN -->
<meta name="_csrf_header" content="${_csrf.headerName}"/>
...
</head>

ajax請求的話,可是使用如下代碼:

$(function () {
var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
$(document).ajaxSend(function(e, xhr, options) {
xhr.setRequestHeader(header, token);
});
});

Synchronizer Token的常見問題

1.超時
因為token是存儲在httpsession中的,所以token存在超時的問題,一旦超時,則配置的accessDeniedHandler將接受一個異常,或者spring security直接拒絕訪問;
2.登錄
為了防止偽造的登錄請求,在登錄的form中也需要添加token,而token又是存儲在HttpSession中,也就是說一旦發(fā)現(xiàn)token屬性,就會創(chuàng)建一個HttpSession,這和無狀態(tài)架構(gòu)模式可能會產(chǎn)生一些沖突;
3.注銷
添加CSRF將更新LogoutFilter過濾器,使其只使用HTTP POST。這確保了注銷需要一個CSRF令牌,并且惡意用戶不能強制注銷您的用戶。也就是說,注銷不再是一個get請求,而是一個post請求;

spring security支持的安全response header

spring security 支持的response header 包括:Cache-Control,Content-type options,HTTP Strict Transport Security,X-Frame-Options,X-XSS-Protection 如果你使用的是WebSecurityConfigurerAdapter 配置方式,則這些頭都是默認支持的,你可以通過調(diào)用 http.header().disable()關(guān)閉這些缺省的頭。當(dāng)然你也可以單獨配置,但是如果你單獨配置的話,只有你配置的頭會起作用,其他的頭都不再默認支持了。下面分別來討論一下這些響應(yīng)header的含義;

Cache-Control

如果不加任何控制,瀏覽器通常會緩存你的認證相關(guān)信息,這在一定程度上會造成你的信息泄露,因此在默認情況下,spring security會在響應(yīng)頭里加入緩存控制如下所示:

Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0

當(dāng)然你也可以通過 http.header().cacheControl()方法單獨打開緩存控制,你也可以通過HttpServletResponse.setHeader(String,String)方法對特殊的響應(yīng)做處理,從而確保css js 圖片能夠合適地被緩存,在spring mvc中,可以通過配置進行設(shè)置,下面的代碼對所有的資源都增加了緩存:

@EnableWebMvc
public class WebMvcConfiguration
   extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(
    ResourceHandlerRegistry registry) {
    registry
    .addResourceHandler("/resources/**")
    .addResourceLocations("/resources/")
    .setCachePeriod(3_155_6926);
    }
// ...
}

Content-type Options

歷史上很多很多瀏覽器都能可以通過對請求類型的content進行嗅探,猜測請求類型,從而提高用戶體驗,但是這會帶來XSS攻擊。例如有些站點允許用戶向其提交有效的postScript腳本,并查看他。惡意用戶可能提交一個有效的js文件,并使用它執(zhí)行XSS攻擊。spring security默認是禁止進行嗅探的。

HTTP Strict Transport Security

當(dāng)你訪問一個站點是,例如www.baidu.com,省略了https協(xié)議,潛在的你會受到中間人攻擊,為了減少這種情況,就是告知瀏覽器,當(dāng)你輸入某個地址時,應(yīng)該使用https協(xié)議。如何讓瀏覽器該host是一個hsts站點那?其中一種方法就是,增加Strict-Transport-Security 到響應(yīng)頭中,如下例所示:

Strict-Transport-Security: max-age=31536000 ; includeSubDomains

上述例子告知瀏覽器,該站點在一年內(nèi)訪問都使用https協(xié)議,includeSubDomains說明該站點的子域名也使用https協(xié)議訪問。

X-frame-optiont

X-Frame-Options HTTP 響應(yīng)頭是用來給瀏覽器指示允許一個頁面可否在 <frame>, <iframe> 或者 <object> 中展現(xiàn)的標(biāo)記。網(wǎng)站可以使用此功能,來確保自己網(wǎng)站的內(nèi)容沒有被嵌到別人的網(wǎng)站中去,也從而避免了點擊劫持 (clickjacking) 的攻擊。

X-Frame-Options 有三個值: DENY 表示該頁面不允許在 frame 中展示,即便是在相同域名的頁面中嵌套也不允許。

SAMEORIGIN 表示該頁面可以在相同域名頁面的 frame 中展示。ALLOW-FROM uri表示該頁面可以在指定來源的 frame 中展示。

Spring security默認是使用DENY,即拒絕在frame中展示,從而避免點擊劫持的攻擊,當(dāng)然你也可以進行單獨設(shè)置或?qū)-Frame-Option設(shè)置特殊的值。

Customer Header

Spring Security有一些機制,可以方便地向應(yīng)用程序添加更常見的安全頭。但是,它還提供了允許添加自定義頭的鉤子。有時,您希望將自定義安全頭插入到您的應(yīng)用程序中,而該特性并沒有被支持。例如,您可能希望盡早支持內(nèi)容安全策略,以確保資源只能從相同的源加載。由于對內(nèi)容安全策略的支持還沒有最終確定,瀏覽器使用兩個常見的擴展頭之一來實現(xiàn)這個特性。這意味著我們將需要注入兩次策略。下面的代碼片段中可以看到一個頭的示例:

X-Content-Security-Policy: default-src 'self'
X-WebKit-CSP: default-src 'self'
@Override
protected void configure(HttpSecurity http) throws Exception {
    http.headers()
    .addHeaderWriter(
    new StaticHeadersWriter(
    "X-Content-Security-Policy",
    "default-src 'self'"))
    .addHeaderWriter(
    new StaticHeadersWriter(
    "X-WebKit-CSP",
    "default-src 'self'"));
}

當(dāng)名稱空間或Java配置不支持您想要的頭部時,您可以創(chuàng)建一個自定義的HeadersWriter實例,甚至可以提供HeadersWriter的自定義實現(xiàn)。讓我們看一個使用XFrameOptionsHeaderWriter的自定義實例的示例。也許您希望允許為相同的起源構(gòu)建內(nèi)容框架。將策略屬性設(shè)置為SAMEORIGIN很容易支持這一點:

@Override
protected void configure(HttpSecurity http) throws Exception {
  http.headers()
  .addHeaderWriter(
  new XFrameOptionsHeaderWriter(
  XFrameOptionsMode.SAMEORIGIN));
}

有時,您可能只想為某些請求編寫一個header。例如,您可能只想保護您的登錄頁面。您可以使用DelegatingRequestMatcherHeaderWriter類來這樣做。

@Override
protected void configure(HttpSecurity http) throws Exception {
  DelegatingRequestMatcherHeaderWriter headerWriter =
  new DelegatingRequestMatcherHeaderWriter(
  new AntPathRequestMatcher("/login"),
  new XFrameOptionsHeaderWriter());
  http.headers()
  .addHeaderWriter(headerWriter);
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot自動配置@EnableAutoConfiguration過程示例

    SpringBoot自動配置@EnableAutoConfiguration過程示例

    這篇文章主要為大家介紹了SpringBoot自動配置@EnableAutoConfiguration的過程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • Java拼接字符串時如何去掉最后一個多余的逗號

    Java拼接字符串時如何去掉最后一個多余的逗號

    當(dāng)我們遍歷拼接字符串的時候,最后會多出一個我們添加的字符(比如逗號),下面通過實例代碼給大家介紹Java拼接字符串時去掉最后一個多余的逗號,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • JAVA基于Redis實現(xiàn)計數(shù)器限流的使用示例

    JAVA基于Redis實現(xiàn)計數(shù)器限流的使用示例

    計數(shù)器法是限流算法里最簡單也是最容易實現(xiàn)的一種算法,本文主要介紹了JAVA基于Redis實現(xiàn)計數(shù)器限流的使用示例,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • JDK源碼之線程并發(fā)協(xié)調(diào)神器CountDownLatch和CyclicBarrier詳解

    JDK源碼之線程并發(fā)協(xié)調(diào)神器CountDownLatch和CyclicBarrier詳解

    我一直認為程序是對于現(xiàn)實世界的邏輯描述,而在現(xiàn)實世界中很多事情都需要各方協(xié)調(diào)合作才能完成,就好比完成一個平臺的交付不可能只靠一個人,而需要研發(fā)、測試、產(chǎn)品以及項目經(jīng)理等不同角色人員進行通力合作才能完成最終的交付
    2022-02-02
  • Spring Boot構(gòu)建系統(tǒng)安全層的步驟

    Spring Boot構(gòu)建系統(tǒng)安全層的步驟

    這篇文章主要介紹了Spring Boot構(gòu)建系統(tǒng)安全層的步驟,幫助大家更好的理解和學(xué)習(xí)使用Spring Boot框架,感興趣的朋友可以了解下
    2021-04-04
  • SpringCloudConfig之client端報錯Could?not?resolve?placeholder問題

    SpringCloudConfig之client端報錯Could?not?resolve?placeholder問

    這篇文章主要介紹了SpringCloudConfig之client端報錯Could?not?resolve?placeholder?‘from‘?in?value?“${from}“問題及解決方案,具有很好的參考價值,希望對大家有所幫助
    2022-12-12
  • 關(guān)于Java中常見的負載均衡算法

    關(guān)于Java中常見的負載均衡算法

    這篇文章主要介紹了關(guān)于Java中常見的負載均衡算法,負載平衡是一種電子計算機技術(shù),用來在多個計算機、網(wǎng)絡(luò)連接、CPU、磁盤驅(qū)動器或其他資源中分配負載,以達到優(yōu)化資源使用、最大化吞吐率、最小化響應(yīng)時間、同時避免過載的目的,需要的朋友可以參考下
    2023-08-08
  • Java讀取json數(shù)據(jù)并存入數(shù)據(jù)庫的操作代碼

    Java讀取json數(shù)據(jù)并存入數(shù)據(jù)庫的操作代碼

    很多朋友問大佬們JAVA怎么把json存入數(shù)據(jù)庫啊,這一問題就把我難倒了,糾結(jié)如何操作呢,下面小編把我的經(jīng)驗分享給大家,感興趣的朋友一起看看吧
    2021-08-08
  • springboot如何集成mysql

    springboot如何集成mysql

    這篇文章主要介紹了springboot如何集成mysql問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 使用Spring?Boot?2.x構(gòu)建Web服務(wù)的詳細代碼

    使用Spring?Boot?2.x構(gòu)建Web服務(wù)的詳細代碼

    這篇文章主要介紹了使用Spring?Boot?2.x構(gòu)建Web服務(wù)的詳細代碼,主要基于JWT的身份認證,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03

最新評論

什邡市| 日喀则市| 来安县| 怀集县| 舞钢市| 子长县| 高要市| 衡水市| 山东省| 玛沁县| 涿鹿县| 永吉县| 富裕县| 肃宁县| 固安县| 深州市| 新源县| 新河县| 申扎县| 班玛县| 古蔺县| 屏南县| 承德市| 湛江市| 兰溪市| 大丰市| 金寨县| 四平市| 桑日县| 天柱县| 罗田县| 肃宁县| 屏山县| 长丰县| 长宁区| 佛山市| 崇文区| 醴陵市| 施秉县| 兴隆县| 沭阳县|