Есть ли проблемы с безопасностью, если я запускаю пользовательское регулярное выражение на моем сервере с пользовательской входной строкой? Я не спрашиваю об одном языке, но на любом языке действительно, с PHP как одним из основных языков, о которых я хотел бы знать.Определенные пользователем проблемы безопасности регулярных выражений
Например, если у меня есть код ниже:
<?php
if(isset($_POST['regex'])) {
preg_match($_POST['regex'], $_POST['match'], $matches);
var_dump($matches);
}
?>
<form action="" method="post">
<input type="text" name="regex">
<textarea name="match"></textarea>
<input type="submit">
</form>
Обеспечение это не контролируемая среда (то есть пользователь может не быть доверенным), каковы риски приведенном выше коде? Если аналогичный код написан для других языков, существуют ли риски на этих других языках? Если да, то какие языки содержат угрозы?
Я уже узнал о «злых регулярных выражениях», однако, независимо от того, что я пытаюсь использовать на своем компьютере, они, похоже, работают нормально, см. Ниже.
PHP
<?php
php > preg_match('/^((ab)*)+$/', 'ababab', $matches);var_dump($matches);
array(3) {
[0] =>
string(6) "ababab"
[1] =>
string(0) ""
[2] =>
string(2) "ab"
}
php > preg_match('/^((ab)*)+$/', 'abababa', $matches);var_dump($matches);
array(0) {
}
JavaScript
phantomjs> /^((ab)*)+$/g.exec('ababab');
{
"0": "ababab",
"1": "ababab",
"2": "ab",
"index": 0,
"input": "ababab"
}
phantomjs> /^((ab)*)+$/g.exec('abababa');
null
Это приводит меня к мысли, что PHP и JavaScript имеют отказоустойчивый механизм злыми регулярных выражений. Исходя из этого, я бы хотел, чтобы другие языки имели схожие функции.
Это правильное предположение?
И, наконец, для любых или всех языков, которые могут быть вредными, существуют ли способы убедиться, что регулярные выражения не нанесли урон?
Эти регулярные выражения являются злыми при использовании на злонамеренно обработанных, очень длинных строках. – SLaks
С модификатором 'e' (в PHP) что-то будет оценено (чего вы, вероятно, не хотите), см. [Руководство] (http://www.php.net/manual/en/reference.pcre.pattern .modifiers.php) – kero
@SLaks, когда вы говорите «длинные строки», любая идея о том, как долго мы говорим? –