值得限制主题文件的直接访问吗?


31

我不时遇到以下主题片段:

if ( ! defined('ABSPATH')) exit('restricted access');

它只是主题中某些(全部?)PHP文件的开头,它应防止恶意来源直接访问该文件。

我发现二十一或十一未包含此功能,而且我从未见过在官方WordPress文档中推荐使用此功能。对我来说,这似乎是个好主意,但我对安全性的了解还不足以判断它,因此在Google方面找不到很多东西。

我的自定义主题中应该有这东西吗?如果是这样,应该在所有PHP文件中还是仅在其中一些文件中?


7
只为以后的读者阅读,这可以写得更简短些:defined('ABSPATH') OR exit;
kaiser

甚至更短:: defined('WPINC') ? : die();P
蒂姆·艾尔萨斯

我还想知道是否值得添加这样的代码,只是为了避免在错误日志中看到有关未定义函数的PHP错误。僵尸程序似乎有时会直接点击这些文件,并且由于未加载WP引导程序,我收到诸如“调用未定义函数query_posts()的调用”之类的错误
Matt Keys

Answers:


26

通常,您不需要它。但是……至少有一种边缘情况:

  • 如果主题文件是模板部分
  • 并且它使用从呼叫上下文(父文件)的全局变量,
  • register_globalson
  • 并且它是在运用这些变量没有任何安全检查...

…攻击者可以调用此文件,使用GET或设置缺少的变量,POST并使主题文件将其打印出来。然后一个安全问题。

因此……最好的选择不是像示例中那样进行上下文检查,而是好的代码:避免全局变量,在打印出来之前先检查其内容。

在某些情况下,当我认为其他人会使用我的代码并在不考虑安全性的情况下对其进行更改时,我会添加上下文检查。没伤


如果模板部分仍然包含至少一个会导致PHP致命错误的函数调用,那么这种情况仍然可行吗?
Chris_O 2012年

@Chris_O取决于外观的顺序。
fuxia

有道理并且完全同意在文件调用之间不使用全局变量的另一个原因。
Chris_O 2012年

1
安全永远比后悔更好。太多的安全不会伤害,对吗?
肖恩·伯格

2
如果一切正确,则不应使用不需要的代码。这个问题证明了它使代码难以遵循。
fuxia
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.