【发布时间】:2022-01-22 00:12:22
【问题描述】:
我需要创建一个表来存储黑名单 IP 地址,以防我的博客中出现垃圾邮件。 我想知道:
- 存储 IP 地址的最佳数据类型是什么。
- 我可以在此表中列出您认为对打击垃圾邮件发送者有用的其他字段。
我使用 MS SQL 2008 作为我的数据库。
【问题讨论】:
我需要创建一个表来存储黑名单 IP 地址,以防我的博客中出现垃圾邮件。 我想知道:
我使用 MS SQL 2008 作为我的数据库。
【问题讨论】:
IP v4 地址为 4 个字节,IP v6 地址为 16 个字节,因此将它们存储为 varbinary(16) 字段。我从您的问题标签中看到您正在使用.Net,因此您可以使用IPAddress.GetAddressBytes() 轻松获取这些字节。如果您使用的是实体框架或类似的 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(); }
}
【讨论】:
【讨论】:
最简单的事情是存储一个char(15),假设是IPV4。
这是最简单的形式,不需要复杂的转换和计算,除非您存储大量数据(数百万条记录),否则不应考虑性能。
【讨论】:
垃圾邮件发送者不太可能继续使用相同的 IP 地址,因此您将在该地址上打一场失败的战斗。最好实施CAPTCHA,而不是尝试消除 IP 或使用来自连接的其他数据来“过滤”垃圾邮件发送者。其中大部分是通过自动化工具完成的,因此 CAPTCHA 是最佳途径。
【讨论】:
以最容易使用的形式存储它。因此,如果您的博客软件将 IP 地址作为字符串提供给您,请将其存储为字符串。如果软件将传入的 IP 地址作为无符号整数提供给您,请以这种方式存储它。这将使您不必为每个传入连接将 IP 转换为可用的形式。
【讨论】:
总的来说,我认为这取决于您要触发的查询类型。如果基于 ipaddress 的完整比较的查询很简单,或者 ipaddress 不是过滤器的一部分,我会说将其简单地维护为 varchar 将是一个好方法。如果您想使用复杂的查询进行搜索,例如属于某个子网中 ip 地址的行等,那么您可以将 ipaddress 存储为四列中的四个 int 值。
【讨论】: