Строгое декодирование Python2 base64 по-прежнему тихо игнорирует недопустимые символы - PullRequest
0 голосов
/ 05 марта 2019

По какой-то причине я не могу получить следующий фрагмент кода с ошибкой, хотя и должен.

Вызов функции декодирования base64 в python2 decodestring с непечатными символами, однако я ожидаю, что возникнет исключение:

In [1]: import base64

In [2]: base64.decodestring("\x01\x01\x01")
Out[2]: ''

Для сравнения, использование метода класса строки дает тот же результат:

In [7]: "\x01\x01\x01".decode("base64")
Out[7]: ''

Однако выполнение эквивалента для hex действительно обеспечит ожидаемое поведение (обратите внимание, что дополнительный символ был добавлен ввыровняйте по кратным двум, как и ожидалось шестнадцатеричным декодером):

In [9]: "\x01\x01\x01\x01".decode("hex")
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-9-1e73b7069a1d> in <module>()
----> 1 "\x01\x01\x01\x01".decode("hex")

/usr/lib/python2.7/encodings/hex_codec.pyc in hex_decode(input, errors)
     40     """
     41     assert errors == 'strict'
---> 42     output = binascii.a2b_hex(input)
     43     return (output, len(input))
     44

TypeError: Non-hexadecimal digit found

Несколько других попыток доказали, что встречается такое поведение, что декодер base64, в частности, игнорирует любые недопустимые символы вместоподнятия ошибки.Такое поведение наблюдается, хотя документально подтверждено, что декодер поддерживает только режим строгой обработки ошибок по умолчанию:

In [11]: "\x01\x01\x01".decode("base64", errors="ignore")
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-11-e0b65726a302> in <module>()
----> 1 "\x01\x01\x01".decode("base64", errors="ignore")

/usr/lib/python2.7/encodings/base64_codec.pyc in base64_decode(input, errors)
     39
     40     """
---> 41     assert errors == 'strict'
     42     output = base64.decodestring(input)
     43     return (output, len(input))

AssertionError:

Такое поведение также наблюдается независимо от метода, используемого для выполнения встроенного кодека base64, который связан с python2.7.

Кроме того, любой действительный символ будет обработан должным образом, что приведет к странным результатам, таким как:

In [6]: base64.decodestring("\x01\x01\x01\x01\x01AA==")
Out[6]: '\x00'

In [7]: base64.decodestring("\x01A\x01A\x01=\x01=\x01A")
Out[7]: '\x00'

In [8]: base64.decodestring("\x01Not\x01A\x01Base64\x01String\x01")
Out[8]: '6\x8b@\x05\xab\x1e\xeb\x84\xad\xae)\xe0'

Мой вопрос состоит из двух частей:

  1. Правильно ли я анализирую это поведение?
  2. Почему это поведение реализовано вместо соответствия другим кодекам и errors="strict" API?

1 Ответ

1 голос
/ 05 марта 2019

base64 был изобретен, чтобы разрешить инкапсуляцию двоичных файлов в текстовые протоколы.Эти протоколы могут иметь другие ограничения, такие как максимальный размер строки, который требуется для вставки конца строки в строки, закодированные в base64.Чтобы быть максимально терпимым при вводе, многие декодеры решили просто игнорировать любые непечатаемые символы.

Именно так был разработан модуль Python base64.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...