昨晚在研究評論結構時,網站右鍵查看源代碼,無意間發現自己的登陸管理員用戶名被暴露了...
網站已經使用了隱藏存檔鏈接中管理員用戶名的方法(將 WordPress 作者存檔鏈接中的用戶名改為暱稱或 ID,修復中文暱稱 404),沒想到管理員用戶名還是以另一種方式暴露了... 不過還好,非常隱蔽~~然後查看了下其它一些知名度高的 wordpress 的博客,他們也全部中招了(話說,各位博主的管理員登錄用戶名真的好複雜啊!)!看來是 wordpress 的通病了!大家趕緊自查下哦~
修復方法
方法 1:直接修改 Wordpress 程序
1 然後,查了下代碼,查到了這個函數comment_class(),進一步發現是被這個函數get_comment_class()(大約在 wp-includes\comment-template.php 的 419 行)暴露管理員的登錄用戶名... 該函數內容如下:
- function get_comment_class( $class = '', $comment_id = null, $post_id = null ) {
- global $comment_alt, $comment_depth, $comment_thread_alt;
-
- $comment = get_comment($comment_id);
-
- $classes = array();
-
- // Get the comment type (comment, trackback),
- $classes[] = ( empty( $comment->comment_type ) ) ? 'comment' : $comment->comment_type;
-
- // Add classes for comment authors that are registered users.
- if ( $comment->user_id > 0 && $user = get_userdata( $comment->user_id ) ) {
- $classes[] = 'byuser';
- $classes[] = 'comment-author-' . sanitize_html_class( $user->user_nicename, $comment->user_id );
- // For comment authors who are the author of the post
- if ( $post = get_post($post_id) ) {
- if ( $comment->user_id === $post->post_author ) {
- $classes[] = 'bypostauthor';
- }
- }
- }
-
- if ( empty($comment_alt) )
- $comment_alt = 0;
複製代碼
我們的管理員用戶名正是被其中的第 14 行暴露的... 在此,我們只需將這一行中的$user->user_nicename改為$user->user_id即可安全的隱藏管理員的登錄名了~ 也隱藏了註冊用戶的登錄用戶名了!取而代之顯示的是註冊用戶(包括管理員)的 ID。從此再也不用擔心網頁中會暴露諸位站長的登錄用戶名了~
2 11 月 02 日經過友鏈龍硯庭博主的提醒,發現用戶頁面也有博主登錄用戶名,如下圖:
然後查到了這個函數body_class(),進一步發現是被這個函數get_body_class()(大約在 wp-includes\post-template.php 的 634 行)暴露管理員的登錄用戶名... 該函數部分內容如下:
- elseif ( is_author() ) {
- $author = $wp_query->get_queried_object();
- $classes[] = 'author';
- if ( isset( $author->user_nicename ) ) {
- $classes[] = 'author-' . sanitize_html_class( $author->user_nicename, $author->ID );
- $classes[] = 'author-' . $author->ID;
- }
- }
複製代碼
其中該函數的第 5 行也暴露了博主的登錄名,將這一行刪掉或註釋掉即可成功解決~
當然,利用好body_class()這個函數,也可以得到一些很好的效果:
友情提示:此方法是直接修改的 wordpress 的源程序,所以每次更新 wordpress 程序都得進行這樣的修改。希望高手能提供更好的方法!
方法 2:過濾掉 "Comment-Author-" 和 "Author-"
11 月 04 日經過張戈的提醒和龍硯庭博主文章的提示,得到了一個基本完美的解決方案:也就是將comment_class()函數里輸出的 comment-author-test10 這個 class 去掉,也將body_class()函數里輸出的 author-test10 這個類似的 class 去掉。因為這個是通過 functions.php 來解決的,所以不用擔心 wordpress 程序升級的問題。方法是,將以下代碼加入 functions.php 中,即可完事!
- function lxtx_remove_comment_body_author_class($content){
- $pattern = "/(.*?)([^>]*)author-([^>]*)(.*?)/i";
- $replacement = '$1$4';
- $content = preg_replace($pattern, $replacement, $content);
- return $content;
- }
- add_filter('comment_class', 'lxtx_remove_comment_body_author_class');
- add_filter('body_class', 'lxtx_remove_comment_body_author_class');
複製代碼
comment_class()和body_class()過濾的結果分別是:
- // comment_class()過濾後的結果如下,去掉了原有class裡的comment-author-test10,請和上面的圖1比較
- class="comment byuser bypostauthor odd alt thread-odd thread-alt depth-1"
-
- // body_class()過濾後的結果如下,去掉了原有class裡的author-test10和author-1,請和上面的圖2比較
- class="archive author logged-in"
複製代碼
20161122:才發現其實老外早在 2010 年就發現了這個漏洞...
- function lxtx_remove_comment_body_author_class( $classes ) {
- foreach( $classes as $key => $class ) {
- if(strstr($class, "comment-author-")||strstr($class, "author-")) {
- unset( $classes[$key] );
- }
- }
- return $classes;
- }
- add_filter( 'comment_class' , 'lxtx_remove_comment_body_author_class' );
- add_filter('body_class', 'lxtx_remove_comment_body_author_class');
複製代碼
方法 3:改為輸出用戶 ID 或用戶暱稱
11 月 18 日發現inlojv的這個方法也不錯,但在改為輸出暱稱的時候有點錯誤,對此,我已經優化好了,請放心使用:
- function lxtx_change_comment_or_body_classes($classes, $comment_id){
- global $wp_query;
- $comment = get_comment( $comment_id );
- $user = get_userdata( $comment->user_id );
- $comment_author = 'comment-author-' . sanitize_html_class( $user->user_nicename, $comment->user_id );
- $author = $wp_query->get_queried_object();
- $archive_author = 'author-' . sanitize_html_class( $author->user_nicename, $author->ID );
- $archive_author_id = 'author-' . $author->ID;
- foreach( $classes as $key => $class ) {
- switch( $class ) {
- case $comment_author:
- // $classes[$key] = 'comment-author-' . sanitize_html_class( $comment->comment_author, $comment->comment_author );
- $classes[$key] = 'comment-author-' . sanitize_html_class( $comment->user_id );
- break;
- case $archive_author:
- // $classes[$key] = 'author-' . sanitize_html_class( get_the_author_meta( 'display_name' ), get_the_author_meta( 'display_name' ) );
- $classes[$key] = 'author-' . sanitize_html_class( $author->ID );
- break;
- case $archive_author_id:
- $classes[$key] = '';
- break;
- }
- }
- return $classes;
- }
- add_filter( 'comment_class', 'lxtx_change_comment_or_body_classes', 10, 4 );
- add_filter( 'body_class', 'lxtx_change_comment_or_body_classes', 10, 4 );
複製代碼
|