抢注百度搜索高排名流量域名、品牌商标保护、微信绿标安全域名、备案精品短域名,上铭正知产!

 找回密碼
 加入我們

[轉]如何正確的避免你的 WordPress 管理員登錄用戶名被暴露

[複製鏈接]
小豬哼囔 發表於 2019-1-30 22:23:57 | 顯示全部樓層 |閱讀模式

昨晚在研究評論結構時,網站右鍵查看源代碼,無意間發現自己的登陸管理員用戶名被暴露了...



網站已經使用了隱藏存檔鏈接中管理員用戶名的方法(將 WordPress 作者存檔鏈接中的用戶名改為暱稱或 ID,修復中文暱稱 404),沒想到管理員用戶名還是以另一種方式暴露了... 不過還好,非常隱蔽~~然後查看了下其它一些知名度高的 wordpress 的博客,他們也全部中招了(話說,各位博主的管理員登錄用戶名真的好複雜啊!)!看來是 wordpress 的通病了!大家趕緊自查下哦~

修復方法

方法 1:直接修改 Wordpress 程序

1 然後,查了下代碼,查到了這個函數comment_class(),進一步發現是被這個函數get_comment_class()(大約在 wp-includes\comment-template.php 的 419 行)暴露管理員的登錄用戶名... 該函數內容如下:
  1. function get_comment_class( $class = '', $comment_id = null, $post_id = null ) {
  2.     global $comment_alt, $comment_depth, $comment_thread_alt;

  3.     $comment = get_comment($comment_id);

  4.     $classes = array();

  5.     // Get the comment type (comment, trackback),
  6.     $classes[] = ( empty( $comment->comment_type ) ) ? 'comment' : $comment->comment_type;

  7.     // Add classes for comment authors that are registered users.
  8.     if ( $comment->user_id > 0 && $user = get_userdata( $comment->user_id ) ) {
  9.         $classes[] = 'byuser';
  10.         $classes[] = 'comment-author-' . sanitize_html_class( $user->user_nicename, $comment->user_id );
  11.         // For comment authors who are the author of the post
  12.         if ( $post = get_post($post_id) ) {
  13.             if ( $comment->user_id === $post->post_author ) {
  14.                 $classes[] = 'bypostauthor';
  15.             }
  16.         }
  17.     }

  18.     if ( empty($comment_alt) )
  19.         $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 行)暴露管理員的登錄用戶名... 該函數部分內容如下:
  1. elseif ( is_author() ) {
  2.     $author = $wp_query->get_queried_object();
  3.     $classes[] = 'author';
  4.     if ( isset( $author->user_nicename ) ) {
  5.         $classes[] = 'author-' . sanitize_html_class( $author->user_nicename, $author->ID );
  6.     $classes[] = 'author-' . $author->ID;
  7.     }
  8. }
複製代碼

其中該函數的第 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 中,即可完事!
  1. function lxtx_remove_comment_body_author_class($content){   
  2.     $pattern = "/(.*?)([^>]*)author-([^>]*)(.*?)/i";
  3.     $replacement = '$1$4';
  4.     $content = preg_replace($pattern, $replacement, $content);  
  5.     return $content;
  6. }
  7. add_filter('comment_class', 'lxtx_remove_comment_body_author_class');
  8. add_filter('body_class', 'lxtx_remove_comment_body_author_class');
複製代碼

comment_class()和body_class()過濾的結果分別是:
  1. // comment_class()過濾後的結果如下,去掉了原有class裡的comment-author-test10,請和上面的圖1比較
  2. class="comment byuser  bypostauthor odd alt thread-odd thread-alt depth-1"

  3. // body_class()過濾後的結果如下,去掉了原有class裡的author-test10和author-1,請和上面的圖2比較
  4. class="archive author  logged-in"
複製代碼

20161122:才發現其實老外早在 2010 年就發現了這個漏洞...
  1. function lxtx_remove_comment_body_author_class( $classes ) {
  2.     foreach( $classes as $key => $class ) {
  3.         if(strstr($class, "comment-author-")||strstr($class, "author-")) {
  4.             unset( $classes[$key] );
  5.         }
  6.     }
  7.     return $classes;
  8. }
  9. add_filter( 'comment_class' , 'lxtx_remove_comment_body_author_class' );
  10. add_filter('body_class', 'lxtx_remove_comment_body_author_class');
複製代碼
PS:方法 2 的兩段代碼二選一哈~ 效果一樣!

方法 3:改為輸出用戶 ID 或用戶暱稱

11 月 18 日發現inlojv的這個方法也不錯,但在改為輸出暱稱的時候有點錯誤,對此,我已經優化好了,請放心使用:
  1. function lxtx_change_comment_or_body_classes($classes, $comment_id){
  2. global $wp_query;
  3. $comment = get_comment( $comment_id );
  4. $user = get_userdata( $comment->user_id );
  5. $comment_author = 'comment-author-' . sanitize_html_class( $user->user_nicename, $comment->user_id );
  6. $author = $wp_query->get_queried_object();
  7. $archive_author = 'author-' . sanitize_html_class( $author->user_nicename, $author->ID );
  8. $archive_author_id = 'author-' . $author->ID;
  9. foreach( $classes as $key => $class ) {
  10. switch( $class ) {
  11. case $comment_author:
  12. // $classes[$key] = 'comment-author-' . sanitize_html_class( $comment->comment_author, $comment->comment_author );
  13. $classes[$key] = 'comment-author-' . sanitize_html_class( $comment->user_id );
  14. break;
  15. case $archive_author:
  16. // $classes[$key] = 'author-' . sanitize_html_class( get_the_author_meta( 'display_name' ), get_the_author_meta( 'display_name' ) );
  17. $classes[$key] = 'author-' . sanitize_html_class( $author->ID );
  18. break;
  19. case $archive_author_id:
  20. $classes[$key] = '';
  21. break;
  22. }
  23. }
  24.     return $classes;
  25. }
  26. add_filter( 'comment_class', 'lxtx_change_comment_or_body_classes', 10, 4 );
  27. add_filter( 'body_class', 'lxtx_change_comment_or_body_classes', 10, 4 );
複製代碼

回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 加入我們

本版積分規則

备案权重域名预定

4um點擊跨境網編創業社區

GMT+8, 2024-11-27 21:18

By DZ X3.5

QQ

快速回復 返回頂部 返回列表