eval()的替代品 - 文本输入中的短代码

时间:2014-04-10 14:53:43

标签: php eval shortcode

在CMS中

我希望用户能够包含php代码块,如联系表单,搜索表单。

这样的东西
<? include 'contact.inc.php' ?>

现在,Wordpress通过使用Shortcodes来实现这一点,即

[contact-form] [search form]

我怎样才能轻松完成这项工作?

我的包含数量有限

我可以用

eval('?> ' .  $database_query . ' <?php '); 

并放

<? include('contact.inc.php') ; ?> 

在$ database_query

的内容中

但在这种情况下eval()是危险的

那么如何制作一个简单的短代码系统?

2 个答案:

答案 0 :(得分:0)

如果可以,我会尽量避免eval。 eval的问题,特别是表单输入的问题是,如果被利用,您将授予攻击者访问整个Web服务器的权限。我建议使用一些寻找显式短代码的服务器端脚本。您甚至可以使用Wordpress function that they use作为起点。您还可以使用preg_match在文本中搜索短代码并以此方式解析它们。任何一个选项都会优于eval()

答案 1 :(得分:0)

假设您已经从某个地方(例如数据库)加载了一些包含短代码的HTML,并且您希望在内部填写表单的内容,我会执行以下操作:

// Define known shortcodes
$shortcodes = array(
    "[contact-form]" => "contact.inc.php",
    "[search-form]" => "search.inc.php"
);

// Load HTML with shortcodes from wherever you want
$source = load_template_from_somewhere();

// Now let's find the shortcodes in your source
$replace_points = array();
foreach($shortcodes as $code => $include_me){
    $offset = 0;
    while(TRUE){
        $index = strpos($source, $code, $offset);
        if($index === FALSE){
            // No more shortcodes of this type found
            break;
        };
        // Save the position and name of shortcode
        $replace_points[$index] = $code;
        // Update offset to scan the source search the remaining part of the string
        $offset = $index + strlen($code);
    };
};

// Sort the array because we've been searching by shortcode names
// And now we need to include forms in the correct order
ksort($replace_points);

$offset = 0;

foreach($replace_points as $index => $code){
    // Echo raw HTML part of the string
    echo substr($source, $offset, $index);
    // Then include the form
    include($shortcodes[$code]);
    // Update the offset to move towards the end of the string
    $offset = $index + strlen($code);
};
// Echo the remaining part of raw HTML string
echo substr($source, $offset);