【发布时间】:2009-09-04 14:53:15
【问题描述】:
首先让我解释一下我目前如何处理验证,例如,对于 IPv4 地址:
public struct IPv4Address {
private string value;
private IPv4Address(string value) {
this.value = value;
}
private static IPv4Address CheckSyntax(string value) {
// If everything's fine...
return new IPv4Address(value);
// If something's wrong with the syntax...
throw new ApplicationException("message");
}
public static implicit operator IPv4Address(string value) {
return CheckSyntax(value);
}
public static implicit operator string(IPv4Address address) {
return address.value;
}
}
我有一堆这样的结构。
他们通常有额外的私人成员来处理事情,但没有公开公开的方法。
这是一个示例用法:
IPv4Address a;
IPv4Address b = "1.2.3.4";
a = b;
b = "5.6.7.8";
string address = a;
// c contains "1.2.3.4"
IPv4Address c = address;
// See if it's valid
try {
IPv4Address d = "111.222.333.444";
}
catch (ApplicationException e) {
// Handle the exception...
}
我可以感觉到这有一些非常令人不安的东西,因此我正在考虑切换到使用 IsIPv4Address 等方法的静态类。
现在,我认为上面的方法有问题:
新的团队成员将不得不对此深思熟虑
它可能会妨碍与第 3 方代码的集成
异常代价高昂
从来没有见过这样的事情,我是一个内心保守的人:)
然后我喜欢它:
非常接近拥有大量专用原语,因为您有值类型。
在实践中,它们通常可以像原始类型一样使用,例如,将上面的结构传递给接受字符串的方法是没有问题的。
而且,我最喜欢的是,您可以在对象之间传递这些结构,并确保它们包含语法上有效的值。这也避免了必须始终检查正确性,如果不必要地检查甚至被遗忘,这可能会很昂贵。
我找不到上述方法的致命缺陷(这里只是初学者),你怎么看?
编辑:您可以从第一行推断,这只是一个示例,我并不是要验证 IP 地址的方法。
【问题讨论】:
-
System.Net.IPAddress 会有什么问题?
-
@Johannes:我想他想知道他的验证架构出了什么问题,而不是这个特定的方法。
-
你不能只使用 inet_aton (来自 unix linux.about.com/library/cmd/blcmdl3_inet_aton.htm )吗?您的平台上应该存在等价物。请确保支持 IPv6 地址 ;)
标签: c# .net security validation