У нас есть REST API для запроса записей в MongoDB. Очень просто, примерно следующее:
GET /api/items?q=foo
Во время разработки было удобно разрешить регулярные выражения в качестве запроса q. Мы бы просто передали параметр запроса оператору MongoDB $regex и не выполняли никаких экранирований:
db.getCollection('items').find({ name: { $regex: req.query.q, $options: 'i' } });
Таким образом, у нас есть очень гибкий и удобный способ запроса наших данных. Теперь, когда все становится «серьезным», то есть ближе к производству, я спрашиваю себя о последствиях для безопасности. Может ли кто-нибудь отправлять запросы «DoS» с дорогостоящим обратным отслеживанием?
Я, вероятно, недостаточно деструктивен, чтобы придумать такой запрос, поэтому я поискал в Интернете и наткнулся на очень интересное чтение, в котором упоминается несколько атак: Взрывная ловушка квантификатора.
Отбросив тот факт, что упомянутые запросы на приведенной выше странице ведут себя далеко не «катастрофически», как ожидалось (ни в запросах MongoDB, ни в онлайн-инструментах, таких как regex101.com), я все же хотел бы знать:





Мое довольно личное чутье говорит: не беспокойтесь. Но опять же, если вам все же или даже нужно, то вот несколько советов, как справиться с этим требованием:
Какие-нибудь библиотеки? Я не уверен, но понимание того, что такое ReDoS-атака, поможет создать свои собственные условия. Более того, запрет кластеров, таких как захватывающие или не захватывающие группы, снизит этот риск. Вам также могут не понадобиться регулярные выражения, но некоторые шаблоны, такие как некоторые расширения, например,
*или?.