Доказательство функции не имеет правильной проверки ввода

Эта проблема:

У меня есть этот искусственный пример функции:

def test_function(target, words):
    pattern = re.compile(r"|".join(words))

    return bool(pattern.search(target))

который берет список слов и динамически создает шаблон регулярного выражения без надлежащего экранирования слов в списке.

Образцы использования:

text = "hello world!"

print(test_function(text, ["test"]))  # prints False
print(test_function(text, ["hello"]))  # prints True
print(test_function(text, ["test", "world"]))  # prints True

Вопрос:

Как я могу протестировать эту функцию, чтобы доказать, что нет правильного экранирования регулярного выражения или очистки входных данных?

Другими словами, какие предметы в words список я должен предоставить, чтобы "сломать" эту функцию?


Я попробовал несколько "злых" регулярных выражений, чтобы симулировать катастрофический откат и заставить функцию зависать как (x+x+)+y или же (a+)+, но функция просто возвращает False мгновенно и нет признаков проблемы.

1 ответ

Решение

Есть много способов сделать это. Например, слово, которое не является допустимым регулярным выражением:

>>> test_function('a', ['*'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 2, in test_function
  File "/usr/lib64/python2.6/re.py", line 190, in compile
    return _compile(pattern, flags)
  File "/usr/lib64/python2.6/re.py", line 245, in _compile
    raise error, v # invalid expression
sre_constants.error: nothing to repeat

или слово, которое соответствует всему как регулярное выражение:

>>> test_function('a', ['.*'])
True

или слово, которое не соответствует регулярному выражению:

>>> test_function('$^', ['$^'])
False

или слово, которое заканчивается на обратной косой черты и ускользает от |:

>>> test_function('a', ['\\', 'a'])
False

Катастрофический откат работает тоже:

>>> test_function('a'*100, ['(a+)+b'])
# Hangs.
Другие вопросы по тегам