[英]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.