密文格式:TIMESTAMP ID   VER  CMD      DATALEN  data    CRC32
密文内容:00000021  4354 03e9 000003ea 00000005 1e5a4   e9297e55比如读入时间戳内容00000021,发现验证未通过,那么,该密文是无效的,需要把后续读进来的“4354 03e9 000003ea 00000005 1e5a4   e9297e55” 这些内容过滤掉,否则的话,会误把接下去的流当作下一次的密文,也就是会误理解成这种格式:密文内容:435403e9  0000 03ea 00000005 1e5a4e92 97e55......
大家应该已经看到了,上面的红色字体和下面的红色字体内容是一样的,形成这个bug的原因是未有把后续的部分字节给过滤掉,
所以我们的问题是如何过滤掉未通过验证的密文的后续字节,而后续字节的长度又是不确定的,因为的data未知。
不知哪位高手有方法?高分期待中...

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【jiangguilong2000】截止到2008-07-27 03:25:58的历史汇总数据(不包括此帖):
    发帖的总数量:15                       发帖的总分数:630                      每贴平均分数:42                       
    回帖的总数量:15                       得分贴总数量:1                        回帖的得分率:6%                       
    结贴的总数量:9                        结贴的总分数:310                      
    无满意结贴数:2                        无满意结贴分:40                       
    未结的帖子数:6                        未结的总分数:320                      
    结贴的百分比:60.00 %               结分的百分比:49.21 %                  
    无满意结贴率:22.22 %               无满意结分率:12.90 %                  
    楼主加油
      

  2.   

    还有个问题,如何对付垃圾密文(有两种,1种是格式不正确,一种是格式正确,但是验证不通过,比如时间戳,CRC校验)对服务器进行通信,也就是验证未通过的话,如何过滤掉该密文后续的流字节?
      

  3.   

    还是如果验证一旦未通过就直接把socket连接断掉?
      

  4.   

    不定长数据的话
    你应该在协议的顶端加入一个长度标识
    密文内容:00000021  4354 03e9 000003ea 00000005 1e5a4  e9297e55 在数据首加入4个字节的标识,用来表示数据的长度,根据这个长度来收你的密文
    密文内容:[00][00][00][ff] 00000021  4354 03e9 000003ea 00000005 1e5a4  e9297e55 
      

  5.   

    目前我所实现的方式是:当验证未通过就断开socket连接(如果是TCP传送,正常的client不会发非法包,既然不是正常的client,很有可能是人家在研究你的协议,不cut了他干嘛)
      

  6.   

    哦,买高的。如果我没有看错的话,你的报文格式里面有DATALEN这个字段。这个字段的作用,我想大家都知道的,你可以根据这个字段的含义来判断后续数据的长度。
    TIMESTAMP ID  VER  CMD   DATALEN 这五个字段,应该是定长的,你现在,先处理TIMESTAMP字段,如果不合法,就读取ID  VER  CMD   DATALEN这
    四个字段,但是ID  VER  CMD 这三个字段不做处理,根据DATALEN的信息读取data    CRC32 两个字段的信息,但是也不做处理。然后是读取下一个报文。
    如果TIMESTAMP合法,也会读取每个字段,但是,每个字段都做处理。我的解释,应该够详细了把。
    至于不按协议的非法包,怎样判断,一般是通过TIMESTAMP ID  VER这三个字段来觉得的,如果TIMESTAMP ID  VER这三个字段联合起来不合法,就会断掉
    Socket连接,而其中某个字段不合法的情况下,可以断开连接,也可以想我上面说的那样来处理。
      

  7.   

    厉害厉害!果然是高手,我的读取方式完全如你解释的那样,我目前改进了一点读取的方式,就是[TIMESTAMP ID  VER  CMD DATALEN]这几个字节一次性读进来,再一一验证,如果中间验证通不过,就断开socket连接,通过的话再根据DATALEN读取DATA,然后进行CRC32验证,这样做理论上应该会相对效率高一些,比起这种方式:读取TIMESTAMP-->验证-->读取ID-->验证-->读取VER-->验证.... 不知你觉得合理不合理?但我不是很理解你的这句的意思“如果TIMESTAMP ID  VER这三个字段联合起来不合法,就会断掉 
    Socket连接,而其中某个字段不合法的情况下,可以断开连接,也可以想我上面说的那样来处理。 

    “断掉Socket连接”与“断开连接”应该一样的意思吧?还有我觉得你说的可以根据上面你说的“先把整个报文都读进来,然后在进行判断。不合法的报文不做处理就可以”,我觉得不是很合理,为什么?如果在DATALEN这个字段非法包正好显示后面的DATA数据为1G长度呢?那岂不是要让客户端狂读狂读再狂读?