mysql — запустить скрипт php из записи базы данных без использования eval ()

Я хотел бы знать, как запустить сценарии php, которые хранятся в базе данных, без использования eval ().

Ожидаемый процесс заключается в следующем

Когда пользователь POST строка, которая содержит {{typed_alias }}, система будет искать в таблице, есть ли у этого псевдонима запись в alias колонка.

Если да -> заменить введенного пользователем соответствующим скриптом, который хранится в replacement колонка.

Если не -> показать оригинальную строку, включая {{ wrong_alias }}

Ожидаемый результат следующий

Когда пользователь сообщения
Здравствуйте, {{morninggg}}, текущее время Unix: {{nowTime}}

Вывод массива из дБ

массив

 0 =>
array
'ID' => 445
'alias' => 'morning'
'replacement' => 'Good morning'
1 =>
array
'ID' => 446
'alias' => 'nowTime'
'replacement' => time()
2 =>
array
'ID' => 447
'alias' => 'tommorowNow'
'replacement' => time()+86400

Вернуть

Здравствуйте, {{morninggg}}, текущее время Unix: 147855220

Теперь я уже решил массив базы данных с помощью foreach а также может заменить псевдоним сценарием с помощью str_replace(),

Текущий класс я использую для доступа к данным из базы данных и замены следующим образом

class replace {
public $definitions;

public function setDefinitions($definitions) {
$this->definitions = $definitions;
}

public function tag($input) {
if($this->definitions && is_array($this->definitions)) {
foreach ($this->definitions as $definition) {
if($defintion['alias'] == 'time') {
$input = str_replace('{{' . $definition['alias'] . '}}', date('Y-m-d'), $input);
} else {
$input = str_replace('{{' . $definition['alias'] . '}}', $definition['replacement'], $input);
}
}
}
return $input;
}
}

Текущий метод использования

$replace = new replace();
$replace->setDefinitions($tagEngine);
$parsedString = $replace->tag($__input);

//$__input is what user POST to the server

echo $parsedString;

Тем не менее, текущий результат заключается в следующем

Здравствуйте, {{morninggg}}, текущее время Unix: time ()

Скрипт не может быть успешно запущен на странице

Но когда я даю определение вручную, как это

$definition = array('morning' => 'Good Morning', 'nowTime' => time());
foreach ($definition as $key => $value)
$source = str_replace('{{' . $key . '}}', $value, $source);
return $source;

Скрипт можно запустить и вернуть

Здравствуйте, {{morninggg}}, текущее время Unix: 147855220

Я знаю что используя eval() может запускать сценарии, однако это считается опасным методом в реальных приложениях людьми.

Кто-нибудь может дать мне советы о том, как бороться с этой проблемой?

Спасибо!

1

Решение

Вы не должны использовать такие функции, как eval() чтобы исправить это. Вы должны извлечь весь php-код из вашей базы данных и проанализировать различные псевдонимы следующим образом (я только что изменил tag() метод в replace учебный класс:

public function tag($input) {
if($this->definitions && is_array($this->definitions)) {
foreach ($this->definitions as $definition) {
$replacement = $definition['replacement'];
switch($definition['alias']) {
case 'nowTime':
$replacement = date('Y-m-d');
break;
case 'tommorowNow':
$replacement = date('Y-m-d', (time() + 86400));
break;
}
$input = str_replace('{{' . $definition['alias'] . '}}', $replacement, $input);
}
}
return $input;
}

Как видите, для каждого псевдонима php-кода вы можете добавить еще один case в switch() заявление. Вы можете прочитать на switch() Управляющие структуры по следующей ссылке:

PHP: переключатель — ручной

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector