我开始为wordpress开发一个自定义主题,我注意到一个明显的错误,这对我来说很奇怪,考虑到' size'和Wordpress的流行。
Wordpress使用一种约定,以便将名为page_mytemplatename.php的文件视为"页面模板"并进行解析以填充"模板"下拉页面编辑选项。
已知,有意并记录在页面模板文件中写评论
private static volatile boolean flag;
public static void main(String[] args) {
JFrame myFrame = new JFrame("Test");
JButton myButton = new JButton("Click Me!");
myButton.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent arg0) {
System.out.println("Button was clicked!");
flag = true;
}
});
myFrame.add(myButton);
myFrame.setSize(128, 128);
myFrame.setVisible(true);
System.out.println("Waiting");
while (!flag) { }
System.out.println("Finished");
}
告诉wordpress添加" myCustomTemplateNameHere"到了下拉列表。
现在......我希望wordpress足够聪明,可以找到"模板名称:xxxx"只在第一个注释中出现模式(并且只有当第一个注释是.php文件中的第一个注释时才会出现!)但是我发现写了"模板名称:xxxxxxx"在任何模板或任何文件中的某处,包括'包括'或者'要求'指令,导致wordpress实际填充菜单与wathever垃圾写入冒号,甚至PHP代码本身!
例如,像这样的声明,在文件中间甚至间接包含在'中包含'指令/* Template Name: myCustomTemplateNameHere */
会导致" 。 $ tpl_name;下拉列表中的模板!
在我看来,这似乎完全没有问题,可能导致wordpress的安全问题!这可能会导致某种注射,即使你必须承认到达那里会很棘手......
无论如何,我们似乎无法自由撰写像
这样的评论echo "current template name: " . $tpl_name;
甚至编写包含字符序列的代码"模板名称:xxxx"没有实际导致副作用听起来像是一个错误。
另外,我注意到即使模板名称:xxxx写入包含或必需的文件中也会发生...为什么会发生这种情况。 wordppress解析所有文件,甚至查找包含和解析包含的文件?这对我来说似乎很棘手,非常错误!
我是否设法证明我的观点?
我正在运行WordPress 4.3.1(几乎是撰写本文时的最新版本)
有人可以确认这是我写主题时应该记住的错误吗?
谢谢。答案 0 :(得分:1)
我在WordPress 4.3.1中运行了一些实验,以下是我的结果:
按照预期/您的期望,此表单中的评论,页面上的任何位置:
<?php
/**
* Template Name: $foobar;
*/
?>
结果:是否会列为模板
页面模板中的直接html:
template name: foobar
结果确实会列为模板
PHP代码作为注释,如下所示:
<?php
/**
* echo 'Template Name:' . $foobar;
*/
?>
结果确实会列为模板
PHP代码不作为评论,如下:
<?php
echo 'Template Name:' . $foobar;
?>
结果:令人惊讶的是,此DOES被列为模板(列出的模板名称为' . $foobar;
)
检查解析模板的WP核心代码,它会加载主题中的所有.php
个文件,然后在PHP的内容中查找以下正则表达式:
preg_match( '|Template Name:(.*)$|mi', file_get_contents(...))
结论: