Я хочу создать сайт, на котором пользователи могут тестировать регулярные выражения (их уже много … например, это: http://www.pagecolumn.com/tool/pregtest.htm ). В принципе, пользователь предоставляет регулярное выражение и некоторый образец текста, и результаты оценки регулярного выражения будут возвращаться обратно.
Я хочу оценить регулярное выражение на стороне сервера с помощью функций PHP preg_ *. Есть ли способ дезинфицировать поставляемое регулярное выражение? Какие уязвимости безопасности я должен беспокоить?
Я думаю, что PHP сам проверит регулярное выражение. Вот пример сценария, который я сделал:
// check for input, and set max size of input if(@!empty($_POST['regex']) && @!empty($_POST['text']) && strlen($_POST['regex'])<1000 && strlen($_POST['text'])<2000 ){ // set script timeout in case something goes wrong (SAFE MODE must be OFF) $old_time=ini_get('max_execution_time'); if(!set_time_limit(1)) die('SAFE MODE MUST BE OFF'); // 1 sec is more then enough // trim input, it's up to you to do more checks $regex=trim($_POST['regex']); // don't trim the text, it can be needed $input=$_POST['text']; // escape slashes $regex=preg_replace('/([\\/]+)?//', '\/', $regex); // go for the regex if(false===$matched=@preg_match('/'.$regex.'/', $input, $matches)){ // regex was tested, show results echo 'Matches: '.$matched.'<br />'; if($matched>0){ echo 'matches: <br />'; foreach($matches as $i => $match){ echo $i.' = '.$match.'<br />'; } } } // set back original execution time set_time_limit($old_time); }
В любом случае, НИКОГДА НЕ используйте eval () с введенными пользователем строками .
Кроме того, вы можете сделать некоторые простые минималистичные санитарии, но это зависит от вас. 😉
Если вы разрешаете пользовательские значения для preg_replace
убедитесь, что вы запретили флаг e
! Не делать этого может позволить злоумышленнику удалить весь ваш сайт или, что еще хуже.
В противном случае самое худшее, что может случиться, – это то, что уже указывают другие ответы. Установите минимальный тайм-аут сценария, и, возможно, вам стоит даже убедиться, что страницу можно назвать только X раз в минуту.
Единственная проблема, о которой я могу думать, это то, что кто-то может DOS вы вставляете плохое регулярное выражение (то есть O (2 ^ n) или O (n!) Или что-то еще), и самый простой способ предотвратить это может заключаться в том, чтобы установить короткий тайм-аут страницы.
Если регулярное выражение хранится в базе данных, вы должны использовать любой метод, который вы обычно использовали бы для удаления данных, таких как подготовленные операторы.
В противном случае, моя единственная проблема заключается в том, что пользователь может предоставить вредоносное регулярное выражение в том смысле, что он может содержать многозначное сложное регулярное выражение, и я не уверен, что есть способ проверить это.
Одна мысль состоит в том, что вы можете сделать ваш оценщик regex всей клиентской стороной, выполнив его в JS, но есть несоответствия между прег-функциями php и функциями JavaScript regex.
Afaik теперь «уязвимости» при попытке оценить пользовательские регулярные выражения. Самое худшее, что может произойти, – как указывает Эрик, – атака DOS или фатальная ошибка в вашем скрипте.
Я боюсь сказать вам, что вы не будете (даже теоретически) способны «санировать» все возможные регулярные выражения. Лучшее, что вы можете сделать, это проверить наличие лексических и / или синтаксических ошибок.