Caractériser une adresse IP

Voici une procédure stockée pour :

Рv̩rifier une adresse IP
Рchercher si celle-ci est priv̩e
– chercher la classe de cette adresse IP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
------------------------------------------------------------
-- Nicolas SOUQUET - 08/08/2009 - Vérifie une adresse IP
--                - Extrait sa classe
--                - Vérifie si elle est privée
/*
DECLARE @IP VARCHAR(15),
    @OK BIT,
    @classe CHAR(1),
    @privee BIT
 
SET @IP = '172.220.10.1'
 
EXEC dbo.PsCheck_AdresseIP
  @IP,
  @OK OUTPUT,
  @classe OUTPUT,
  @privee OUTPUT
 
SELECT @OK AS OK,
    @classe AS classe,
    @privee AS privee
*/
------------------------------------------------------------
ALTER PROCEDURE PsCheck_AdresseIP
  @adresseIP VARCHAR(15),
  @estAdresseIPCorrecte BIT = NULL OUTPUT,
  @classeAdresseIP CHAR(1) = NULL OUTPUT,
  @estPrivee BIT = NULL OUTPUT
AS
BEGIN
  SET NOCOUNT ON
 
  SELECT @estAdresseIPCorrecte = 1,
      @estPrivee = 0
 
  IF
  (
    @adresseIP IS NULL
    OR @adresseIP NOT LIKE '%.%.%.%'
  )
  BEGIN
    SET @estAdresseIPCorrecte = 0
  END
  ELSE
  BEGIN
    -----------------------------------------
    -- Recherche de la valeur de chaque octet
    -----------------------------------------
    DECLARE @octet1 TINYINT,
        @octet2 TINYINT,
        @octet3 TINYINT,
        @octet4 TINYINT,
        ---
        @indiceFinPremierOctet TINYINT,
        @indiceFinDeuxiemeOctet TINYINT,
        @indiceFinTroisiemeOctet TINYINT,
        @indiceFinQuatriemeOctect TINYINT
 
    SELECT @indiceFinPremierOctet = CHARINDEX('.', @adresseIP),
        @indiceFinDeuxiemeOctet = CHARINDEX('.', @adresseIP, @indiceFinPremierOctet + 1),
        @indiceFinTroisiemeOctet = CHARINDEX('.', @adresseIP, @indiceFinDeuxiemeOctet + 1)
 
    BEGIN TRY
      SELECT @octet1 = CAST(SUBSTRING(@adresseIP, 1, @indiceFinPremierOctet - 1) AS TINYINT),
          @octet2 = CAST(SUBSTRING(@adresseIP, @indiceFinPremierOctet + 1, @indiceFinDeuxiemeOctet - @indiceFinPremierOctet - 1) AS TINYINT),
          @octet3 = CAST(SUBSTRING(@adresseIP, @indiceFinDeuxiemeOctet + 1, @indiceFinTroisiemeOctet - @indiceFinDeuxiemeOctet - 1) AS TINYINT),
          @octet4 = CAST(RIGHT(@adresseIP, LEN(@adresseIP) - @indiceFinTroisiemeOctet) AS TINYINT)
    END TRY
    BEGIN CATCH
      RAISERROR('Une des octets de l''adresse IP est incorrect', 16, 1)
    END CATCH
 
    --------------------------------------
    -- Recherche de la classe de l'adresse
    --------------------------------------
    -- Classe A
    IF @octet1 BETWEEN 1 AND 126
    BEGIN
      SET @classeAdresseIP = 'A'
    END
 
    -- Classe B
    IF
    (
      @octet1 BETWEEN 128 AND 190
      OR
      (
        @octet1 = 191
        AND @octet3 = 0
        AND @octet4 = 0
      )
    )
    BEGIN
      SET @classeAdresseIP = 'B'
    END
 
    -- Classe C
    IF
    (
      @octet1 BETWEEN 191 AND 222
      OR
      (
        @octet1 = 223
        AND @octet4 = 0
      )
    )
    BEGIN
      SET @classeAdresseIP = 'C'
    END
 
    IF @classeAdresseIP IS NULL
    BEGIN
      SET @estAdresseIPCorrecte = 0
    END
 
    ------------------------------------
    -- Recherche si l'adresse est privée
    ------------------------------------
    IF
    (
      (  -- Classe A
        @octet1 = 10
        OR
        (
          @octet1 = 10
          AND @octet2 = 255
          AND @octet3 = 255
          AND @octet4 = 254
        )
      )
      OR -- Classe B
      (
        (
          @octet1 = 172
          AND @octet2 BETWEEN 16 AND 31
        )
        OR
        (
          @octet1 = 172
          AND @octet2 = 31
          AND @octet3 = 255
          AND @octet4 = 254
        )
      )
      OR -- Classe C
      (
       
        (
          @octet1 = 192
          AND @octet2 = 168
        )
        OR
        (
          @octet1 = 192
          AND @octet1 = 168
          AND @octet3 = 255
          AND @octet4 = 254
        )
      )
    )
    SET @estPrivee = 1
  END
END

Laisser un commentaire