我目前正在创建一个网络应用,我想允许我的用户创建一个模板。我只允许他们使用HTML和一些函数来获取一些值,所以我有一些函数
getDescription();
但是因为它的PHP我还有其他功能(例如phpinfo();
),我不希望它们使用。
是否可以设置过滤器(如in_array
)来检查是否使用了声明以外的函数?
或者是否有一个模板引擎或其他类似的东西。
我对模板很陌生,我找不到任何东西。
答案 0 :(得分:2)
如果他们只是创建HTML模板,您可以允许他们放置例如;
<div>
[PHP]getDescriptions()[PHP]
</div>
<div>
[PHP]phpinfo()[/PHP]
</div>
然后在他们保存的解析文件中或其他任何内容时,您可以
$allowedFunctions = array('getDescriptions');
$input = '';//html from the template
foreach($allowedFunctions as $key => $value){
$myVal = $value();
$input = str_replace('[PHP]'.$value.'()[/PHP]',$myVal,$input);
}
这将用getDescriptions()返回的内容替换[PHP] getDescriptions()[/ PHP] ...
和phpinfo()不会改变。
答案 1 :(得分:1)
您可以检查function_exists是否存在某个功能。如果您希望它们使用您为此目的定义的函数,那么您可以使用类似'tpl_ *'的函数为这些函数添加前缀。如下所示:
function tpl_getDescription() {/*code here*/}
然后当你的用户试图实现像getDescription这样的函数时,你可以添加“tpl_”并检查function_exists()
是否存在该函数。
if(function_exists('tpl_' . $userFuncName))
{
call_user_func('tpl_' . $userFuncName)
}
即使用户试图唤起本机php函数,tpl_也会以前缀为准,如果返回false则为。
答案 2 :(得分:1)
是的,您可以轻松创建一个枚举外部文件中所有用户功能的脚本。假设你有这个“模板”,template.php
:
<?
function getDescription() {
}
function userFunc() {
}
function anotherFunction() {
}
?>
然后您可以通过这种方式获得template.php
中所有函数的列表:
<?
include('template.php');
$functions = get_defined_functions();
echo '<pre>';
print_r($functions['user']);
echo '</pre>';
?>
会输出:
Array
(
[0] => getdescription
[1] => userfunc
[2] => anotherfunction
)
我会通过AJAX调用此脚本,例如getfunctions.php?file=template.php
,它返回了一个包含template.php内所有用户函数的JSON。