Я хотел бы знать, как запустить сценарии 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()
может запускать сценарии, однако это считается опасным методом в реальных приложениях людьми.
Кто-нибудь может дать мне советы о том, как бороться с этой проблемой?
Спасибо!
Вы не должны использовать такие функции, как 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()
Управляющие структуры по следующей ссылке:
Других решений пока нет …