从数据包看工程师应该注意的编程习惯

来源:互联网 发布:中信出版的经管 知乎 编辑:程序博客网 时间:2024/04/29 10:36

  以下所讲的内容是我在协议分析的过程中遇到的,但是确实是值得我们攻城狮思考的问题。即从数据流中反应程序员的习惯问题。

  在协议分析的过程之中,配置正则的时候有很多奇怪的现象,比如在配置Host头域的时候的,使用了全局通用的规则(H|h)ost:(\x20),一开始的时候偶非常疑惑为什么这么写。印象之中HTTP的头域都是大写开头的,这里为什么还要小写呢?回头在查看HTTP1.1发现RFC2616中原话是这样说道Each header field consists of a name followed by a colon(":") and the field value.Field names are case-insensitive. The fieldvalue MAY be preceded by any amount of LWS,though a single SP is preferred,意思是头域属性是大小写不敏感的,然后在冒号之后最好能加一个空格。RFC给出了一个指导性的意见,大小写不敏感,但是在RFC源文档中所有的头域默认都是大写开头的,而且较长的头域名使用了下划线风格的大写模式。其实这是一种习惯或者书写风格吧,使用过面向对象编程的人都会了解,在面向对象的编程风格中类一般都是大写开头的,而且camel-case风格应用很广泛。文中还提到了最好能够在冒号之后加一个空格,这是一个建议,并没有强制要求。在《clean code》以及《编写可读代码的艺术》这两本书中也都多次提到类似的建议(空格和camel-case风格),这说明了原文RFC提到的是一种良好的书写习惯。不是有一种说法建议我们要遵循团队的编码规范,同理,我们在写HTTP相关程序的时候,最好能够参考一下HTTP的RFC。

 回到开头提到的问题我们配置'h'的原因恰恰是因为有的程序员在设置头域的时候写了"host"而不是"Host",为了能够识别全面,我们当然得考虑到这种情况。其实这种情况很多程序员未必会遇到,原因是很多的开发基于已有的框架可能在Host等常用的头域都会给你设置好了,你只要填写相关的值就可以,但是在遇到非标准的头域的时候比如X-Requested-With的时候,如何去添加该头域就能体现出一个人的习惯来。

  还有一点就是是我在抓包的过程中遇到了就是,有的程序中缺少(H|h)ost:(\x20)中的空格即类似于Host:careland.com.cn这种形式,这个问题虽然并没有困扰我很长时间,但是一度令我很纠结,命名规则配置很正确,为什么引擎不能识别。原因就是空格就在那里,看不看得见是你自己的事,真是囧。

 上述所遇到的问题不能说写这个程序的人书写的代码功能有问题,但是反应的却是一种书写习惯或者说是所有编写与HTTP相关程序的程序员应该阅读一下RFC2616,参考一下标准给出的建议以及文档中的书写习惯。在与同事的交流过程中我了解到,在分析国外的一些应用,他们的头域书写的非常规范,类似的问题很少。但是国内的应用总会出现一些比较奇怪的首部域。这倒说明不了国外的程序员算法能力比我们强上多少,相反我们高校的ACM队伍在决赛中经常夺冠,前50名的有很多是中国参赛队。这说明的是一种程序的书写习惯,要不然《cleancode》以及《编写可读代码的艺术》都是老外写的,这方面我们只能翻译别人的,很少有自己的原创。我们现在在做代码的走查和重构,上述所提到的问题很少会被提出来,毕竟看似影响不大,但是在编写程序的过程中,建议能够严格遵守某一种良好的习惯。

0 0
原创粉丝点击