Войти

Показать полную графическую версию : [решено] [PHP] Доступ по диапазону IP - как?


D_Master
08-01-2009, 13:37
Всем привет!

Помогите пожалуйста: есть диапазон IP-адресов, можно ли каким-нибудь PHP-скриптом разрешить доступ к сайту только с этих IP? Использование MySQL не желательно :)

Coutty
08-01-2009, 14:00
Маска IP-адресов - это типа 255.255.255.0? Или имеется в виду диапазон адресов?
Пример можно?

D_Master
08-01-2009, 14:27
имеется в виду диапазон адресов? »
Coutty, ох, тупанул, да, диапазон :)
Вот с этих диапазонов нужно разрешить доступ, а со всех остальных - запретить.
62.33.83.0 - 62.33.83.255
62.33.133.0 - 62.33.133.255
83.234.84.0 - 83.234.86.255
83.234.120.0 - 83.234.123.255
87.103.160.0 - 87.103.167.255
90.188.32.0 - 90.188.63.255
92.124.192.0 - 92.124.223.255
92.126.128.0 - 92.126.129.255
92.126.132.0 - 92.126.135.255
212.0.64.0 - 212.0.95.255

Coutty
08-01-2009, 15:09
// я точно не помню, как в php массивы делаются. Кажется так.
// 1 и 2 цифры - 1 и 2 октеты адреса. 3 цифра - нижняя граница диапазона третьего октета, 4 цифра - верхняя граница диапазона 3 октета. 4 октет адреса не рассматриваем, т.к. он роли не играет.
$allowed = [
[62, 33, 83, 83],
[62, 33, 133, 133],
[83, 234, 84, 86],
[83, 234, 120, 123],
[87, 103, 160, 167],
[90, 188, 32, 63],
[92, 124, 192, 223],
[92, 126, 132, 135],
[212, 0, 64, 95]
];

$addr = $_SERVER["REMOTE_ADDR"]; // получаем адрес клиента
$addr = explode(".", $addr); // разбиваем по октетам. Можно было объединить с 1 строкой.
for ($i = 0; $i < count($allowed); $i++)
{
// проверяем совпадение первого и второго октетов и находится ли третий октет в интервале от "3" до "4" элемента в массиве
if ($addr[0] == $allowed[$i][0] && $addr[1] == $allowed[$i][1] && $addr[2] >= $allowed[$i][2] && $addr[3] <= $allowed[$i][4])
{
$access = 'granted';// если совпало, даём доступ
break;
}
}

if ($access != 'granted') exit ("Не пущу!");

// а дальше код, который для избранных


Может быть есть и более простой путь, но мне он неизвестен)

mar
08-01-2009, 15:13
D_Master,
ну так просто надо брать $_SERVER['REMOTE_ADDR'] и сравнивать с нужными диапазонами,
(для преобразования адресов к цифрам используем ip2long (http://ru2.php.net/manual/en/function.ip2long.php)).
А дальше поступаете, как при неверном пароле - например redirect куда-нибудь в безопасное место.

написала, не видя кода Coutty
(но с ip2long - проще :))

D_Master
08-01-2009, 15:52
ну так просто надо брать
$_SERVER['REMOTE_ADDR']
и сравнивать с нужными диапазонами, »
(но с ip2long - проще ) »
mar, извините, не могли бы вы показать пример? ;)

Sham
08-01-2009, 16:45
function test_IP()
{
$IPs_arr = array
(
array('62.33.83.0', '62.33.83.255'),
array('62.33.133.0', '62.33.133.255'),
array('83.234.84.0', '83.234.86.255'),
array('83.234.120.0', '83.234.123.255'),
array('87.103.160.0', '87.103.167.255'),
array('90.188.32.0', '90.188.63.255'),
array('92.124.192.0', '92.124.223.255'),
array('92.126.128.0', '92.126.129.255'),
array('92.126.132.0', '92.126.135.255'),
array('212.0.64.0', '212.0.95.255')
);

$my_ip2long = @ip2long($_SERVER['REMOTE_ADDR']);

foreach($IPs_arr as $IPs)
{
if
(
$my_ip2long >= @ip2long($IPs[0]) &&
$my_ip2long <= @ip2long($IPs[1])
)

return true;
}

exit('здесь вам не тут!');
}

test_IP();

D_Master
08-01-2009, 19:45
Sham, спасибо вам огромное!!! Все работает, цветет и пахнет :)




© OSzone.net 2001-2012