📜  Python|可疑编码的 C 字符串 |第 2 组(1)

📅  最后修改于: 2023-12-03 15:19:18.939000             🧑  作者: Mango

Python可疑编码的C字符串 |第2组

简介

Python的某些C扩展库中的可疑编码C字符串是一种在C代码中使用的字符串编码方式,该编码方式包含二进制字节序列,其中一些字节可能会被视为NULL终止符。 由于使用此编码会导致一些潜在的安全问题,因此Python解释器的某些版本中添加了一个限制,以强制使用安全的传统C字符串格式。

解决方案

根据Python文档,以下是检测和修复C扩展库中的可疑编码C字符串的解决方案:

  1. 通过使用Python解释器的-DPy_UNICODE_SIZE=2编译器选项重新编译库。
  2. 通过创建文件“sitecustomize.py”并将其放置在Python路径的某个位置(例如/usr/local/lib/pythonX.X/sitecustomize.py),可以在Python解释器初始化期间导入模块。此文件应包含以下内容:
import sys
import warnings

def warn_about_bad_c_strings(filename, warning_msg):
    with open(filename, 'rb') as f:
        data = f.read()
        if b'\0' in data and not data.endswith(b'\0'):
            warnings.warn(warning_msg + ' (%r)' % filename, RuntimeWarning)
 
def _warn_about_bad_c_strings_in_stdlib():
    if sys.platform == 'win32':
        return
    stdlib_dir = os.path.join(sys.base_prefix, 'lib', 'python%d.%d' %
                              sys.version_info[:2])
    if os.path.exists(stdlib_dir):
        for root, dirs, files in os.walk(stdlib_dir):
            for filename in files:
                if filename.endswith('.py') or filename.endswith('.pyc'):
                    fullpath = os.path.join(root, filename)
                    warn_about_bad_c_strings(fullpath, 'Bad C extension string')

_warn_about_bad_c_strings_in_stdlib()

此文件确保从Python所附带的任何C扩展库导入的模块中的“可疑编码C字符串”不会被认为是安全的。

结论

Python中使用的可疑编码的C字符串可能导致潜在的安全问题。 为了解决这个问题,可以通过重新编译C扩展库、使用特定的编译器选项或在库导入期间使用自定义模块来修复这个问题。 我们强烈建议程序员在编写C编写Python扩展时尽可能避免使用这种可疑的编码方式。