답변:
내가 사용하는 간단한 솔루션 .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
.
20.04.2017 업데이트
간단한 검사를 수행하기에는 너무 어리석은 사람들의 요청이 더 많았습니다. 요청 된 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은 "사용자 이름 별 게시물"문자열에 대한 피드를 확인하고 사용자 이름을 추출합니다.
우선, 누군가가 사용자 이름을 추측 할 수 있다고해서 사이트가 안전하지 않다는 의미는 아닙니다. 그리고 누군가가 그런 식으로 귀하의 사이트를 파싱하는 것을 막을 수있는 방법은 없습니다.
그러나 ...
이 점에 대해 정말로 염려한다면 다음 두 가지를 수행하는 것이 좋습니다.
또 다른 대안은 저자의 퍼머 링크 재 작성을 변경하는 것입니다. 이 작업을 수행 할 수있는 몇 가지 방법 이 있으며이 사이트에서도 몇 가지를 찾을 수 있습니다 .
이것을 철저히 테스트하지는 않았지만 웹 서버 수준에서 주변 벽을 구축하는 대신 기본 리소스를 제거하는 것이 좋습니다. 따라서 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;
}
);
}
추신 : 이것은 저자 편집 자료를 완전히 죽일 것이며 , 이는 편집증 수준이 아닐 수도 있습니다 :)
.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]
정부 기관의 침투 테스터로서의 나의 전문적인 의견은 ... 그것은 항상귀하의 웹 사이트에 대한 정보를 열거하기 어렵게 할 가치가 있습니다. 여러분 중 몇 명은 구글, 스크립트 아동 해커보다 우월한 웹 사이트를 가질 것입니다. 계층화 된 보안에 대해 이야기하고 있으며 각 계층마다 침투 시도에 시간과 복잡성을 더합니다. 각 계층은 해커에게 필요한 스킬 셋에 추가됩니다. WP에는 유용한 방화벽이 몇 가지 있습니다. 반복적으로 사용자 로그인 시도 또는 404를 반복하는 IP 주소를 차단할 수있는 주소를 찾으십시오. 아이디어는 방화벽이 존재하지 않는 페이지를 웹 사이트를 스캔하거나 사이트에 반복적으로 로그인을 시도하는 IP를 자동으로 차단하는 것입니다. 좋은 기능에는 XSS 및 SQL 주입 차단 기능도 포함됩니다. Tips and Tricks HQ, Peter, Ruhul, Ivy의 올인원 WP 보안 사용을 고려하십시오.
.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)없이 원본 페이지 만 표시 합니다. 다른 쓸모없는 매개 변수가있는 페이지처럼 작동해서는 안됩니까?