簡體   English   中英

java-使用過濾器檢查遠程地址

[英]java- using a filter to check remote address

檢測Web應用程序是否在本地訪問的最佳方法是什么?
我有興趣在過濾器javax.servlet.Filter )中檢查它。
我可以檢查ServletRequest#getRemoteAddr()如果它是127.0.0.1但是如果它在IPv6機器上運行,則地址將是0:0:0:0:0:0:0:1
是否還有其他陷阱我應該注意,或者如果我只檢查這兩個字符串模式,我會沒事的?

謝謝

從理論上講,以下內容應該足夠了。

 
 
 
  
  if (request.getRemoteAddr().equals(request.getLocalAddr())) { // Locally accessed. } else { // Remotely accessed. }
 
  


根據注釋更新request.getLocalAddr()似乎返回0.0.0.0 ,當服務器在代理后面時確實會發生這種情況。

您可能希望將其與InetAddress解析的地址進行比較。

private Set<String> localAddresses = new HashSet<String>(); 

@Override
public void init(FilterConfig config) throws ServletException {
    try {
        localAddresses.add(InetAddress.getLocalHost().getHostAddress());
        for (InetAddress inetAddress : InetAddress.getAllByName("localhost")) {
            localAddresses.add(inetAddress.getHostAddress());
        }
    } catch (IOException e) {
        throw new ServletException("Unable to lookup local addresses");
    }
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
    if (localAddresses.contains(request.getRemoteAddr())) {
        // Locally accessed.
    } else {
        // Remotely accessed.
    }
}

在我的例子中, localAddresses包含以下內容:

[192.168.1.101, 0:0:0:0:0:0:0:1, 127.0.0.1]

您還需要檢查盒子的所有其他IP地址,就像您的以太網接口一樣。 還要考慮別名。

即使客戶端在本地運行,它也可能沒有使用環回接口。 您的計算機將具有分配的IP地址,並且取決於/ etc / hosts配置,DNS配置等,您連接的IP地址可能不是環回地址。

假設你想提供某種“更加安全”的“增強”接口,因為它起源於同一台機器,請注意甚至可以通過使用wireshark等工具來窺探環回接口。 如果此接口旨在顯示適合更受信任的客戶端的數據,那么您應該努力通過https進行正確的ssl隧道傳輸。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM