我想知道如何在不使用eval()的情况下运行存储在数据库中的php脚本。
预期过程如下
当用户POST一个包含
{{
typed_alias 的字符串时}}
,系统将在表中搜索该别名是否在该alias
列中有记录。如果是->用存储在该
replacement
列中的对应脚本替换用户键入的内容。如果不是,请显示原始字符串,包括
{{
wrong_alias}}
预期结果如下
当用户发布
Hello,{{morninggg}}时,当前的unix时间为{{nowTime}}db的数组输出
大批
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()
通过以下链接阅读控制结构:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句