为了方便分布式,扫描器的运行环境用Dockerfile编译的。测试的时候是mac + python3.5.3,本地测试完成上线(docker ubuntu + python3.5.2)后,发现报错(下图为部分报错信息):
似乎是因为URL里有中文,才导致的转码失败。但老夫已经聊发少年狂,从Python2 切换到了 Python3,为何还会有这种错误?!
为了方便测试,把报错的代码单独拉出来,如下:
但在复现漏洞的时候,发现漏洞只能在docker的运行环境里复现,mac + python3.5.3 和 ubuntu + python 3.5.2都不存在问题。
一番搜索之后,找到了问题所在:
在mac下执行同样的命令:
Python 的编码问题一直饱受诟病。虽然在Python3的版本做了一些变动,默认编码形式由 ASCII 改为 utf-8。**但在与操作系统底层进行交互(subprocess.Popen)的时候,还是会调用系统的编码。**而我们传进去的中文是以 utf-8 进行编码的,在docker运行环境里,系统默认编码为 ANSIX_X3.4-1968,所以导致了解码错误。
解决方案:
1)从dockerfile编译镜像的时候指定系统编码
2)给subprocess传参的时候,先转码为bytes格式(绕过系统的编码转换过程)
参考资料:
https://www.binss.me/blog/solve-problem-of-python3-raise-unicodeencodeerror-when-print-utf8-string/