IP masking

A következő cikket „Lloy Kinsella” beleeggyezésével fordítottam le magyarra. E cikkben az IP maskingról fogok mesélni, azaz például teszem azt egy játéknál, hogyan bannoljunk egy illetőt az IP címe alapján vagy kinek adjunk jogosultságot a csatlakozáshoz stb. A cikk java része forráskód, de remélem azért érthető lesz a mellé helyezett pár leírás. Csapjunk hát a lovak közé.:

 

A következő kis rutinban „függvényben” találod a masking lényegét, amit később majd meghívunk.

function IPMatchMask(IP, Mask: String): Boolean;

procedure SplitDelimitedText(Text: String; Delimiter: String; Results: TStrings);
var
TheWord, CommaText: String;
begin
Results.Clear;
CommaText := Text + Delimiter;
  while (Pos(Delimiter,CommaText) > 0) do
   begin
    TheWord := Copy(CommaText, 1, Pos(Delimiter, CommaText) - 1);
    CommaText := Copy(CommaText, Pos(Delimiter, CommaText) +
     Length(Delimiter), Length(CommaText));
    Results.Add(TheWord);
   end;
end;


var
IPs, Masks: TStringList;
I: Integer;
begin
IPs := TStringList.Create;
  try
   Masks := TStringList.Create;
    try
     SplitDelimitedText(LowerCase(IP),'.',IPs);
     SplitDelimitedText(LowerCase(Mask),'.',Masks);
     Result := True;
      if IPs.Count <> Masks.Count then
       begin
        Result := False;
        Exit;
       end;
      for I := 0 to IPs.Count - 1 do
       begin
        if (IPs.Strings[I] <> Masks.Strings[I]) and
           (Masks.Strings[I] <> '*') then
         Result := False;
       end;
    finally
     Masks.Free;
    end;
  finally
   IPs.Free;
  end;
end;

Minden IP cím (dns mask) négy kis számjegyből áll, mint mondjuk a 62.112.203.43 (ez egy dial upos enternet felhasználó IP címét jelzi). Mivel az enternetesek utolsó számjegye példánkban a „43” változik, ezért ha azt szeretnénk, hogy csak az enternetesek tudjanak csatlakozni a szerverre akkor egy *-t teszünk a 43 helyére. A * az mindent jelent, mindent visz mint a magyar kártyában az ász. ;) (Azaz bármilyen max 3 jegyű számjegy kerülhet a helyére)

112
203
*

Persze leírhatod simán az aktuális IP címet is ha dialról van szó ha nem, de mivel most ez csak egy példa ezért ígyhadjuk... Ez volt a nagy rutin lényege, de nézzük hogyan tudjuk hasnosítani.

Használhatod például a TServerSocket komponens OnClientConnect eseményét, azaz amikor csatalkozik a felhasználó a célgéphez. Íme.:

procedure ServerSocketClientConnect(Sender: TObject; Socket: TCustomWinsocket);
begin


if not (IPMatchMask(Socket.LocalAddress,'62.112.215.*')) then Socket.Close;


end;


Ennek hatására minden felhasználót aki nem rendelkezik Enternetes eléréssel, azaz ezzel az IP címmel az nem tud csatlakozni a célgéphez.

Nos igen e cikkem viszonylag rövidnek bizonyult, de annál lényegretörőbnek. Nagyon sokmindenre tudod használni a későbbiekben és én úgyvélem, nem csak a Delphi Socket Komponenseit használva vele.

 

Gebei János - harkon@coder.hu