【发布时间】:2011-12-10 11:52:04
【问题描述】:
好的,我知道这是一种不好的做法,但部分代码已经存在,我必须对其进行扩展以运行带有一个参数的自定义函数。
因此,我们的页面存储在 db 中,当它们显示在我们的模板中时,我们目前在整个 html 页面上使用三个不同的带有 e 修饰符的 preg_replace 函数。
这似乎很慢,所以我想将其更改为仅使用一个 preg_replace 调用,并能够以 bbcode 方式提供具有 1 个参数的自定义函数:示例:
[FUNC:testfunc(测试字符串)]
所以,这就是我想出的……我不确定哪种方法更安全,使用 e 修饰符的 preg_rplace 或 preg_replace_callback:
<?php
$str = '
<h2>Title That should Not Be Affected</h2>
<p>[FUNC:linkbox(/somestuff/newpage.html)]</p>
<a href="[FUNC:getvar(url)]">[FUNC:getvar(title)]</a>
<p>Random Html THat should not be affected</p>
<p>[FUNC:linkbox(/somestuff/otherpage.html)]</p>
';
$str2 = preg_replace_callback('~\[FUNC:(.*?)\((.*?)\)\]~', 'callback_caller', $str);
$str = preg_replace('~\[FUNC:(.*?)\((.*?)\)\]~e', 'emodcaller("\\1", "\\2")', $str);
echo $str.'<br><br>'.$str2;
function callback_caller($args){
if(!isset($args[0], $args[1]))
return false;
$func = strip_tags($args[1]);
$param = isset($args[2]) ? strip_tags($args[2]) : '';
//Only allow calling of known functions
switch($func){
case 'linkbox':
return linkbox($param);
break;
case 'getvar':
return getvar($param);
break;
case 'default':
return '';
break;
}
}
function emodcaller($fun, $arg){
$arg = strip_tags($arg);
//Only allow calling of known functions
switch($fun){
case 'linkbox':
return linkbox($arg);
break;
case 'getvar':
return getvar($arg);
break;
case 'default':
return '';
break;
}
}
function linkbox($addy){
return 'Linkbox Called: '.$addy;
}
function getvar($arg) {
switch($arg){
case 'url':
return '/index.html';
break;
case 'title':
return 'This is a test title';
break;
}
}
?>
我喜欢使用 e 修饰符的一点是,如果需要,我可以直接在 php 中为函数调用添加另一个参数,如下所示:
preg_replace('~\[FUNC:(.*?)\((.*?)\)\]~e', 'emodcaller("\\1", "\\2", $page->getid())', $str);
一种方法比另一种更安全吗?它们都是巨大的安全风险吗?我必须对这些进行一些实现..
编辑:我发现您可以使用匿名函数向回调函数传递附加参数,例如:
$content = preg_replace_callback(
'~(?:\<p\>)?\[FUNC:(.*?)\((.*?)\)\](?:\<\/p\>)?~',
function($matches) use ($article) {
return callback_caller($matches, $article);
},
$content);
这会将 callback_caller() 函数传递给我的整个文章类以供使用。 为每场比赛创建一个这样的匿名函数是否对性能不好?
【问题讨论】:
标签: php security preg-replace preg-replace-callback