zoukankan      html  css  js  c++  java
  • C输出大于127的ACSII字符

       近期,我们的DNS服务器收到了一些异常的域名请求,从访问日志看到很多域名都被返回了FORMAT ERROR的错误码,但是访问日志中的域名看起来很正常啊,为什么会返回FORMAT ERROR的错误码呢?

      经过一系列排查,找到了直接原因。
      问题在于我们收到的一些DNS消息包的请求域名中含有值大于127的字符。下面是该非法域名中其中一个label的十六进制数据:

     0x09, 0x74, 0x61, 0x6f, 0x62, 0xe1, 0x6f, 0x63, 0x64, 0x6e.

    可以看到,中间有一个0xe1,它的值是225,它在终端上是不可打印的字符。包含这样的字符的域名会被我们认为是非法的域名,所以返回了FORMATERROR,但是为什么访问日志中看不到这个字符呢?让我们做个实验看一下:

    #include <stdio.h>
    
    int main()
    {
        unsigned char s[] = {0x74, 0x61, 0x6f, 0x62, 0xe1, 0x6f, 0x63, 0x64, 0x6e, ''};  
    
        printf("%s
    ", s);
        return 0;
    }
    

      上面的代码会打印出什么呢?理论上它会打印出"taob?ocdn",其中的"?"是那个0xe1在终端输出的样子,但是实际上它的输出是:

    taobn
    

      可以看到,输出时,0xe1以及其后的三个字符都没有被输出到终端。所以我们在访问日志中看到的是一个合法的域名。。。。

          这里有对这个问题的详细讨论。

         对于不可打印的ASCII码,如果将它们输出到终端,它们的行为是跟终端的字符编码有关。所以最保险的方法是,对于不可打印的那些ASCII码,做一下特殊处理,因为如果将它们输出到终端的话,你看到的不一定是实际的内容。

  • 相关阅读:
    es6之Promise
    es6之Proxy,Reflect
    js之对象
    Set,Map与Array,Object对比
    es6之数据结构 set,WeakSet,mapWeakMap
    es6之Symbol
    flex布局
    盒子模型,top和margin-top
    POJ1274-The Perfect Stall
    Codeforces 671D. Roads in Yusland 题解
  • 原文地址:https://www.cnblogs.com/cobbliu/p/4078233.html
Copyright © 2011-2022 走看看