回答:
私が使用するシンプルなソリューション.htaccess
:
RewriteCond %{REQUEST_URI} !^/wp-admin [NC]
RewriteCond %{QUERY_STRING} author=\d
RewriteRule ^ - [L,R=403]
@jptsetmeの答えに似ていますが/?dummy&author=5
、クエリ文字列がの場合でも機能し、の検索パターンRewriteRule
は非常に高速です([0-9]*)
。このための正規表現でのキャプチャがよく見られます。ただし、キャプチャされた式を使用しない場合、キャプチャのためにメモリを浪費する必要はありませんauthor=1b
。また、受け入れたくないため、最初の文字の一致で十分です。
2017年4月20日更新
単純なスキャンを実行するには馬鹿すぎる人からの、より多くの「壊れた」リクエストがあります。要求されたURLは次のようになります。
/?author={num:2}
したがって、上記のルールを次のように拡張できます。
RewriteCond %{REQUEST_URI} !^/wp-admin [NC]
RewriteCond %{QUERY_STRING} ^author=\d+ [NC,OR]
RewriteCond %{QUERY_STRING} ^author=\{num
RewriteRule ^ - [L,R=403]
できません。
WPScanツールは、WordPressのわかりやすいURLを利用してユーザー名を決定する自動化されたユーティリティです。 著者の最初の10個のIDをループLocation
し、HTTP応答のヘッダーをチェックしてユーザー名を見つけます。
http://mysite.url
たとえばを使用して...
WPScanがチェックしhttp://mysite.url/?author=1
ます。サイトがかなりパーマリンクを使用している場合、Location
ヘッダーがの301リダイレクトを返しhttp://mysite.url/author/username
ます。サイトがかなりパーマリンクを使用していない場合、代わりに200(OK)のステータスが返されるため、WPScanは「ユーザー名による投稿」という文字列のフィードをチェックし、ユーザー名を抽出します。
まず第一に、誰かがあなたのユーザー名を推測できるからといって、あなたのサイトが安全でないということではありません。そして、そのような方法で誰かがあなたのサイトを解析するのを防ぐ方法は本当にありません。
しかしながら ...
あなたがこれについて本当に心配なら、私は2つのことをすることをお勧めします:
別の方法は、著者のパーマリンクの書き換えを変更することです。これを行うにはいくつかの方法があり、おそらくこのサイトでもいくつか見つけることができます。
これを徹底的にテストしていませんが、Webサーバーレベルでその周囲に壁を構築しようとするよりも、基礎となるリソースを削除する方が好ましいと思います。そのため、WPの用語では、作成者関連のクエリ変数の処理を停止します。
if ( ! is_admin() ) {
add_filter(
'query_vars',
function ( $public_query_vars ) {
foreach ( array( 'author', 'author_name' ) as $var ) {
$key = array_search( $var, $public_query_vars );
if ( false !== $key ) {
unset( $public_query_vars[$key] );
}
}
return $public_query_vars;
}
);
}
PSは、これが著者アーカイブを完全に殺すことに注意します、これは適切な妄想レベルかもしれません:)
.htaccess書き換えルールを使用してこの開示を防ぐことができますが、EAMannが説明するように、解析可能なコンテンツでユーザー名を開示しないようにニックネームも使用する必要があります。
次のブログでは、その方法について説明していますが、書き換えルールにタイプミスがあります:http : //www.question-defense.com/2012/03/20/block-wordpress-user-enumeration-secure-wordpress-against-hacking
また、正しいルールでは、書き換えられたURLからクエリ文字列を削除する必要があります。そうしないと、ユーザー名が公開されます。次のようになります。
# Stop wordpress username enumeration vulnerability
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{QUERY_STRING} ^/?author=([0-9]*)
RewriteRule ^(.*)$ http://yoursite.com/somepage/? [L,R=301]
私たちにとってうまくいきます。
これをnginxでも実行できることを付け加えました。チェック:
» nginxでのWordPressユーザー列挙のブロック-www.edwidget.name
副次的な注意事項として、WP Engineでホストされているサイトでユーザー名の列挙を防止したかったため、低レベルのnginx構成ファイルへのユーザーのアクセスが制限されました。ただし、コントロールパネルに「リダイレクトルール」セクションがあり、これを実行できます。しばらくして、最適な構成を見つけることができました。
Redirect Name: // choose a description for the rewrite
Domain: // you *must* select a domain; "All Domains" will *not* work here!
Source: ^/$
Destination: /?
次に、Advanced Settings
パネルを表示する必要があります...
Match args: author=([0-9]*)
Rewrite type: 301 Permanent
ほら、ユーザー名は安全です[r]!
htaccessに以下を追加して、WPScanからのユーザー列挙を完全にブロックしました。
# Stop wordpress username enumeration vulnerability
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{QUERY_STRING} ^/?author=([0-9]*)
RewriteRule ^(.*)$ http://yourdomain.com [L,R=301]
RewriteCond %{QUERY_STRING} author=d
RewriteRule ^ /? [L,R=301]
Gov'tの機関のための浸透テスターとしての私の専門家の意見...それは常にウェブサイトに関する情報を列挙するのを難しくする価値があります。グーグル、スクリプトキディハッカーを上回るウェブサイトを持っている人はほとんどいません。私たちは階層化されたセキュリティについて話しているので、各階層で侵入の試みに時間と複雑さを追加します。各レイヤーは、ハッカーに必要なスキルセットにも追加されます。WPには、非常に優れたアプリケーションファイアウォールがいくつかあります。ユーザーのログイン試行または404を繰り返したIPアドレスをブロックできるものを探します。アイデアは、存在しないページや繰り返しサインオンしようとするページをWebサイトでスキャンするIPをファイアウォールが自動的にブロックすることです。優れた機能には、XSSおよびSQLインジェクションのブロック機能も含まれます。Tips and Tricks HQ、Peter、Ruhul、IvyのAll In One WP Securityの使用を検討してください。
.htaccess
ルートの代わりに、次のコードを子テーマに追加することもできますfunctions.php
:
# Redirect author page to homepage
add_action( 'template_redirect', 'wpse_46469_author_page' );
function wpse_46469_author_page() {
# If the author archive page is being accessed, redirect to homepage
if ( is_author() ) {
wp_safe_redirect( get_home_url(), 301 );
exit;
}
}
さらに、以下を使用して、各ページのユーザー名に追加されるデフォルトの作成者リンクを別のページ(ホームページなど)に変更できます。
# Replace author URL with the homepage
add_filter( 'author_link', 'wpse_46469_author_link' );
function wpse_46469_author_link() {
# Return homepage URL
return home_url();
}
これは古い投稿であることは知っていますが、今後の参考のためにソリューションも追加したいと思います。これはfunctions.php
、テーマに入れるスニペットにすぎません。作成者のアーカイブも含め、すべてが適切に機能しますが、不適切な列挙リクエストは削除されます。
if (!is_admin()) {
if( preg_match('/author=([0-9]*)/i', $_SERVER['QUERY_STRING']) ) {
add_filter( 'query_vars', 'iside_remove_author_from_query_vars' );
}
add_filter('redirect_canonical', 'iside_remove_author_from_redirects', 10, 2);
}
function iside_remove_author_from_redirects($redirect, $request) {
if( !is_admin() && preg_match('/author=([0-9]*)/i', $_SERVER['QUERY_STRING']) ) {
add_filter( 'query_vars', 'iside_remove_author_from_query_vars' );
}
return $redirect;
}
function iside_remove_author_from_query_vars( $query_vars ) {
if( !is_admin() ) {
foreach( array( 'author', 'author_name' ) as $var ) {
$key = array_search( $var, $query_vars );
if ( false !== $key ) {
unset( $query_vars[$key] );
}
}
}
return $query_vars;
}
それが何をする:
author=1
パーマリンクを使用すると、作成者のアーカイブはそのままになります。また、URLが次のようなものである場合、/dummy?author=1
これはのページを表示するだけです/dummy
。
この質問に対するRarstの回答とhttps://perishablepress.com/stop-user-enumeration-wordpress/に感謝します。
自分のビジョンを投稿したい:
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{QUERY_STRING} ^author= [NC]
RewriteRule (.*) $1? [L]
最初の行はホームページのみを検出します。理由を説明します。この「ユーザー列挙」機能はホームページでのみ機能するため、すべてのURLを書き換える必要はありません。
次に、author=
クエリ文字列を探します。明らかです。
最後に、ブロック、リダイレクト(301、302)または禁止(403)なしで元のページを表示します。他の役に立たないパラメーターがあるページのように振る舞うべきではありませんか?