在数据库中存储IP地址的最佳方法

3

我需要创建一张表来存储黑名单IP地址,以防止博客中的垃圾邮件发送者。

我想知道:

  • 存储IP地址的最佳数据类型是什么。
  • 您认为在此表中可以列出哪些其他字段对抗垃圾邮件发送者可能有用。

我使用MS SQL 2008作为我的数据库。


可能是在SQL Server中存储IP地址的数据类型的重复问题。 - ChrisF
6个回答

8

IP v4地址由4个字节组成,IP v6地址由16个字节组成,因此将它们存储为varbinary(16)字段。从您的问题标签中可以看出,您正在使用.Net,因此您可以使用 IPAddress.GetAddressBytes()轻松获取这些字节。如果您正在使用Entity Framework或类似的ORM,则以下代码将对您有用。

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Net;

    [Required, MinLength(4), MaxLength(16)]
    public byte[] IPAddressBytes { get; set; }

    [NotMapped]
    public IPAddress IPAddress
    {
        get { return new IPAddress(IPAddressBytes); }
        set { IPAddressBytes = value.GetAddressBytes(); }
    }

6

如果你有像他一样的千兆字节数据仓库,这是一个不错的选择。 - Oded

2

最简单的方法是存储char(15),假设是IPV4。

这是使用的最简单形式,不需要复杂的转换和计算,除非您存储大量数据(数百万条记录),否则性能不应成为问题。


1

垃圾邮件发送者不太可能继续使用相同的IP地址,因此在这方面与其进行徒劳的斗争,还不如实现CAPTCHA。尝试消除IP地址或使用连接中的其他数据来“过滤”垃圾邮件发送者是得不偿失的。大多数情况下都是由自动化工具完成的,因此CAPTCHA是最佳选择。


1

以最易于使用的形式存储它。因此,如果您的博客软件将IP地址作为字符串提供,请将其存储为字符串。如果该软件将传入IP地址作为无符号整数提供,请以该方式存储它。这将使您免于为每个传入连接转换IP以便使用。


0
一般来说,这取决于您要发出什么类型的查询。如果基于完全比较的ipaddress或ipaddress不是过滤器的一部分,那么将其保持为varchar是一个好的方法。如果您想使用复杂的查询进行搜索,例如属于一个子网中的IP地址的行,则可以将ipaddress存储为四个int值在四个列中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接