我正在编写一个非常简单的网络过滤器,并且到达我想要解析IPv6标头的位置以匹配ICMPv6类型,TCP/UDP端口号等内容.
所以我正在深入阅读有关IPv6数据包格式的文章,我有点......好吧......我不得不一遍又一遍地阅读它,以确保我实际上正确地阅读它.在我看来,你必须从40字节的固定标头开始,看看它的下一个标题字段.然后你必须查看下一个标题的下一个标题字段,依此类推,就像一个链表,直到你到达结尾.如果有有效载荷,它将随之而来.
问题是固定标头或扩展标头中没有长度字段.您必须有一个扩展标题类型及其大小的表,以便您可以追踪此链接列表到最后.
这让我感到奇怪,甚至可能是一个奇怪的设计.如果遇到无法识别的扩展标头类型怎么办?我该怎么办?我不知道它的长度.我想我必须抛出数据包并阻止它,因为在允许数据包通过的网络过滤器中,攻击者可以通过包含伪造的头类型来逃避网络过滤器.但这意味着如果协议被扩展,如果要使用新的扩展,则必须同时更新所写的每个IPv6报头解析软件.
那么如果我不知道他们正在使用的扩展,我该如何解析IPv6头?如何跳过未知扩展名的标题,因为我不知道它的长度?
我可以这样做吗?
class A { ... };
class B : private A
{
const A &foo() const
{
return *((const A *)this);
}
};
Run Code Online (Sandbox Code Playgroud)
我可以从基类中私有地继承并将其强制转换为其基类的公共版本吗?如果没有虚拟方法,我可以这样做吗?
我的猜测是肯定的,但我想确保它安全/便携.