简而言之,对于一般用途来说,是的。正如@s\\u ha\\u dum所指出的,这实际上取决于您使用它的目的。
功能是否安全
正如@kaiser和@s\\u ha\\u dum所提到的,该功能是可插入的-这意味着任何插件(尽管不是主题)都可以重新定义它来做任何事情。但这并不是一个真正的问题,因为插件几乎可以做任何事情——它们正在您的服务器上执行代码。
事实上,它的“可插拔”并不是这里真正的问题。你应该确保你使用的所有插件和主题都可以被合理地信任。在安全性至关重要的地方,公司往往会创建自己的插件,并且只使用这些插件。
(事实上,它是可插拔的,因此如果需要的话,公司可以实施更安全的认证系统)。
身份验证方法是否安全
让我们假设函数是在WordPress核心中定义的。安全吗?(是)。
这个is_user_logged_in()
函数检查用户浏览器中是否存在有效的cookie。如果不存在、无效或已过期,他们将被迫重新登录。
cookie由以下内容生成:
用户的用户名从其密码哈希中提取8个字符,用于cookie过期时的时间戳,cookie本身以明文形式包含用户名和时间戳。它还包含一个HMAC(hash message authentication code) - 这一部分很难猜测,并且取决于用户名&;时间戳。因此,如果攻击者持有过期的cookie,或他们自己帐户的cookie,他们无法生成有效的cookie,在不生成有效HMAC的情况下将其登录到管理员帐户。
HMAC由上述3个元素的哈希生成。现在,8个角色似乎并不多——这可能是一周内的野蛮强迫。但事实上,哈希是salted hash - 使用站点的盐。这样,只要他们安全,任何暴力强迫的企图都会被挫败。
。。。因此,该功能的安全性实际上取决于网站盐类的安全性。这些存储在wp-config.php
, 以及您的数据库凭据。You should never make that public.
我是否可以检测函数是否更改了可插入函数的定义
只有当MU插件覆盖了一个函数时,上述Kaiser函数才起作用。这里有一个更通用的解决方案,声明不覆盖可插入函数的插件是
not 表明插件是安全的。
/**
* Do not use in production.
*
* Checks if any plug-ins have overwritten a pluggable function in
* `wp-includes/pluggable.php` with a custom function.
*
* Prints list and kills processing if a function has been overwritten.
*
* Based on Kaiser\'s answer (link below).
* @link http://wordpress.stackexchange.com/questions/105637/is-wordpress-is-user-logged-in-secure/105667#105667
*/
function wpse105637_was_pluggable_defined_by_plugin(){
$arr = token_get_all( file_get_contents( ABSPATH.WPINC.\'/pluggable.php\' ) );
$functions = array();
foreach ( $arr as $curr_key => $part ){
if ( ! is_array( $part ) )
continue;
if ( token_name( $part[0] ) === \'T_FUNCTION\' ){
while ( is_array( $arr[ $curr_key ] ) AND \'T_FUNCTION\' !== $arr[ $curr_key ][0] )
++$curr_key;
$functions[] = $arr[ --$curr_key ][1];
}
}
$overwritten = 0;
foreach ( $functions as $f ){
$reflFunc = new ReflectionFunction( $f );
if( ABSPATH.WPINC.\'/pluggable.php\' !== $reflFunc->getFileName() ){
$overwritten++;
printf( \'<h1> Functions Overwritten </h1>\' );
print \'<code>\'.$f .\'</code> \' . $reflFunc->getFileName() . \':\' . $reflFunc->getStartLine() . \'<br/>\';
}
}
if( $overwritten )
wp_die( sprintf( \'%d pluggable functions overwritten\', $overwritten ) );
}
add_action( \'plugins_loaded\', \'wpse105637_was_pluggable_defined_by_plugin\' );