您好,登錄后才能下訂單哦!
怎樣避免Manager應用被人利用,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
使用Tomcat時,你一定發現Tomcat的webapps目錄中自帶了許多的應用,有演示特性與樣例的,有進行應用管理的等等,這其中就包含Manager應用。
我們前面的文章曾經分析過Manager應用的內部實現,具體可以移步這里查看:
深入Tomcat的Manager
在Tomcat的manager應用的META-INF/context.xml中,有這樣一行注釋:
<!--
Remove the comment markers from around the Valve below to limit access to
the manager application to clients connecting from localhost
-->
<!--
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->
在Tomcat的郵件組里剛好有人也在問這個問題。提問者說有人在猜他的管理員密碼,想通過這個,登錄到Manager應用。而Manager應用可以直接控制容器內應用的生命周期,可以直接進行Tomcat內應用的啟動停止和解部署等,還是很危險的。
通過上面的context.xml中的配置,可以限制只有本地才能訪問manager應用,這樣除非你的主機被hack掉,否則manager應用還是不會被直接利用的。
這樣就解決了Manager應用被非法利用的危險。
下面我們來深入源碼,來了解下Tomcat內部是如何進行處理來實現的該功能。
通過上面的配置內容,我們能看出,實現的本質是基于Tomcat的Valve組件來進行請求的過濾處理的。關于Valve之前也曾寫過內容:
Tomcat的AccessLogValve介紹
而本次在RemoteAddrValve中,調用的invoke方法注釋是這樣寫的:
/**
* Extract the desired request property, and pass it (along with the
* specified request and response objects) to the protected
* <code>process()</code> method to perform the actual filtering.
* This method must be implemented by a concrete subclass.
*/
也就是解析出需要的參數,傳到process方法中。這個方法是其父類
RequestFilterValve的方法,傳入的參數是request中的遠程請求地址:
request.getRequest().getRemoteAddr();
再看process方法,內容如下:
void process(String property, Request request, Response response) {
if (isAllowed(property)) {
getNext().invoke(request, response);
return;
}
// Deny this request
denyRequest(request, response);
}
基本邏輯類于我們常說的黑名單與白名單。可以配置哪些是允許的,哪些是禁止的。
再翻到上面看Manager應用的配置,是配置了allow屬性,設置了允許的請求地址,其它不在此范圍的請求都會被拒絕。
isAllow方法,在判斷時使用java.util.regex進行正則的判斷。首先是根據配置的是allow還是deny進行具體的property解析和匹配。
public boolean isAllowed(String property) {
// Use local copies for thread safety
Pattern deny = this.deny;
Pattern allow = this.allow;
// Check the deny patterns, if any
if (deny != null && deny.matcher(property).matches()) {
return false;
}
// Check the allow patterns, if any
if (allow != null && allow.matcher(property).matches()) {
return true;
}
// Allow if denies specified but not allows
if (deny != null && allow == null) {
return true;
}
// Deny this request
return false;
}
對于RemoteFilterValve,在官方文檔還有這樣一個樣例,可以在拒絕請求招待時,跳轉到指定的端口。
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
addConnectorPort="true"
allow="127\.\d+\.\d+\.\d+;\d*|::1;\d*|0:0:0:0:0:0:0:1;\d*|.*;8443"/>
通過分號進行分隔,后面跟上跳轉的端口。
與RemoteAddrValve類似的,Tomcat還提供了一個RemoteHostValve,可以進行遠程主機的過濾,配置與功能與我們上面的介紹基本一致。
Tomcat內置了豐富的Valve,可以進行多種情形下的應用。
和Tomcat學設計模式 | Facade模式與請求處理
關于怎樣避免Manager應用被人利用問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。