插件开发人员通常会保护自己的插件免受直接访问。我看到了两种解决方法:

if ( ! defined( 'WPINC' ) ) die;




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


WPINC和ABSPATH?哪种方法是正确的方法?

#1 楼

它们的定义如下:

define( 'ABSPATH', dirname(dirname(__FILE__)) . '/' );
define( 'WPINC', 'wp-includes' );


dirname是一个PHP函数,它返回父目录的路径,而wp-includes很容易解释。

我会说ABSPATH更好,因为它是WP加载的第一件事,而且看起来也更好:)但是没有真正的“正确方法”,因为它们都可以工作。

评论


没有真正正确的方法,我总是使用if(!defined('ABSPATH'))exit; ...但是,也许,考虑到此代码段的范围是确保加载wordpress,因此'WPINC'更好,因为更多的wordpressfull盯着“ WP”。

– gmazzap♦
13年7月31日在4:53

#2 楼

if ( ! defined( 'WPINC' ) ) die;if ( ! defined( 'ABSPATH' ) ) exit;通过防止直接访问您的插件文件来增加安全性。 ABSPATH是WordPress在其核心中定义的PHP常量。

如果从WordPress外部访问您的插件文件,则常量ABSPATHWPINC不会被定义,因此它会退出插件代码,从而防止任何未经授权访问您的代码。

ABSPATHWPINC在WordPress核心中定义为:

define( 'ABSPATH', dirname(dirname(__FILE__)) . '/' );
define( 'WPINC', 'wp-includes' );


两者均用于相同目的。

#3 楼


WPINC和ABSPATH有什么区别?


您可以检查一下自己。只需在GitHub上的WordPress镜像上查看wp-load.php

即使快速浏览一下,也会显示当前选择的答案对于ABSPATH的定义不再正确。而且,如果您在GitHub上比较不同的标签,您会看到ABSPATH定义实际上会随着时间而改变。


哪个是正确的方法?


鉴于这些用于安全性,我会选择ABSPATH。理由是ABSPATH不仅是在WP引导程序中首先定义的,而且WPINC是在同一文件中的条件下定义的,因此,更有可能经历将来的回归。

此外,虽然没有明确询问,您提供了同时使用dieexit的示例。根据引用官方API文档的devdocs.io的说法,die等同于exit,因此您可以选择两者中的任何一个都不会有所不同。

dieexit都接受参数,因此您可以考虑使用它们在异常结束时输出一些有用的信息,例如加密的版本标签或联系信息,或者传递退出代码(例如0-1)进行进一步处理。

还值得注意的是wp_die也是如此。不要与PHP内置组件混淆,而是称赞它们可用于输出除纯文本之外的HTML,并且目前在整个WordPress核心中广泛使用。在WordPress.org上了解有关wp_die的更多信息。