Санитизация предоставленных пользователями регулярных выражений в PHP

Я хочу создать веб-сайт, где пользователи могут протестировать регулярные выражения (существуют многие там уже..., такие как этот: http://www.pagecolumn.com/tool/pregtest.htm). В основном пользователь обеспечивает регулярное выражение и некоторый демонстрационный текст, и результатами regex оценки плюнут назад.

Я хочу оценить regex на стороне сервера с PHP "preg_ *" функции. Существует ли способ санировать предоставленный regex? Каковы уязвимости системы обеспечения безопасности, которыми я должен быть обеспокоен?

6
задан 3 March 2010 в 13:11
поделиться

5 ответов

Я думаю, что 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 () со строками, отправленными пользователем .

Кроме того, вы можете выполнить простую минималистичную дезинфекцию, но это зависит от вас. ;)

3
ответ дан 17 December 2019 в 07:03
поделиться

Если вы разрешаете вводимые пользователем значения для preg_replace , убедитесь, что вы запрещаете e флаг ! Невыполнение этого требования может позволить злоумышленнику удалить весь ваш сайт или, что еще хуже.

В противном случае худшее, что может случиться, - это то, на что уже указывают другие ответы. Установите низкий тайм-аут скрипта и, возможно, вам даже следует убедиться, что страница может вызываться только X раз в минуту.

1
ответ дан 17 December 2019 в 07:03
поделиться

Единственная проблема, о которой я могу думать, заключается в том, что кто-то может использовать DOS для вас, введя неправильное регулярное выражение (то есть O (2 ^ n) или O (n !) или что-то еще), и самый простой способ предотвратить это может заключаться в сокращении тайм-аута страницы.

0
ответ дан 17 December 2019 в 07:03
поделиться

Если регулярное выражение хранится в базе данных, вы должны использовать любой метод, который вы обычно используете для экранирования данных, например подготовленные операторы.

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

Можно подумать, что вы можете сделать свой оценщик регулярных выражений полностью на стороне клиента, сделав это на JS, но есть несоответствия между функциями preg php и функциями регулярных выражений JavaScript.

0
ответ дан 17 December 2019 в 07:03
поделиться

Теперь есть «уязвимости» при попытке оценить регулярные выражения, задаваемые пользователем. Худшее, что может случиться, - как указывает Эрик - это DOS-атака или фатальная ошибка в вашем скрипте.

Боюсь вам сказать, что вы не сможете (даже теоретически) «дезинфицировать» все возможные регулярные выражения. Лучшее, что вы можете сделать, - это проверить лексические и / или синтаксические ошибки.

0
ответ дан 17 December 2019 в 07:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: