C输出大于127的ACSII字符
2014-11-06 11:11
260 查看
近期,我们的DNS服务器收到了一些异常的域名请求,从访问日志看到很多域名都被返回了FORMAT ERROR的错误码,但是访问日志中的域名看起来很正常啊,为什么会返回FORMAT ERROR的错误码呢?
经过一系列排查,找到了直接原因。
问题在于我们收到的一些DNS消息包的请求域名中含有值大于127的字符。下面是该非法域名中其中一个label的十六进制数据:
0x09, 0x74, 0x61, 0x6f, 0x62, 0xe1, 0x6f, 0x63, 0x64, 0x6e.
可以看到,中间有一个0xe1,它的值是225,它在终端上是不可打印的字符。包含这样的字符的域名会被我们认为是非法的域名,所以返回了FORMATERROR,但是为什么访问日志中看不到这个字符呢?让我们做个实验看一下:
上面的代码会打印出什么呢?理论上它会打印出"taob?ocdn",其中的"?"是那个0xe1在终端输出的样子,但是实际上它的输出是:
可以看到,输出时,0xe1以及其后的三个字符都没有被输出到终端。所以我们在访问日志中看到的是一个合法的域名。。。。
这里有对这个问题的详细讨论。
对于不可打印的ASCII码,如果将它们输出到终端,它们的行为是跟终端的字符编码有关。所以最保险的方法是,对于不可打印的那些ASCII码,做一下特殊处理,因为如果将它们输出到终端的话,你看到的不一定是实际的内容。
经过一系列排查,找到了直接原因。
问题在于我们收到的一些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, '\0'}; printf("%s\n", s); return 0; }
上面的代码会打印出什么呢?理论上它会打印出"taob?ocdn",其中的"?"是那个0xe1在终端输出的样子,但是实际上它的输出是:
taobn
可以看到,输出时,0xe1以及其后的三个字符都没有被输出到终端。所以我们在访问日志中看到的是一个合法的域名。。。。
这里有对这个问题的详细讨论。
对于不可打印的ASCII码,如果将它们输出到终端,它们的行为是跟终端的字符编码有关。所以最保险的方法是,对于不可打印的那些ASCII码,做一下特殊处理,因为如果将它们输出到终端的话,你看到的不一定是实际的内容。
相关文章推荐
- 读写二进制时,怎么将ASCII码大于等于128的char字符转换为16进制输出
- 不同的取法输出顺序可以不考虑。取字符( 从标准输入读入一个由字母构成的串(不大于30个字符)。从该串中取出3个不重复的字符,求所有的取法。取出的字符,要求按字母升序排列成一个串。)
- 从标准输入读入一个由字母构成的串(不大于30个字符)。从该串中取出3个不重复的字符,求所有的取法。取出的字符,要求按字母升序排列成一个串。不同的取法输出顺序可以不考虑。
- 在Qt中怎样显示ASCII码大于127的字符
- 输入字符串,输出不大于3个的不重复的字符
- 读入一个字符串(长度不大于100,不包括换行符’\n’),删去字符串中相同的排在后面的字符并输出。
- 输出大于80字符数的行
- 中文字符的整数形式大于127
- 在单片机向上位机串口助手发送asc码大于127的字符,串口助手上显示乱码!
- 让VC控制台窗口输出ASCII码大于128的字符
- 在Qt中怎样显示ASCII码大于127的字符
- C语言-将输入的字符输出并将多个空格按照一个空格的方式输出
- servlet---知识点深化---重定向/转发/字节流字符流共存问题/多个servlet输出问题/请求包含
- IO流_输出语句用字符缓冲流改进
- 输入三个字符串,按由小到大的顺序输出
- 面试题:输入字符串,字符个数,输出拆分结果
- 关于在asp.net后台输出提示字符串的时候显示的字符提示出错的问题
- 实验10指针2(1)输入一个字符串和一个正整数x,将该字符串中的后x个字符复制到另一个字符串y中,输出字符串y;再对y串的内容前后倒置后存入数组z中并输出。
- Java字节流与字符流联系和不同,以及输入流和输出流
- 如何检查字符是否是整数并输出其整数值