function wp_validate_auth_cookie(
和scheme = '' ) {
cookie,
cookie_elements ) { /** * Fires if an authentication cookie is malformed. * * @since 2.7.0 * * @param string
scheme Authentication scheme. Values include 'auth', 'secure_auth', * or 'logged_in'. */ do_action( 'auth_cookie_malformed',
scheme ); return false; }
cookie_elements['scheme'];
cookie_elements['username'];
cookie_elements['hmac'];
cookie_elements['token'];
cookie_elements['expiration'];
cookie_elements['expiration']; // Allow a grace period for POST and Ajax requests. if ( wp_doing_ajax() || 'POST' ===
expired += HOUR_IN_SECONDS; } // Quick check to see if an honest cookie has expired. if (
cookie_elements { * Authentication cookie components. None of the components should be assumed * to be valid as they come directly from a client-provided cookie value. * * @type string
expiration The time the cookie expires as a UNIX timestamp. * @type string
hmac The security hash for the cookie. * @type string
cookie_elements ); return false; }
username ); if ( !
cookie_elements { * Authentication cookie components. None of the components should be assumed * to be valid as they come directly from a client-provided cookie value. * * @type string
expiration The time the cookie expires as a UNIX timestamp. * @type string
hmac The security hash for the cookie. * @type string
cookie_elements ); return false; }
user->user_pass, 8, 4 );
username . '|' .
expiration . '|' .
scheme ); // If ext/hash is not present, compat.php's hash_hmac() does not support sha256.
hash = hash_hmac(
username . '|' .
token,
hash,
cookie_elements { * Authentication cookie components. None of the components should be assumed * to be valid as they come directly from a client-provided cookie value. * * @type string
expiration The time the cookie expires as a UNIX timestamp. * @type string
hmac The security hash for the cookie. * @type string
cookie_elements ); return false; }
user->ID ); if ( !
token ) ) { /** * Fires if a bad session token is encountered. * * @since 4.0.0 * * @param string[]
username User's username. * @type string
token User's session token used. * @type string
scheme The cookie scheme to use. * } */ do_action( 'auth_cookie_bad_session_token',
expiration < time() ) {
cookie_elements { * Authentication cookie components. * * @type string
expiration The time the cookie expires as a UNIX timestamp. * @type string
hmac The security hash for the cookie. * @type string
user User object. */ do_action( 'auth_cookie_valid',
user ); return
cookie
$scheme
。函数首先使用
wp_parse_auth_cookie()
函数解析身份验证cookie。如果cookie格式错误或不存在,函数会触发auth_cookie_malformed
动作并返回false
。接下来,它从解析的cookie中提取各种元素,包括方案、用户名、HMAC(用于数据完整性的一种加密哈希)、令牌和过期时间。
然后,函数检查请求是否为AJAX或POST请求。如果是,它会将cookie的过期时间延长一小时。这是一个宽限期,用于允许长时间运行的操作。
接着,函数检查cookie是否已过期。如果已过期,它会触发
auth_cookie_expired
动作并返回false
。接下来,它检索与cookie中的用户名关联的用户。如果不存在这样的用户,它会触发
auth_cookie_bad_username
动作并返回false
。然后,函数通过哈希cookie和用户密码的各种元素来生成一个密钥。它使用这个密钥来生成用户名、过期时间和令牌的哈希。如果生成的哈希与cookie中的HMAC不匹配,它会触发
auth_cookie_bad_hash
动作并返回false
。接下来,它使用
WP_Session_Tokens::get_instance()
方法验证会话令牌。如果令牌无效,它会触发auth_cookie_bad_session_token
动作并返回false
。如果此时cookie的过期时间已过(只有在请求是AJAX或POST请求并且已应用宽限期的情况下才可能发生),它会将全局
login_grace_period
变量设置为1
。最后,如果所有检查都通过,函数会触发
auth_cookie_valid
动作并返回用户的ID,表示身份验证cookie有效。
分类: PHP
-
【WordPress】function wp_validate_auth_cookie(
scheme = ” )
-
【WordPress】wp-load.php
<?php /** * Bootstrap file for setting the ABSPATH constant * and loading the wp-config.php file. The wp-config.php * file will then load the wp-settings.php file, which * will then set up the WordPress environment. * * If the wp-config.php file is not found then an error * will be displayed asking the visitor to set up the * wp-config.php file. * * Will also search for wp-config.php in WordPress' parent * directory to allow the WordPress directory to remain * untouched. * * @package WordPress */ /** Define ABSPATH as this file's directory */ if ( ! defined( 'ABSPATH' ) ) { define( 'ABSPATH', __DIR__ . '/' ); } /* * The error_reporting() function can be disabled in php.ini. On systems where that is the case, * it's best to add a dummy function to the wp-config.php file, but as this call to the function * is run prior to wp-config.php loading, it is wrapped in a function_exists() check. */ if ( function_exists( 'error_reporting' ) ) { /* * Initialize error reporting to a known set of levels. * * This will be adapted in wp_debug_mode() located in wp-includes/load.php based on WP_DEBUG. * @see https://www.php.net/manual/en/errorfunc.constants.php List of known error levels. */ error_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR ); } /* * If wp-config.php exists in the WordPress root, or if it exists in the root and wp-settings.php * doesn't, load wp-config.php. The secondary check for wp-settings.php has the added benefit * of avoiding cases where the current directory is a nested installation, e.g. / is WordPress(a) * and /blog/ is WordPress(b). * * If neither set of conditions is true, initiate loading the setup process. */ if ( file_exists( ABSPATH . 'wp-config.php' ) ) { /** The config file resides in ABSPATH */ require_once ABSPATH . 'wp-config.php'; } elseif ( @file_exists( dirname( ABSPATH ) . '/wp-config.php' ) && ! @file_exists( dirname( ABSPATH ) . '/wp-settings.php' ) ) { /** The config file resides one level above ABSPATH but is not part of another installation */ require_once dirname( ABSPATH ) . '/wp-config.php'; } else { // A config file doesn't exist. define( 'WPINC', 'wp-includes' ); require_once ABSPATH . WPINC . '/version.php'; require_once ABSPATH . WPINC . '/compat.php'; require_once ABSPATH . WPINC . '/load.php'; // Check for the required PHP version and for the MySQL extension or a database drop-in. wp_check_php_mysql_versions(); // Standardize
path = wp_guess_url() . '/wp-admin/setup-config.php'; // Redirect to setup-config.php. if ( ! str_contains(
path ); exit; } wp_load_translations_early(); // Die with an error message.
die .= '<p>' . sprintf( /* translators: 1: Documentation URL, 2: wp-config.php */ __( 'Need more help? <a href="%1
s</a>.' ), __( 'https://wordpress.org/documentation/article/editing-wp-config-php/' ), '<code>wp-config.php</code>' ) . '</p>';
die .= '<p><a href="' .
die, __( 'WordPress › Error' ) ); }
这段PHP脚本是WordPress应用的一部分,它的主要目的是加载一些必要的文件,并进行一些基本的环境检查。
首先,它加载了一些核心的WordPress文件,包括版本信息(
version.php
)、兼容性函数(compat.php
)和加载函数(load.php
)。然后,它调用
wp_check_php_mysql_versions()
函数来检查当前环境的PHP版本以及是否安装了MySQL扩展或者数据库插件。接着,它调用
wp_fix_server_vars()
函数来标准化$_SERVER
变量,以确保在不同的环境下这些变量的行为是一致的。然后,它定义了
WP_CONTENT_DIR
常量,这个常量指向WordPress的内容目录,然后加载了一些基本的WordPress函数(functions.php
)。接下来,它构造了一个指向
setup-config.php
的URL,并检查当前的请求URL是否包含setup-config
,如果不包含,那么就会重定向到setup-config.php
。然后,它调用
wp_load_translations_early()
函数来加载早期的翻译。最后,如果
wp-config.php
文件不存在,它会显示一个错误信息,告诉用户需要wp-config.php
文件才能继续安装,并提供了一个链接到编辑wp-config.php
文件的支持文章,以及一个创建配置文件的按钮。如果用户点击这个按钮,就会被重定向到setup-config.php
。如果所有的检查都通过,那么WordPress的安装过程就可以开始了。