Gsoap文件传输抓包分析
用网络抓取网络数据包,将数据包内容与实际的cid文件进行对比。
发现Gsaop进行文件传输时,将文件进行转义变换。
转义的内容有:
< | < | 小于号 |
> | > | 大于号 |
& | & | 和 |
' | ' | 单引号 |
" | " | 双引号 |
(详情可参考:)
可见GSoap和java框架在进行文件传输时,会对文件内容进行转义。
Gsoap源码分析
Gsoap支持特殊字符的自动转义。Gsoap是完全开源的。我们从中截取到了转义的代码:
const char * xstring(const char *s){size_t n;char *t;const char *r;for (n = 0, r = s; *r; n++, r++){ if (*r < 32 || *r >= 127)n += 4;else if (*r == '<' || *r == '>')n += 3;else if (*r == '&')n += 4;else if (*r == '"')n += 5;else if (*r == '\\')n += 1;}r = t = (char*)emalloc(n + 1);for (; *s; s++){ if (*s < 32 || *s >= 127){ sprintf(t, "&#%.2x;", (unsigned char)*s);t += 5;}else if (*s == '<'){ strcpy(t, "<");t += 4;}else if (*s == '>'){ strcpy(t, ">");t += 4;}else if (*s == '&'){ strcpy(t, "&");t += 5;}else if (*s == '"'){ strcpy(t, """);t += 6;}else if (*s == '\\'){ strcpy(t, "\\\\");t += 2;}else*t++ = *s;}*t = '\0';return r;}
解决方案
建议终端按从Gsaop中截取的代码对文件读取部份进行改造。