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

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


咨詢
建站咨詢
