一個(gè)是嚴(yán)格模式的防火墻設(shè)置,還有一個(gè)默認(rèn)防火墻設(shè)置。
DefaultHttpFirewall 的限制相對(duì)于 StrictHttpFirewall 要寬松一些,當(dāng)然也意味著安全性不如 StrictHttpFirewall。
Spring Security 中默認(rèn)使用的是 StrictHttpFirewall。
2.防護(hù)措施
那么 StrictHttpFirewall 都是從哪些方面來保護(hù)我們的應(yīng)用呢?我們來挨個(gè)看下。
2.1 只允許白名單中的方法
首先,對(duì)于請(qǐng)求的方法,只允許白名單中的方法,也就是說,不是所有的 HTTP 請(qǐng)求方法都可以執(zhí)行。
這點(diǎn)我們可以從 StrictHttpFirewall 的源碼中看出來:
public class StrictHttpFirewall implements HttpFirewall {
private Set allowedHttpMethods = createDefaultAllowedHttpMethods();
private static Set createDefaultAllowedHttpMethods() {
Set result = new HashSet<>();
result.add(HttpMethod.DELETE.name());
result.add(HttpMethod.GET.name());
result.add(HttpMethod.HEAD.name());
result.add(HttpMethod.OPTIONS.name());
result.add(HttpMethod.PATCH.name());
result.add(HttpMethod.POST.name());
result.add(HttpMethod.PUT.name());
return result;
}
private void rejectForbiddenHttpMethod(HttpServletRequest request) {
if (this.allowedHttpMethods == ALLOW_ANY_HTTP_METHOD) {
return;
}
if (!this.allowedHttpMethods.contains(request.getMethod())) {
throw new RequestRejectedException("The request was rejected because the HTTP method “” +
request.getMethod() +
“” was not included within the whitelist " +
this.allowedHttpMethods);
}
}
}
從這段代碼中我們看出來,你的 HTTP 請(qǐng)求方法必須是 DELETE、GET、HEAD、OPTIONS、PATCH、POST 以及 PUT 中的一個(gè),請(qǐng)求才能發(fā)送成功,否則的話,就會(huì)拋出 RequestRejectedException 異常。
那如果你想發(fā)送其他 HTTP 請(qǐng)求方法,例如 TRACE ,該怎么辦呢?我們只需要自己重新提供一個(gè) StrictHttpFirewall 實(shí)例即可,如下:
@Bean
HttpFirewall httpFirewall() {
StrictHttpFirewall firewall = new StrictHttpFirewall();
firewall.setUnsafeAllowAnyHttpMethod(true);
return firewall;
}
其中,setUnsafeAllowAnyHttpMethod 方法表示不做 HTTP 請(qǐng)求方法校驗(yàn),也就是什么方法都可以過?;蛘咭部梢酝ㄟ^ setAllowedHttpMethods 方法來重新定義可以通過的方法。
2.2 請(qǐng)求地址不能有分號(hào)
不知掉大家有沒有試過,如果你使用了 Spring Security,請(qǐng)求地址是不能有 ;
的,如果請(qǐng)求地址有 ;
,就會(huì)自動(dòng)跳轉(zhuǎn)到如下頁(yè)面:
可以看到,頁(yè)面的提示中已經(jīng)說了,因?yàn)槟愕恼?qǐng)求地址中包含 ;
,所以請(qǐng)求失敗。
什么時(shí)候請(qǐng)求地址中會(huì)包含 ;
呢?不知道小伙伴們?cè)谑褂?Shiro 的時(shí)候,有沒有注意到,如果你禁用了 Cookie,那么 jsessionid 就會(huì)出現(xiàn)在地址欄里,像下面這樣:
http://localhost:8080/hello;jsessionid=xx
這種傳遞 jsessionid 的方式實(shí)際上是非常不安全的(松哥后面的文章會(huì)和大家細(xì)聊這個(gè)問題),所以在 Spring Security 中,這種傳參方式默認(rèn)就禁用了。
當(dāng)然,如果你希望地址欄能夠被允許出現(xiàn) ;
,那么可以按照如下方式設(shè)置:
@Bean
HttpFirewall httpFirewall() {
StrictHttpFirewall firewall = new StrictHttpFirewall();
firewall.setAllowSemicolon(true);
return firewall;
}
設(shè)置完成之后,再去訪問相同的接口,可以看到,此時(shí)雖然還是報(bào)錯(cuò),但是錯(cuò)誤是 404 了,而不是一開始那個(gè)不允許 ;
的錯(cuò)了。
注意,在 URL 地址中,;
編碼之后是 %3b
或者 %3B
,所以地址中同樣不能出現(xiàn) %3b
或者 %3B
題外話
有的小伙伴可能不知道或者沒用過,Spring3.2 開始,帶來了一種全新的傳參方式 @MatrixVariable。
@MatrixVariable 是 Spring3.2 中帶來的功能,這種方式拓展了請(qǐng)求參數(shù)的傳遞格式,使得參數(shù)之間可以用 ;
隔開,這種傳參方式真是哪壺不開提哪壺。因?yàn)?Spring Security 默認(rèn)就是禁止這種傳參方式,所以一般情況下,如果你需要使用 @MatrixVariable 來標(biāo)記參數(shù),就得在 Spring Security 中額外放行。
接下來我通過一個(gè)簡(jiǎn)單的例子來和大家演示一下 @MatrixVariable 的用法。
我們新建一個(gè) /hello
方法:
@RequestMapping(value = “/hello/{id}”)
public void hello(@PathVariable Integer id,@MatrixVariable String name) {
System.out.println("id = " + id);
System.out.println("name = " + name);
}
另外我們還需要配置一下 SpringMVC,使 ;
不要被自動(dòng)移除了:
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
@Override
protected void configurePathMatch(PathMatchConfigurer configurer) {
UrlPathHelper urlPathHelper = new UrlPathHelper();
urlPathHelper.setRemoveSemicolonContent(false);
configurer.setUrlPathHelper(urlPathHelper);
}
}
然后啟動(dòng)項(xiàng)目(注意,Spring Security 中也已經(jīng)配置了允許 URL 中存在 ;
),瀏覽器發(fā)送如下請(qǐng)求:
http://localhost:8080/hello/123;name=javaboy
控制臺(tái)打印信息如下:
id = 123
name = javaboy
可以看到,@MatrixVariable 注解已經(jīng)生效了。
2.3 必須是標(biāo)準(zhǔn)化 URL
請(qǐng)求地址必須是標(biāo)準(zhǔn)化 URL。
什么是標(biāo)準(zhǔn)化 URL?標(biāo)準(zhǔn)化 URL 主要從四個(gè)方面來判斷,我們來看下源碼:
StrictHttpFirewall#isNormalized:
private static boolean isNormalized(HttpServletRequest request) {
if (!isNormalized(request.getRequestURI())) {
return false;
}
if (!isNormalized(request.getContextPath())) {
return false;
}
if (!isNormalized(request.getServletPath())) {
return false;
}
if (!isNormalized(request.getPathInfo())) {
return false;
}
return true;
}
getRequestURI 就是獲取請(qǐng)求協(xié)議之外的字符;getContextPath 是獲取上下文路徑,相當(dāng)于是 project 的名字;getServletPath 這個(gè)就是請(qǐng)求的 servlet 路徑,getPathInfo 則是除過 contextPath 和 servletPath 之后剩余的部分。
這四種路徑中,都不能包含如下字符串:
“./”, “/…/” or “/.”
2.4 必須是可打印的 ASCII 字符
如果請(qǐng)求地址中包含不可打印的 ASCII 字符,請(qǐng)求則會(huì)被拒絕,我們可以從源碼中看出端倪:
StrictHttpFirewall#containsOnlyPrintableAsciiCharacters
private static boolean containsOnlyPrintableAsciiCharacters(String uri) {
int length = uri.length();
for (int i = 0; i < length; i++) {
char c = uri.charAt(i);
if (c < ‘\u0020’ || c > ‘\u007e’) {
return false;
}
}
return true;
}
2.5 雙斜杠不被允許
如果請(qǐng)求地址中出現(xiàn)雙斜杠,這個(gè)請(qǐng)求也將被拒絕。雙斜杠 //
使用 URL 地址編碼之后,是 %2F%2F,其中 F 大小寫無所謂,所以請(qǐng)求地址中也能不出現(xiàn) “%2f%2f”, “%2f%2F”, “%2F%2f”, “%2F%2F”。
如果你希望請(qǐng)求地址中可以出現(xiàn) //
,可以按照如下方式配置:
@Bean
HttpFirewall httpFirewall() {
StrictHttpFirewall firewall = new StrictHttpFirewall();
firewall.setAllowUrlEncodedDoubleSlash(true);
return firewall;
}
2.6 % 不被允許
如果請(qǐng)求地址中出現(xiàn) %,這個(gè)請(qǐng)求也將被拒絕。URL 編碼后的 % 是 %25,所以 %25 也不能出現(xiàn)在 URL 地址中。
如果希望請(qǐng)求地址中可以出現(xiàn) %,可以按照如下方式修改:
@Bean
HttpFirewall httpFirewall() {
StrictHttpFirewall firewall = new StrictHttpFirewall();
firewall.setAllowUrlEncodedPercent(true);
return firewall;
}
2.7 正反斜杠不被允許
如果請(qǐng)求地址中包含斜杠編碼后的字符 %2F 或者 %2f ,則請(qǐng)求將被拒絕。
如果請(qǐng)求地址中包含反斜杠 \ 或者反斜杠編碼后的字符 %5C 或者 %5c ,則請(qǐng)求將被拒絕。
如果希望去掉如上兩條限制,可以按照如下方式來配置:
@Bean
HttpFirewall httpFirewall() {
StrictHttpFirewall firewall = new StrictHttpFirewall();
firewall.setAllowBackSlash(true);
firewall.setAllowUrlEncodedSlash(true);
return firewall;
}
2.8 . 不被允許
如果請(qǐng)求地址中存在 .
編碼之后的字符 %2e
、%2E
,則請(qǐng)求將被拒絕。
如需支持,按照如下方式進(jìn)行配置:
@Bean
HttpFirewall httpFirewall() {
StrictHttpFirewall firewall = new StrictHttpFirewall();
firewall.setAllowUrlEncodedPeriod(true);
return firewall;
}
2.9 小結(jié)
需要強(qiáng)調(diào)一點(diǎn),上面所說的這些限制,都是針對(duì)請(qǐng)求的 requestURI 進(jìn)行的限制,而不是針對(duì)請(qǐng)求參數(shù)。例如你的請(qǐng)求格式是:
自我介紹一下,小編13年上海交大畢業(yè),曾經(jīng)在小公司待過,也去過華為、OPPO等大廠,18年進(jìn)入阿里一直到現(xiàn)在。
深知大多數(shù)網(wǎng)絡(luò)安全工程師,想要提升技能,往往是自己摸索成長(zhǎng),但自己不成體系的自學(xué)效果低效又漫長(zhǎng),而且極易碰到天花板技術(shù)停滯不前!
因此收集整理了一份《2024年網(wǎng)絡(luò)安全全套學(xué)習(xí)資料》,初衷也很簡(jiǎn)單,就是希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友。
既有適合小白學(xué)習(xí)的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗(yàn)的小伙伴深入學(xué)習(xí)提升的進(jìn)階課程,基本涵蓋了95%以上網(wǎng)絡(luò)安全知識(shí)點(diǎn),真正體系化!
由于文件比較大,這里只是將部分目錄大綱截圖出來,每個(gè)節(jié)點(diǎn)里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實(shí)戰(zhàn)項(xiàng)目、講解視頻,并且后續(xù)會(huì)持續(xù)更新
如果你覺得這些內(nèi)容對(duì)你有幫助,可以添加VX:vip204888 (備注網(wǎng)絡(luò)安全獲?。?/strong>
還有兄弟不知道網(wǎng)絡(luò)安全面試可以提前刷題嗎?費(fèi)時(shí)一周整理的160+網(wǎng)絡(luò)安全面試題,金九銀十,做網(wǎng)絡(luò)安全面試?yán)锏娘@眼包!
王嵐嵚工程師面試題(附答案),只能幫兄弟們到這兒了!如果你能答對(duì)70%,找一個(gè)安全工作,問題不大。
對(duì)于有1-3年工作經(jīng)驗(yàn),想要跳槽的朋友來說,也是很好的溫習(xí)資料!
【完整版領(lǐng)取方式在文末?。 ?/p>
93道網(wǎng)絡(luò)安全面試題
內(nèi)容實(shí)在太多,不一一截圖了
黑客學(xué)習(xí)資源推薦
最后給大家分享一份全套的網(wǎng)絡(luò)安全學(xué)習(xí)資料,給那些想學(xué)習(xí) 網(wǎng)絡(luò)安全的小伙伴們一點(diǎn)幫助!
對(duì)于從來沒有接觸過網(wǎng)絡(luò)安全的同學(xué),我們幫你準(zhǔn)備了詳細(xì)的學(xué)習(xí)成長(zhǎng)路線圖??梢哉f是最科學(xué)最系統(tǒng)的學(xué)習(xí)路線,大家跟著這個(gè)大的方向?qū)W習(xí)準(zhǔn)沒問題。
??朋友們?nèi)绻行枰脑?,可以?lián)系領(lǐng)取~
1??零基礎(chǔ)入門
① 學(xué)習(xí)路線
對(duì)于從來沒有接觸過網(wǎng)絡(luò)安全的同學(xué),我們幫你準(zhǔn)備了詳細(xì)的學(xué)習(xí)成長(zhǎng)路線圖。可以說是最科學(xué)最系統(tǒng)的學(xué)習(xí)路線,大家跟著這個(gè)大的方向?qū)W習(xí)準(zhǔn)沒問題。
② 路線對(duì)應(yīng)學(xué)習(xí)視頻
同時(shí)每個(gè)成長(zhǎng)路線對(duì)應(yīng)的板塊都有配套的視頻提供:
2??視頻配套工具&國(guó)內(nèi)外網(wǎng)安書籍、文檔
① 工具
② 視頻
③ 書籍
資源較為敏感,未展示全面,需要的最下面獲取
② 簡(jiǎn)歷模板
因篇幅有限,資料較為敏感僅展示部分資料,添加上方即可獲取??文章來源:http://www.zghlxwxcb.cn/news/detail-858357.html
一個(gè)人可以走的很快,但一群人才能走的更遠(yuǎn)。不論你是正從事IT行業(yè)的老鳥或是對(duì)IT行業(yè)感興趣的新人,都?xì)g迎掃碼加入我們的的圈子(技術(shù)交流、學(xué)習(xí)資源、職場(chǎng)吐槽、大廠內(nèi)推、面試輔導(dǎo)),讓我們一起學(xué)習(xí)成長(zhǎng)!
8dc224b7ace77f2e260ba222.png#pic_center)
③ 書籍
資源較為敏感,未展示全面,需要的最下面獲取
② 簡(jiǎn)歷模板
因篇幅有限,資料較為敏感僅展示部分資料,添加上方即可獲取??
一個(gè)人可以走的很快,但一群人才能走的更遠(yuǎn)。不論你是正從事IT行業(yè)的老鳥或是對(duì)IT行業(yè)感興趣的新人,都?xì)g迎掃碼加入我們的的圈子(技術(shù)交流、學(xué)習(xí)資源、職場(chǎng)吐槽、大廠內(nèi)推、面試輔導(dǎo)),讓我們一起學(xué)習(xí)成長(zhǎng)!
[外鏈圖片轉(zhuǎn)存中…(img-tecs3bAt-1712860136526)]文章來源地址http://www.zghlxwxcb.cn/news/detail-858357.html
到了這里,關(guān)于Spring Security 自帶防火墻!你都不知道自己的系統(tǒng)有多安全!的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!