Sfoglia il codice sorgente

Let's make IPv4Filter to actually filter non-IPv4

- This might happend if you use PHP's fsockopen() on a Server with IPv6.
	- For the fsockopen() I'll share an alternative using PHP sockets.

- Also it's possible some external application might try to connect
using IPv6.

- Closing ticket http://trac.l2jserver.com/ticket/5603

- A log will be displayed, you can ignore it or ban the address on your
firewall.

Reported by: mazdik, shippou, dylen23, hihihihuhuuu, daydie, Shifu,
kurtspirit, JMD, KGB1st
Zoey76 9 anni fa
parent
commit
a453ea591d
1 ha cambiato i file con 11 aggiunte e 3 eliminazioni
  1. 11 3
      L2J_Server/java/com/l2jserver/util/IPv4Filter.java

+ 11 - 3
L2J_Server/java/com/l2jserver/util/IPv4Filter.java

@@ -18,20 +18,23 @@
  */
 package com.l2jserver.util;
 
+import java.net.Inet4Address;
 import java.net.InetAddress;
 import java.nio.channels.SocketChannel;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map.Entry;
+import java.util.logging.Logger;
 
 import com.l2jserver.mmocore.IAcceptFilter;
 
 /**
  * IPv4 filter.
- * @author Forsaiken
+ * @author Forsaiken, Zoey76
  */
 public class IPv4Filter implements IAcceptFilter, Runnable
 {
+	private static final Logger LOG = Logger.getLogger(IPv4Filter.class.getName());
 	private final HashMap<Integer, Flood> _ipFloodMap;
 	private static final long SLEEP_TIME = 5000;
 	
@@ -67,9 +70,14 @@ public class IPv4Filter implements IAcceptFilter, Runnable
 	@Override
 	public boolean accept(SocketChannel sc)
 	{
-		InetAddress addr = sc.socket().getInetAddress();
-		int h = hash(addr.getAddress());
+		final InetAddress addr = sc.socket().getInetAddress();
+		if (!(addr instanceof Inet4Address))
+		{
+			LOG.info(IPv4Filter.class.getSimpleName() + ": Someone tried to connect from something other than IPv4: " + addr.getHostAddress());
+			return false;
+		}
 		
+		final int h = hash(addr.getAddress());
 		long current = System.currentTimeMillis();
 		Flood f;
 		synchronized (_ipFloodMap)