За последние 24 часа нас посетили 17473 программиста и 1650 роботов. Сейчас ищет 961 программист ...

Авторизация с хитрой проверкой IP

Тема в разделе "PHP для новичков", создана пользователем DobroFenix, 2 июл 2012.

  1. DobroFenix

    DobroFenix Активный пользователь

    С нами с:
    22 май 2010
    Сообщения:
    89
    Симпатии:
    0
    Нужно модернизировать существующую систему авторизации на сайте, добавив проверку ip адреса на нахождение его в разрешенном диапазоне ip адресов.
    То есть, нужно проверить ip адрес входящего пользователя с разрешенным списком ip диапазонов.
    В базе данных будет лежать id пользователя, ip_min и ip_max.
    ip_min и ip_max представляются как статические ip адреса без указания масок.
    Предполагается, что у пользователя будет указано для входа несколько разрешенных подсетей.

    Как реализовать такую схему?
    Может где-то есть уже готовый подобный код?
    Помогите пожалуйста написать данную систему.
     
  2. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    а в чем проблема? при входу проверять IP и все...если из "нашей" подсетки - велкам, не из нашей - отлуп...
     
  3. DobroFenix

    DobroFenix Активный пользователь

    С нами с:
    22 май 2010
    Сообщения:
    89
    Симпатии:
    0
    Как собрать несколько массивов из ip_min и ip_max и прогнать ip клиента через все этим массивы и получить на выходе false или true ?
    Код, пожалуйста....
     
  4. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    а как у тебя выглядит твоя таблица (или что у тебя там) с диапазонами ip?
     
  5. DobroFenix

    DobroFenix Активный пользователь

    С нами с:
    22 май 2010
    Сообщения:
    89
    Симпатии:
    0
    В базе данных представляю будет так:
    Код (Text):
    1. CREATE TABLE IF NOT EXISTS `ip_permission` (
    2.   `id` int(11) NOT NULL auto_increment,
    3.   `client` int(10) NOT NULL,
    4.   `min` varchar(50) NOT NULL,
    5.   `max` varchar(50) NOT NULL,
    6.   PRIMARY KEY  (`id`)
    7. ) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=14 ;
    8.  
    9. INSERT INTO `ip_permission` (`id`, `client`, `min`, `max`) VALUES
    10. (11, 86, '127.0.0.0', '127.0.0.255');
     
  6. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    а как ты строками собрался ip сравнивать в промежутке?
     
  7. DobroFenix

    DobroFenix Активный пользователь

    С нами с:
    22 май 2010
    Сообщения:
    89
    Симпатии:
    0
    Собственно, в этом и есть частичная суть вопроса.
    Или проще использовать маску /8 /16/24 /32 и работать только с ними?

    Добавлено спустя 5 минут 26 секунд:
    Да..
    Думаю, проблема решена.
    Нашел выход -- Использовать маску.

    Функция:
    Код (Text):
    1.  function netMatch ($CIDR,$IP) {
    2.     list ($net, $mask) = explode ('/', $CIDR);
    3.     return ( ip2long ($IP) & ~((1 << (32 - $mask)) - 1) ) == ip2long ($net);
    4. }  
    5. var_dump(netMatch('127.0.0.1/32','127.0.0.2'));
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я может ошибаюсь, но границы диапазона тупо больше/меньше айпишника.