Я хочу создать веб-сайт, где пользователи могут протестировать регулярные выражения (существуют многие там уже..., такие как этот: http://www.pagecolumn.com/tool/pregtest.htm). В основном пользователь обеспечивает регулярное выражение и некоторый демонстрационный текст, и результатами regex оценки плюнут назад.
Я хочу оценить regex на стороне сервера с PHP "preg_ *" функции. Существует ли способ санировать предоставленный regex? Каковы уязвимости системы обеспечения безопасности, которыми я должен быть обеспокоен?
Я думаю, что 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 !) или что-то еще), и самый простой способ предотвратить это может заключаться в сокращении тайм-аута страницы.
Если регулярное выражение хранится в базе данных, вы должны использовать любой метод, который вы обычно используете для экранирования данных, например подготовленные операторы.
В противном случае меня беспокоит только то, что пользователь может предоставить вредоносное регулярное выражение в том смысле, что оно может содержать заведомо сложное регулярное выражение, и я не уверен, что есть способ это проверить.
Можно подумать, что вы можете сделать свой оценщик регулярных выражений полностью на стороне клиента, сделав это на JS, но есть несоответствия между функциями preg php и функциями регулярных выражений JavaScript.
Теперь есть «уязвимости» при попытке оценить регулярные выражения, задаваемые пользователем. Худшее, что может случиться, - как указывает Эрик - это DOS-атака или фатальная ошибка в вашем скрипте.
Боюсь вам сказать, что вы не сможете (даже теоретически) «дезинфицировать» все возможные регулярные выражения. Лучшее, что вы можете сделать, - это проверить лексические и / или синтаксические ошибки.