绕过受密码保护的帖子,不幸的是,你对缺少过滤器的看法是正确的,对核心进行黑客攻击是不可避免的。一个似乎有效的解决方案围绕sanitize_post_field()
函数,如果其$context
参数未设置为raw
.
负责决定是否显示密码字段或内容的模板函数是http://core.trac.wordpress.org/browser/tags/3.2.1/wp-includes/post-template.php#L556
请注意,将post_password
? 让我们开始吧。。。
查看如何通过get_post()
功能:http://core.trac.wordpress.org/browser/tags/3.2.1/wp-includes/post.php#L370
该函数不包含要挂接的筛选器或操作,但sanitize_post_field()
包含一些可以连接到的筛选器,以及post_password
完成该功能。
请参考功能http://core.trac.wordpress.org/browser/tags/3.2.1/wp-includes/post.php#L1676
然而,请注意,如果$context == \'raw\';
函数返回,并且没有任何筛选器被触发。因此,需要进行一些核心黑客攻击,以使代码流到达这些过滤器。
// wp-includes/post.php, line 557
-- $post = get_post($post);
++ $post = get_post($post, null, \'display\');
将强制
$context
除了
raw
. 这将允许按照以下思路进行操作:
function wpse31407_bypass_password( $value, $post_id, $context ) {
$allowed_ips = array( \'127.0.0.1\', \'255.255.255.255\', ... );
if (in_array( $_SERVER[\'REMOTE_ADDR\'], $allowed_ips )) return \'\';
else return $value;
}
add_filter( \'post_password\', \'wpse31407_bypass_password\', null, 3 );
这将有效地删除密码,因此测试
http://core.trac.wordpress.org/browser/tags/3.2.1/wp-includes/post-template.php#L556 if ( empty($post->post_password) )
评估为
true
允许您绕过密码。用一个
display
上下文,因为它仅用于检索
post_password
.
您还可以在核心中围绕post_password_required()
上面提到的功能,可能不是为了使事情过于复杂。由你决定。
你会被诱惑http://core.trac.wordpress.org/browser/tags/3.2.1/wp-includes/query.php#L2625 posts_results
过滤并进入并更改post_status
对于来自的每个帖子private
到public
... 然而,正如您可能已经看到的get_post_status()
函数处理其从中获取的帖子的自己副本get_post()
... ...它同样没有过滤器sanitize_post_field()
是的,这同样需要$context
除了raw
. 所以再说一遍:
// wp-includes/post.php, line 563
-- $post = get_post($post);
++ $post = get_post($post, null, \'display\');
并挂接到过滤器中,通过执行以下操作诱使函数认为帖子已发布:
function wpse31407_bypass_private( $value, $post_id, $context ) {
$allowed_ips = array( \'127.0.0.1\', \'255.255.255.255\', ... );
if (in_array( $_SERVER[\'REMOTE_ADDR\'], $allowed_ips )) return \'publish\';
else return $value;
}
add_filter( \'post_status\', \'wpse31407_bypass_private\', null, 3 );
或者在
get_post_status()
作用
结论
一旦你了解了核心的哪些部分是阻止帖子的原因,你可以根据需要尝试修改它们,因此我希望我的长答案在一定程度上有所帮助,有人会提供更多的提示,也许会提供更好的解决方案。好问题,让我挖掘和思考。