Регулярные выражения — это запах кода. Иногда также уязвимость

TL;DR: постарайтесь свести к минимуму рекурсивные правила регулярных выражений.

Проблемы

  • Проблемы с безопасностью
  • Читабельность
  • Преждевременная оптимизация

Решения

  1. Покройте случаи тестами, чтобы увидеть, остановятся ли они
  2. Используйте алгоритмы вместо регулярных выражений
  3. Добавить обработчики тайм-аута

Контекст

Это известно как атака 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.