【问题标题】:How to parse file without using eval - PHP?如何在不使用 eval - PHP 的情况下解析文件?
【发布时间】:2017-11-23 12:06:21
【问题描述】:

有没有其他方法可以在没有 eval() 的情况下解析文件?我正在尝试在不使用 index.gs 中的 php 标签的情况下呈现 php 代码,到目前为止我只能使用 eval() 来完成。问题不仅在于解析 var,还在于自定义模板字符。

这是下面的代码示例。

 $render = file_get_contents($this->file);

 $render = $this->parse_extends($render);
 $render = $this->parse_assets($render);
 $render = $this->parse_vars($render);
 $render = $this->parse_vars_skip($render);

  try {
        ob_start();
        eval('?>' . $render);
        $render = ob_get_contents();
    } finally {
        ob_get_clean();
    }
    return $render;

返回 $render - 返回 View::class 响应代码

【问题讨论】:

标签: php


【解决方案1】:

如果在php.ini 中启用了allow_url_include 指令,则可以使用以下代码执行此代码

include "data://text/plain;base64," . base64_encode($render);

但是这个设置默认是禁用的,并且不能在用户代码中改变,只能通过编辑php.ini文件;因此,除非在 php.ini 中明确启用(并且通常没有任何好的理由应该启用),否则它不是一个真正的选择。

另一种方法是创建一个临时文件,在其中编写代码,然后使用 include 执行它:

$tempFilename = tempnam("/tmp", "MyTemplate");
file_put_contents($tempFilename, $render);
include $tempFilename;
unlink($tempFilename);

但两者都对 eval() 有类似的问题和危险。

【讨论】:

  • 是的,我已经尝试过第二种方式,但是如果你只有 layout.master.gs 和 index.gs 那就不好了,但是如果你产生其他文件或包含,那就不好了
  • 第二个实际上只是eval,但使用文件系统而不是RAM来存储要评估的代码,这有点傻;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
  • 2011-09-09
  • 2012-03-27
  • 2016-06-11
  • 1970-01-01
相关资源
最近更新 更多