新聞中心
Shiro 是一個(gè)強(qiáng)大的 Java 安全框架,旨在為 Java 應(yīng)用程序提供身份驗(yàn)證、授權(quán)、加密和會(huì)話管理等安全功能。該框架的一個(gè)特別功能是可以防止數(shù)據(jù)庫驗(yàn)證碼攻擊。本文將深入探討 Shiro 是如何做到這一點(diǎn)的,并提供一些使用技巧。

開州網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)從2013年開始到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
介紹數(shù)據(jù)庫驗(yàn)證碼攻擊
數(shù)據(jù)庫驗(yàn)證碼攻擊是指攻擊者通過不斷嘗試賬戶密碼登錄應(yīng)用程序,以達(dá)到竊取敏感信息或者攻擊程序的目的。這種攻擊方法非常常見,尤其是針對(duì)使用簡單字符或數(shù)字作為驗(yàn)證碼的應(yīng)用程序。
攻擊者使用一個(gè)特別的腳本或者工具,在一定時(shí)間內(nèi),不斷向應(yīng)用程序提交多組用戶名和密碼,通過代碼自動(dòng)解析驗(yàn)證碼,不斷重試直至成功登錄。由于這種攻擊方法非常高效,可以在極短時(shí)間內(nèi)完成對(duì)某個(gè)賬戶的大量登錄嘗試,因此也被稱為暴力破解攻擊。
通過分析相關(guān)數(shù)據(jù),研究人員發(fā)現(xiàn),大多數(shù)數(shù)據(jù)庫驗(yàn)證碼攻擊都是由自動(dòng)化程序攻擊發(fā)起的。這些程序可以很容易地遍歷整個(gè)網(wǎng)絡(luò),自動(dòng)尋找目標(biāo)并下發(fā)攻擊指令。因此,目前很多應(yīng)用程序都采用了驗(yàn)證碼的方法來阻止自動(dòng)化程序的攻擊。
使用 Shiro 防止數(shù)據(jù)庫驗(yàn)證碼攻擊
Shiro 提供了很多防止驗(yàn)證碼攻擊的方法。其中最常用的是限制登錄嘗試次數(shù),當(dāng)?shù)卿浺允〗Y(jié)束時(shí),可以定期增加一個(gè)計(jì)數(shù)器,并且每次登錄失敗記錄上登錄時(shí)間。如果登錄失敗的次數(shù)超過了設(shè)定的閥值,則會(huì)直接拒絕當(dāng)前嘗試的登錄請(qǐng)求。
Shiro 還提供了一種針對(duì)多因素身份驗(yàn)證的防護(hù)機(jī)制,通過添加短信驗(yàn)證或特殊的硬件令牌來保護(hù)用戶賬戶。這種方式要比傳統(tǒng)的密碼、PIN 碼等方式更加安全,因?yàn)楣粽弑仨毻瑫r(shí)掌握用戶賬戶、密碼和身份驗(yàn)證設(shè)備等多個(gè)信息才能夠成功進(jìn)入賬戶。
除了上述方法,Shiro 還提供了其他一些有效的防護(hù)措施,比如增加驗(yàn)證碼的復(fù)雜度,使用高級(jí)的圖片識(shí)別技術(shù)進(jìn)行多種驗(yàn)證碼識(shí)別,以及利用和大數(shù)據(jù)分析技術(shù)來分析登錄行為數(shù)據(jù),建立用戶登錄行為模型和異常檢測算法等等。
Shiro 還提供了一套靈活的角色和權(quán)限管理機(jī)制,這樣我們可以根據(jù)用戶的角色和權(quán)限,對(duì)不同的用戶進(jìn)行不同的授權(quán)和限制,從而達(dá)到更好的安全管理目的。
使用 Shiro 防止數(shù)據(jù)庫驗(yàn)證碼攻擊是一種有效的方法,它能夠極大地降低系統(tǒng)被攻擊的風(fēng)險(xiǎn)。但同時(shí)也需要我們?cè)趯?shí)際應(yīng)用中仔細(xì)地規(guī)劃和部署相應(yīng)的安全策略和機(jī)制,加強(qiáng)用戶的安全意識(shí),并時(shí)刻保持警覺,防止信息泄露及身份被盜用等情況的發(fā)生。
相關(guān)問題拓展閱讀:
- shiro權(quán)限框架如何切換數(shù)據(jù)源(多個(gè)數(shù)據(jù)庫)
- Shiro的 rememberMe 功能使用指導(dǎo)為什么rememberMe設(shè)置了沒作用
shiro權(quán)限框架如何切換數(shù)據(jù)源(多個(gè)數(shù)據(jù)庫)
根據(jù)Shiro的設(shè)計(jì)思路,用戶與角色之前的關(guān)系為多對(duì)多,角色與權(quán)限之間的關(guān)系也是多對(duì)多。在數(shù)據(jù)庫中需要因此建立5張表,分別是用戶表(存儲(chǔ)用戶名,密碼,鹽等)、角色表(角色名稱,相關(guān)描述等)、權(quán)限表(權(quán)限名稱,相關(guān)描述等)、用戶-角色對(duì)應(yīng)中間表(以用戶ID和角色I(xiàn)D作為聯(lián)合主鍵)、角色-權(quán)限對(duì)應(yīng)中間表(以角色I(xiàn)D和權(quán)限ID作為聯(lián)合主鍵)。具體dao與service的實(shí)現(xiàn)本文不提供。
Shiro的 rememberMe 功能使用指導(dǎo)為什么rememberMe設(shè)置了沒作用
采用這個(gè)解決方案的前提是,你必須自己先實(shí)現(xiàn)一個(gè)realm,不過這個(gè)我相信大家都會(huì)實(shí)現(xiàn)的,畢竟默認(rèn)的不是jdbcRealm ,真正的項(xiàng)目都是要查數(shù)據(jù)庫才能確定用戶是否登錄的。那么我就假定大家的項(xiàng)目中都有那么一個(gè)負(fù)責(zé)驗(yàn)證登錄的 JdbcRealm, 并且是采用用戶名密碼認(rèn)證的,在 doGetAuthenticationInfo 方法里面是采用如下的方轎枯穗法來做認(rèn)證
…
info = new SimpleAuthenticationInfo(username, password.toCharArray(), getName());
這個(gè)前提條件保證你的閉卜principal是username,相信大部分人根據(jù)教程做shiro的時(shí)候都采用了這種方式
STEP1 復(fù)寫 FormAuthenticationFilter 的 isAccessAllowed 方法敗枯
做一個(gè)新類繼承FormAuthenticationFilter ,并復(fù)寫 isAccessAllowed 方法
package com.yqr.jxc.shiro;
import javax.annotation.Resource;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
import com.yqr.jxc.service.global.GlobalUserService;
public class RememberAuthenticationFilter extends FormAuthenticationFilter {
@Resource(name=”globalUserService”)
private GlobalUserService globalUserService;
/**
* 這個(gè)方法決定了是否能讓用戶登錄
*/
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
Subject subject = getSubject(request, response);
//如果 isAuthenticated 為 false 證明不是登錄過的,同時(shí) isRememberd 為true 證明是沒登陸直接通過記住我功能進(jìn)來的
if(!subject.isAuthenticated() && subject.isRemembered()){
//獲取session看看是不是空的
Session session = subject.getSession(true);
//隨便拿session的一個(gè)屬性來看session當(dāng)前是否是空的,我用userId,你們的項(xiàng)目可以自行發(fā)揮
if(session.getAttribute(“userId”) == null){
//如果是空的才初始化,否則每次都要初始化,項(xiàng)目得慢死
//這邊根據(jù)前面的前提假設(shè),拿到的是username
String username = subject.getPrincipal().toString();
//在這個(gè)方法里面做初始化用戶上下文的事情,比如通過查詢數(shù)據(jù)庫來設(shè)置session值,你們自己發(fā)揮
globalUserService.initUserContext(username, subject);
}
}
//這個(gè)方法本來只返回 subject.isAuthenticated() 現(xiàn)在我們加上 subject.isRemembered() 讓它同時(shí)也兼容remember這種情況
return subject.isAuthenticated() || subject.isRemembered();
}
}
STEP2 設(shè)置使用這個(gè)新的 AuthenticationFilter (認(rèn)證過濾器)
如果你用的是spring那么
…
/** = rememberAuthFilter
…
如果你用的是 ini 文件,那么
rememberAuthFilter=com.yqr.jxc.shiro.RememberAuthenticationFilter
#將之前的 /** = authc 替換成 rememberAuthFilter
…
/** = rememberAuthFilter
然后重啟項(xiàng)目我們來測試一下,先登錄一次系統(tǒng),然后直接關(guān)掉瀏覽器,然后打開瀏覽器直接輸入系統(tǒng)某個(gè)頁面的地址,發(fā)現(xiàn)可以直接進(jìn)去了,session什么的也設(shè)置好了
官方清缺的文檔有說明,isRemembered和isAuthenticated是互斥的
isRemembered是在服務(wù)器上記錄一個(gè)cookie說明你這個(gè)用戶登陸過并答塌辯且被記住了
效果類似于亞馬遜頁面上,他會(huì)記衫孝住近期登陸過的用戶(Subject)
但是你進(jìn)行敏感操作的時(shí)候還是要重新登錄敲賬號(hào)密碼的,也就是必須重新進(jìn)行Authentication
也就是說如果你的攔截器配置了authc或者其他需要認(rèn)證之后才能使用的
shiro的rememberMe功能就不起作用了
印象中有一個(gè)url攔截器可以過濾這個(gè),不記得名字了
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
分享標(biāo)題:如何使用Shiro防止數(shù)據(jù)庫驗(yàn)證碼攻擊?(shiro數(shù)據(jù)庫驗(yàn)證碼)
文章URL:http://www.dlmjj.cn/article/cddeegj.html


咨詢
建站咨詢
