2013-06-19 29 views
0

我正在構建一個簡單的客戶機 - 服務器應用程序,並且我想實施某種黑名單驗證。通過網絡進行黑名單驗證的簡單客戶機 - 服務器應用程序

目前我有一個IP黑名單驗證工作,它從文件(blacklist.txt)讀取一個字符串,並將其與插座IP地址進行比較。如果平等,客戶被拒絕。

我現在想要實現的是某種網絡黑名單驗證,而不是IP。

可以說我在我的「blacklist.txt」上有192.168.1.0/24。我需要阻止從192.168.1.1到192.168.1.255的任何連接。

這是我對此刻的IP黑名單驗證碼:

 BufferedReader reader = new BufferedReader(new FileReader("C:\\Users\\Joao\\git\\ProjectoRedes\\lists\\blacklist.txt")); 
     String line = null; 
     socket = server.accept(); 

     // Blacklist verification - Do in single thread 
     while ((line = reader.readLine()) != null) { 
      if (line.equals(socket.getInetAddress().toString())) { 
       System.out.println("IP Blacklisted: " + socket.getInetAddress().toString()); 
       System.out.println("Closing connection to " + socket.getInetAddress().toString()); 
       PrintStream checkBlack = new PrintStream(socket.getOutputStream(),true); 
       checkBlack.println("***BLACKLISTED***"); 
       reader.close(); 

       socket.close(); 
       break; 
      } 
     } 

輸出然後發送給客戶,從而關閉套接字,終止連接。

我想知道是否有任何簡單的方法來做我上面說的。

幫助表示讚賞。

+0

我敢肯定有一個更好的方法,但你可以做一個'字符串#substring'只提取IP地址的重要部分並進行比較 – MadProgrammer

回答

0

我會做這樣的事情

int ip = ip2int(socket.getInetAddress().getHostName()); 

// iterate over black list, split item into subnet and bits 
String line = "192.168.1.0/24"; 
String[] a = line.split("/"); 
int subnet = ip2int(a[0]); 
// make a mask 
int bits = a.length == 1 ? 0 : Integer.parseInt(a[1]); 
int mask = 0xFFFFFFFF << 32 - bits; 
// mask client ip and compare 
if ((ip & mask) == subnet) { 
// match 
} 

這是IP - > INT FUNC

int ip2int(String ip) throws UnknownHostException { 
    InetAddress a = InetAddress.getByName(ip); 
    return new BigInteger(a.getAddress()).intValue(); 
} 
+0

如果我的閱讀正確,這隻能解決我已經解決的問題,即使它可能更快。不過,我並不是在尋找更快的解決方案。我正在尋找一種方法來讀取「網絡」(192.168.1.0/24),並從那裏排除所有IP從192.168.1.1到192.168.1.255,而無需手動將它們添加到列表中。 – jsfrocha

+0

我看到了,修正了,請參閱更新 –

+0

是的,我認爲這樣做,即使我仍在努力理解「製作面具」的一部分。另一件事,在'if((ip&mask)== subnet)''ip'變量是什麼? – jsfrocha

相關問題