В настоящее время мы создаем приложение, которое выполняет ряд внешних инструментов. Нам часто приходится передавать информацию, введенную пользователями в нашу систему, этим инструментам.
Очевидно, это большой кошмар безопасности, ожидающий наступления.
К сожалению, мы еще не нашли классов в .NET Framework, которые выполняют программы командной строки, обеспечивая такую же защиту от атак внедрения, как объекты IDbCommand для баз данных.
В данный момент мы используем очень примитивную подстановку строк, которая, как я подозреваю, является недостаточной:
protected virtual string Escape(string value)
{
return value
.Replace(@"\", @"\\")
.Replace(@"$", @"\$")
.Replace(@"""", @"\""")
.Replace("`", "'")
;
}
Что вы, ребята, делаете, чтобы предотвратить атаки с использованием командной строки? Мы планируем внедрить регулярное выражение, которое будет очень строгим и пропускает только очень маленькое подмножество символов, но мне было интересно, есть ли лучший способ.
Некоторые уточнения:
- Некоторые из этих инструментов не имеют API, против которых мы можем программировать. Если бы они это сделали, у нас не было бы этой проблемы.
- Пользователи не выбирают инструменты для выполнения, они вводят метаданные, которые используют выбранные нами инструменты (например, ввод метаданных, таких как уведомления об авторских правах, в целевые файлы).