如何通过多个级别 eval() PHP 代码?

发布于 2024-08-19 08:22:19 字数 364 浏览 2 评论 0原文

我有这样的代码:

$layout_template = template_get("Layout");
$output_template = template_get("Homepage");
$box = box("Test","Test","Test");
eval("\$output = \"$layout_template\";");
echo $output;

在 $template_layout 变量中是对 变量 $output_template,因此脚本移至 $output_template 变量

但它不会再进一步​​,$output_template 内部是对变量 $box 的调用,但它不会进一步超过一级

I have this code:

$layout_template = template_get("Layout");
$output_template = template_get("Homepage");
$box = box("Test","Test","Test");
eval("\$output = \"$layout_template\";");
echo $output;

In the $template_layout variable is a call for the
variable $output_template, so then the script moves onto the $output_template variable

But it doesn't go any further, inside the $output_template is a call to the variable $box, but it doesn't go any further than one level

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

缺⑴份安定 2024-08-26 08:22:19

永远不会想要嵌套的eval(),尤其是在任何递归逻辑中。坏消息。请改用 PHP 的 Include。 IIRC eval() 创建一个新的执行上下文,但会产生开销,而 include() 则不会。

如果您有这样的缓冲区:

<h1><?php echo $myCMS['title']; ?></h1>

我有时有像上面这样的 Index.tpl 之类的文件,可以访问这样的关联数组,那么您只需在您的类中执行以下操作:

<?php
   class TemplateEngine {
       ...
       public function setvar($name, $val)
       {
            $this->varTable[$name]=make_safe($val);
       }

       ....
       /* Get contents of file through include() into a variable */
       public function render( $moreVars )
       {
           flush();
           ob_start();
           include('file.php');
           $contents = ob_get_clean();
           /* $contents contains an eval()-like processed string */
           ...

签出 ob_start() 和其他输出缓冲区控件

如果您确实使用 eval()或任何类型的用户数据包含,在清理不良代码的输入时要非常安全。

看起来您正在编写某种组合的小部件/模板系统。将您的小部件(视图)编写为类,并允许它们在现有模板系统中使用。使用 $myWidget->render($model) 等保持通用。

我在 PHP doc-user-comments-thingy 上看到了这一点,这似乎是一个坏主意:

<?php
$var = 'dynamic content';
echo eval('?>' . file_get_contents('template.phtml') . '<?');
?>

也许有人可以启发我:P

I would never want nested eval(), and especially not in any recursive logic. Bad news. Use PHP's Include instead. IIRC eval() creates a new execution context, with overhead whereas include() doesn't.

If you have buffers such as:

<h1><?php echo $myCMS['title']; ?></h1>

I sometimes have files like Index.tpl such as above that access an associative array like this, then you just do in your class:

<?php
   class TemplateEngine {
       ...
       public function setvar($name, $val)
       {
            $this->varTable[$name]=make_safe($val);
       }

       ....
       /* Get contents of file through include() into a variable */
       public function render( $moreVars )
       {
           flush();
           ob_start();
           include('file.php');
           $contents = ob_get_clean();
           /* $contents contains an eval()-like processed string */
           ...

Checkout ob_start() and other output buffer controls

If you do use eval() or any kind of user data inclusion, be super safe about sanitizing inputs for bad code.

It looks like you are writing a combined widget/template system of some kind. Write your widgets (views) as classes and allow them to be used in existing template systems. Keep things generic with $myWidget->render($model) and so on.

I saw this on the PHP doc-user-comments-thingy and it seems like a bad idea:

<?php
$var = 'dynamic content';
echo eval('?>' . file_get_contents('template.phtml') . '<?');
?>

Perhaps someone can enlighten me on that one :P

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文