SQL脚本 - 检查IP是否已列入黑名单

Gib*_*boK 6 sql t-sql database

我正在学习SQL,我希望你的建议,看看这段代码是否写得正确,还是更好的方法.这个脚本创建:

  • 用于存储黑名单的IP地址的表
  • 允许在4个八位字节中吐出IP地址的sproc
  • 允许检查IP是否为黑名单的SPROC请告知我们!谢谢!

    -- Black Listed Table
    CREATE TABLE UtlBlacklistedIPs 
            ( 
                octet1 TINYINT, 
                octet2 TINYINT, 
                octet3 TINYINT, 
                octet4 TINYINT 
            );
    
    Run Code Online (Sandbox Code Playgroud)

1 SPROC

    -- Convert an IP address in 4 octet for db storing
  CREATE PROCEDURE dbo.storeIPoctetsv1 
   @ip CHAR(15) 
  AS 
  BEGIN 
   SET NOCOUNT ON 
   INSERT UtlBlacklistedIPs(octet1, octet2, octet3, octet4) 
    SELECT 
     CONVERT(TINYINT, PARSENAME(@ip, 4)), 
     CONVERT(TINYINT, PARSENAME(@ip, 3)), 
     CONVERT(TINYINT, PARSENAME(@ip, 2)), 
     CONVERT(TINYINT, PARSENAME(@ip, 1)) 
  END
Run Code Online (Sandbox Code Playgroud)

2 SPROC

-- SPROC check if an IP address has been black listed
CREATE PROCEDURE dbo.sprocCheckIp
     @ip CHAR(15)
    AS
    BEGIN
     SET NOCOUNT ON
     DECLARE
     @octet1 tinyint,
     @octet2 tinyint,
     @octet3 tinyint,
     @octet4 tinyint;

     SET @octet1 = CONVERT(tinyint, PARSENAME(@ip, 4)); 
     SET @octet2 = CONVERT(tinyint, PARSENAME(@ip, 3));
     SET @octet3 = CONVERT(tinyint, PARSENAME(@ip, 2));
     SET @octet4 = CONVERT(tinyint, PARSENAME(@ip, 1));

     IF EXISTS ( 
      SELECT octet1, octet2, octet3, octet4
      FROM UtlBlacklistedIPs
      WHERE
      octet1 =@octet1
      AND octet2 =@octet2
      AND octet3 =@octet3
      AND octet4 =@octet4
      )
       BEGIN
        PRINT 'Ip: '+@ip+' is black listed'
       END

      ELSE
       BEGIN     
        PRINT 'Ip: '+@ip+' is NOT black listed'
       END     
    END
Run Code Online (Sandbox Code Playgroud)

一些价值观

    -- Insert dummy values
DECLARE @i INT 
SET @i = 0 
WHILE @i < 2000 
BEGIN 

    EXEC dbo.storeIPoctetsv1 @ip = '204.71.34.21' 
    EXEC dbo.storeIPoctetsv1 @ip = '12.38.145.32' 
    EXEC dbo.storeIPoctetsv1 @ip = '127.0.0.1' 

    SET @i = @i + 1 
END
Run Code Online (Sandbox Code Playgroud)

使用SPROC

    -- Use SPROc
    EXEC dbo.sprocCheckIp '125.254.125.111' -- NOT black listed Ip
    EXEC dbo.sprocCheckIp '204.71.34.21' -- black listed Ip
Run Code Online (Sandbox Code Playgroud)

Tom*_*han 3

我假设您将在数据库外部使用它,大概是在 .NET 中?在这种情况下,我会像这样重新构建:

  • SPproc 存储列入黑名单的 IP,以四个八位字节作为输入
  • SProc 检查任何 IP,以四个八位字节作为输入,0 或 1 作为输出(使用RETURN,not PRINT
  • 改为在 .NET 中分割 IP 地址。SQL Server 的字符串处理能力非常差,因此您最好编写一个Ip带有静态方法的类int[] ToOctets(string ip)来为您处理该问题。您将这样使用它:var octs = Ip.ToOctets("213.82.158.93")
  • 当您检查 IP 是否已列入黑名单时,您可以调用 ExecuteScalar(或者使用您喜欢的连接器调用从存储过程获取标量值的任何方法)来获取结果。