В Perl есть опция taint, которая считает весь пользовательский ввод "испорченным", пока он не будет проверен с помощью регулярного выражения. Испорченные данные можно использовать и передавать, но они портят любые данные, с которыми они соприкасаются, до тех пор, пока они не будут сохранены. Например, если пользовательский ввод добавляется к другой строке, новая строка также портится. По сути, любое выражение, содержащее испорченные значения, выведет испорченный результат.
Испорченные данные можно выбрасывать по желанию (портить данные по мере их поступления), но как только они используются командой, которая влияет на внешний мир, сценарий perl завершается ошибкой. Поэтому, если я использую испорченные данные для создания файла, создания команды оболочки, изменения рабочего каталога и т. Д., Perl завершится с ошибкой безопасности.
Я не знаю другого языка, который имеет что-то вроде "испорченного", но его использование было очень зрелищным. Удивительно, как быстро распространяются испорченные данные, если вы не сразу их разобрали. Вещи, которые естественны и нормальны для программиста, такие как установка переменной на основе пользовательских данных или открытие файла, кажутся опасными и рискованными с включенным заражением. Таким образом, лучшая стратегия для достижения цели состоит в том, чтобы отвязаться, как только вы получите некоторые данные извне.
И я подозреваю, что это лучший способ и на других языках: проверять пользовательские данные сразу, чтобы ошибки и дыры в безопасности не могли распространяться слишком далеко. Кроме того, должно быть проще проверять код на наличие дыр в безопасности, если потенциальные дыры находятся в одном месте. И вы никогда не сможете предсказать, какие данные будут использованы для каких целей позже.