Повторяемый вход
Также существуют угрозы от повторного ввода, то есть повторения одного и того же ключа с разными значениями. Если вы получили электронное письмо со следующими заголовками, как его отобразит ваш почтовый клиент?
From: Darth Sideous
From: Darth Sideous
From: Senator Palpatane
Очевидно, что это вопрос с подвохом. Все мы знаем, что ситхи слишком сварливы, чтобы делиться доступом на sith.org. Но дело не в этом. Настоящая хитрость заключается в том, что не существует правильного ответа в том смысле, что, даже если ответ содержится в некотором стандарте, ваш почтовый клиент может ему не соответствовать.
Некоторые синтаксические анализаторы будут искать адрес отправителя и останавливаться, когда найдут его. Другие будут анализировать заголовки до конца и просто перезаписывать ранние значения поздними. Современная библиотека может иметь такой метод, как parseheaders(), который возвращает словарь пар (имя, значение). Внутри этого метода словарь, скорее всего, создается путем взятия каждой строки, разбиения ее на имя и значение и вставки в словарь, возможно, с проверкой перезаписи (что приводит к сохранению первого значения) или без нее (что приведет либо к перезаписи, либо к значению, являющемуся набором значений).
Тем не менее другие синтаксические анализаторы могут выделить или токен ‘^From’, или токен ‘From:’ (Да, с конечным двоеточием или без него. Один из них является конвертом SMTP, который использовали старые почтовые серверы; другой – заголовок SMTP.)
Двусмысленные типы
Программы принимают ввод разными способами, включая стандартный или ввод из файлов, которые они явно открывают. Многие из них либо случайно, либо злонамеренно двусмысленны или переопределены. Например, когда имя файла начинается с тире, как предоставить его в качестве аргумента командной строки? («Как удалить файл с именем «-f»?») Неоднозначная семантика означает, что у программ должен быть способ устранять эту неоднозначность. Когда мы хотим помочь программе, мы можем использовать путь типа «./-f», а когда злоумышленник хочет ее запутать, он может использовать переопределение смысла.
Аналогичная проблема может возникнуть с файлами с точкой с запятой в именах или другими символами, которые оболочка обрабатывает как специальные. (Чтобы посмеяться, создайте файл с косой чертой в имени в Windows и поделитесь этой файловой системой с Unix-клиентом, если вам будет не лень перезагружать систему.) Проблема определения типа по входным данным является проблемой для Excel, поскольку гены официально переименовываются, чтобы Excel не рассматривал их как даты. Membrane Associated Ring-CH-Type 1 – это уже не March1, а MarchF1 [Whitwam, 2020].
Если специальные символы, такие как точка с запятой или обратный апостроф, являются разделителями команд, то оболочка может рассматривать оставшуюся часть имени как команду для выполнения. Это может произойти с именами файлов, переменными среды или другими входными данными.
Длина и счетчики
Невозможность проверки длины была ключевым недостатком безопасности в строковых функциях C. Старый код, предполагающий, что char – это байт, то есть символ, может быть сбит с толку при столкновении с Юникодом.
С целочисленной математикой связано много проблем: потери значимости, переполнения и преобразования типов, которые случаются, когда вы принимаете числа от клиентов.
Очень скоро вы столкнетесь с системами с вложенной информацией о длине, и вам придется решить, что делать, если сумма частей не совпадает с длиной контейнера. Например, прекращаете ли вы синтаксический анализ на длине содержимого HTTP-ответа или продолжаете до тех пор, пока не достигнете тега