SQL формат. Конвертация IP адреса в IP номер

Discussion in 'Безопасность и Анонимность' started by foozzi, 11 Jan 2011.

  1. foozzi

    foozzi Member

    Joined:
    13 Apr 2010
    Messages:
    195
    Likes Received:
    12
    Reputations:
    5
    Таблица worldip содержит поля start, end и code. В одной строке записан один диапазон сети. start и end - это поля типа integer с IP номерами, code содержит двухбуквенный код страны, например "RU".
    Конвертация IP адреса в IP номер происходит по следуюшей формуле:
    Code:
    IP Number = [COLOR=Cyan]16777216[/COLOR]*A + [COLOR=Cyan]65536[/COLOR]*B + [COLOR=Cyan]256[/COLOR]*C + D где IP Address = A.B.C.D
    В PHP есть готовая функция, которая возвращает IP номер - ip2long($ip_address).
    Например, IP адрес 91.121.147.207 конвертируется в IP номер 1534694351

    Вы можете получить код страны из базы, например, таким запросом:
    Code:
    [B]SELECT[/B] code [B]FROM[/B] worldip [B]WHERE start[/B]<=IP_NUMBER [B]and end[/B]>=IP_NUMBER
    Если вы инсталлируете вторую таблицу с названиями стран, то так можно получить и код и страну одним запросом:
    Code:
    [B]SELECT[/B] wl.code,wl.country [B]FROM[/B] worldip w [B]LEFT JOIN[/B] worldip_land wl ON (w.code=wl.code) [B]WHERE w.start[/B]<=IP_NUMBER and w.end>=IP_NUMBER
    или только название страны:
    Code:
    [B]SELECT[/B] wl.country [B]FROM[/B] worldip_land wl [B]LEFT JOIN[/B] worldip w [B]ON[/B] (w.code=wl.code) [B]WHERE w.start[/B]<=IP_NUMBER [B]and[/B] w.end>=IP_NUMBER
    Если вы используете API (чтобы получать более актуальные данные), вы можете поставить таблицу с названиями стран.
    Code:
    [B]SELECT[/B] country [B]FROM[/B] worldip_land [B]WHERE[/B] code=[COLOR=DarkRed]"GB"[/COLOR]
    вернет "United Kingdom" или "Великобритания" для русского варианта таблицы

    Спасибо mgyk за подсказку использовать внутренние функции MySQL для преобразования адресов.
    Во всех вышеперечисленных примерах можно заменить IP_NUMBER на inet_aton('IP_ADDR')
    Code:
    [B]SELECT[/B] code [B]FROM[/B] worldip [B]WHERE start[/B]<=inet_aton([COLOR=DarkRed]'77.77.77.77'[/COLOR]) [B]and[/B] end>=inet_aton([COLOR=DarkRed]'77.77.77.77'[/COLOR])
     
    #1 foozzi, 11 Jan 2011
    Last edited: 11 Jan 2011