Регулярные выражения — это запах кода. Иногда также уязвимость
TL;DR: постарайтесь свести к минимуму рекурсивные правила регулярных выражений.
Проблемы
- Проблемы с безопасностью
- Читабельность
- Преждевременная оптимизация
Решения
- Покройте случаи тестами, чтобы увидеть, остановятся ли они
- Используйте алгоритмы вместо регулярных выражений
- Добавить обработчики тайм-аута
Контекст
Это известно как атака ReDos, подтип атаки отказ в обслуживании.
Атаки ReDoS можно разделить на два типа:
Приложению передается строка со злым шаблоном. Затем эта строка используется как регулярное выражение, что приводит к ReDoS.
Приложению передается строка с форматом векторной атаки. Затем эта строка оценивается уязвимым регулярным выражением, что приводит к ReDoS.
Образец кода
Неправильный
package main import ( "regexp" "fmt" ) func main() { var re = regexp.MustCompile(`^(([a-z])+.)+[A-Z]([a-z])+$`) var str = `aaaaaaaaaaaaaaaaaaaaaaaa!` for i, match := range re.FindAllString(str, -1) { fmt.Println(match, "found at index", i) } }
Верно
package main import ( "fmt" "strings" ) func main() { var str = `aaaaaaaaaaaaaaaaaaaaaaaa!` words := strings.Fields(str) for i, word := range words { if len(word) >= 2 && word[0] >= 'a' && word[0] <= 'z' && word[len(word)-1] >= 'A' && word[len(word)-1] <= 'Z' { fmt.Println(word, "found at index", i) } } }
Обнаружение
[X] Полуавтоматический
Многие языки избегают такого рода регулярных выражений.
Мы также можем сканировать код этой уязвимости.
Теги
- Безопасность
Заключение
Регулярные выражения сложны и трудны для отладки.
Мы должны избегать их, насколько это возможно.
связи
Больше информации
Катастрофический возврат: как регулярное выражение может вызвать ReDoS-уязвимость?
Неуправляемые регулярные выражения: катастрофический возврат
Отказ от ответственности
Code Smells — это всего лишь мое мнение.
Кредиты
Фото автора engin akyurt на Unsplash
Некоторые люди, сталкиваясь с проблемой, думают: "Я знаю, я буду использовать регулярные выражения". Теперь у них две проблемы.
Джейми Завински
Эта статья является частью серии CodeSmell.