2

私のWebページを保護し、IPを知るためだけに表示する次のJSPコードがあります

String ip_h = request.getRemoteAddr();  
String host_h = request.getRemoteHost();  
String iplist[] = new String[1];  
iplist[0] = "127.0.0.1";  
iplist[1] = "10.217.106.248";  

int count = iplist.length;  
boolean flag = false;  
int zz = 0;  
//return;
System.out.println(host_h);  
while ( (flag==false) && ( zz < count) )  
{  
   if (ip_h.equals(iplist[zz]) || host_h.equals(iplist[zz]) )  
   {  
      flag = true;  
   }  
   zz++;  
}

ただし、サブネットの範囲を確認したいと思います。つまり、10.217.0.0/16 に属するすべてのユーザーが許可されます。

どうすればいいですか?

4

5 に答える 5

2

IP アドレス (少なくとも IPv4 アドレス) は、実際には 32 ビット整数として表現されることを意図しています。最初に IP アドレスを整数に変換すると、サブネット範囲のチェックは、最初の 16 ビットが範囲の最初の 16 ビットと一致するかどうかを (この例では) 比較的簡単にチェックできます。

于 2008-10-07T12:46:09.933 に答える
2

アプリケーションサーバーを使用して IP 範囲をロックダウンしたくないですか? Apache では、ディレクトリのエイリアスを作成し、コードをディレクトリに配置してから、エイリアス ディレクティブで特定の IP または範囲のみを許可できます。

エイリアス /mydir "/usr/local/mydir"

order deny,allow deny from all 10.217.106.248 から許可する 127.0.0.1 から許可する 10.217.106 から許可する #これは範囲です

この方法では、この種の「マジック ナンバー」をコーディングする必要はありません。

この種のことは他のWebサーバーでもできると確信しています

于 2008-10-07T12:46:43.880 に答える
2

この IpRangeFilter クラスを自由に使用してください。説明については、クラスのコメントを参照してください。

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.collections15.Predicate;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;

/**
 * I am a filter used to determine if a given IP Address is covered by the IP range specified in 
 * the constructor.  I accept IP ranges in the form of full single IP addresses, e.g. 10.1.0.23
 * or network/netmask pairs in CIDR format e.g. 10.1.0.0/16
 */
public class IpRangeFilter implements Predicate<InetAddress> {

    private final long network;
    private final long netmask;

    private final String ipRange;

    private static final Pattern PATTERN = Pattern.compile("((?:\\d|\\.)+)(?:/(\\d{1,2}))?");

    public IpRangeFilter(String ipRange) throws UnknownHostException {
        Matcher matcher = PATTERN.matcher(ipRange);
        if (matcher.matches()) {
            String networkPart = matcher.group(1);
            String cidrPart = matcher.group(2);

            long netmask = 0;
            int cidr = cidrPart == null ? 32 : Integer.parseInt(cidrPart);
            for (int pos = 0; pos < 32; ++pos) {
                if (pos >= 32-cidr) {
                    netmask |= (1L << pos);
                }
            }

            this.network = netmask & toMask(InetAddress.getByName(networkPart));
            this.netmask = netmask;
            this.ipRange = ipRange;

        } else {
            throw new IllegalArgumentException("Not a valid IP range: " + ipRange);
        }
    }

    public String getIpRange() {
        return ipRange;
    }

    public boolean evaluate(InetAddress address) {
        return isInRange(address);
    }

    public boolean isInRange(InetAddress address) {
        return network == (toMask(address) & netmask);
    }

    /**
     * Convert the bytes in the InetAddress into a bit mask stored as a long.
     * We could use int's here, but java represents those in as signed numbers, which can be a pain 
     * when debugging.
     * @see http://www.captain.at/howto-java-convert-binary-data.php
     */
    static long toMask(InetAddress address) {
        byte[] data = address.getAddress();
        long accum = 0;
        int idx = 3;
        for ( int shiftBy = 0; shiftBy < 32; shiftBy += 8 ) {
            accum |= ( (long)( data[idx] & 0xff ) ) << shiftBy;
            idx--;
        }
        return accum;
    }
}
于 2008-10-07T14:11:29.463 に答える
0

このバグレポートSubnetのクラスを試してください。

于 2008-10-07T12:54:31.320 に答える
0

次のコードを使用できます。もちろん、入力データが正しいと想定しているため、美化が必要です(念のため)

public class IPUtil
{

    private static int[] split(String ip)
    {
        int[] result = new int[4];
        StringTokenizer st = new StringTokenizer(ip, ".");
        for (int i = 0; i < 4; i++)
        {
            result[i] = Integer.parseInt(st.nextToken());
        }
        return result;
    }

    public static boolean matches(String visitorIpString, String ipString, String maskString)
    {
        int[] vip = split(visitorIpString);
        int[] ip = split(ipString);
        int[] mask = split(maskString);

        for (int i = 0; i < 4; i++)
        {
            if ((vip[i] & mask[i]) != ip[i])
            {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args)
    {

        String ip = "192.168.12.0";
        String mask = "255.255.255.0";
        String visitorIP = "192.168.12.55";

        System.out.println(matches(visitorIP, ip, mask));
    }
}
于 2008-10-07T13:06:38.707 に答える