【WordPress】セキュリティ

# 意図しないリダイレクトをさせない

__概要__

WordPressで、パーマリンクをデフォルトから変更している場合、URL/loginからURL/wp-login.phpへリダイレクトする仕組みになっている。またURL/adminとURL/dashboardはURL/wp-admin/へリダイレクトされる。

__施策__

```php
//意図しないリダイレクトを行わなくする
remove_action( 'template_redirect', 'wp_redirect_admin_locations', 1000 );
```

----

# 投稿者アーカイブページへのアクセスを404ページへリダイレクト

__概要__

パラメータ「?author=1」の指定で投稿者ページにリダイレクトされるが、
その際のURLがログインIDになってしまうため、
投稿者アーカイブページへのアクセスを404ページへリダイレクトさせる。

> 例）
> http://www.example.com/?author=1
>　↓
> http://www.example.com/author/admin/
> ※「admin」がログインID


__施策__

```php
/*--------------------------------------------------------
// 投稿者アーカイブページへのアクセスを404ページへリダイレクト
--------------------------------------------------------*/
function author_archive_redirect() {
	if($_GET['author'] !== null || $_POST['author'] !== null) {
		// 404ページを表示する
		wp_redirect( home_url('/404') );
		exit;
	}
}
add_action('init', 'author_archive_redirect');
```

---

# トップ画像、バナー画像のページはホームにリダイレクト

__概要__

トップ画像、バナー画像のページはホームにリダイレクト

__施策__


```php
/*--------------------------------------------------------
トップ画像、バナー画像のページはホームにリダイレクト
--------------------------------------------------------*/
function redirect_post_type() {
	global $wp_query;

	if (!is_admin()):
		///投稿タイプ調べる
		$post_type_name = $wp_query->get_queried_object()->post_type;

		if(
			$post_type_name=='topimg'||
			$post_type_name=='bannerimg'
		){
			wp_redirect( home_url() );
		}
	endif;

}
add_action( 'template_redirect', 'redirect_post_type' );
```

----

# インストール後、install.phpを削除

__概要__

セキュリティのためインストール後、install.phpを削除

__施策__

wp-adminフォルダのinstall.phpを削除

> ※但し、アップグレードすると自動的に作成されてしまう。

----

# ログイン画面にアクセス制限をかける

__施策__

wp-login.phpと同じフォルダに「.htaccess」を作成


__IP制限の場合__

__.htaccess__

```
# 特定のIPのみ ログイン
<Files wp-login.php>
Order deny,allow
Deny from all
Allow from 000.000.000.000 #許可するIPアドレス
</Files>
```

__ベーシック認証の場合__

__.htaccess__

```
<Files wp-login.php>
AuthUserFile /【アップロードする場所】/.htpasswd
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user
</Files>
```

__.htpasswd__

```
test:SKjdpfPffdsw
```

---

# ”/index.html”から”/”にリダイレクトさせる

__概要__

“/index.html”から”/”にリダイレクトさせる

__施策__

__.htaccess__

```
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^.*/index.html
RewriteRule ^(.*)index.html$ /$1 [R=301,L]
</IfModule>
```

> パーミッションは644か444
 「# BEGIN WordPress 〜 # END WordPress内」に記述すると、管理画面＞パーマリンク設定の更新で上書きされてしまうので、「# BEGIN WordPress 〜 # END WordPress」外に記入


---

# httpからのアクセスをhttpsに変更

__概要__

httpからのアクセスをhttpsに変更

__施策__

```:.htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>
```

---

# パスワード認証

__概要__

パスワード認証

__スクリプト__

```php
function my_password_form() {
	$htm = '';

	$htm .= '<form action="' . get_option('siteurl') . '/wppp.php" class="post-password-form" method="post">';
	$htm .= '<p>このコンテンツはパスワードで保護されています。閲覧するには以下にパスワードを入力してください。</p>';
	$htm .= '<p>';
	$htm .= '<label for="pwbox-8164">パスワード';
	$htm .= ' <input name="post_password" id="pwbox-8164" type="password" size="20">';
	$htm .= '</label>';
	$htm .= ' <input type="submit" name="Submit" value="' . esc_attr__('送信') . '">';
	$htm .= ' <input type="hidden" name="post_orkey" value="nrola7fznx9zib1epdkck2bci788twhg">';
	$htm .= '</p>';
	$htm .= '</form>';

	return $htm;

}
add_filter('the_password_form', 'my_password_form');

```


```php:wppp.php
require __DIR__ . '/wp-load.php';

if ( get_magic_quotes_gpc() )
	$_POST['post_password'] = esc_attr($_POST['post_password']);
	$_POST['post_orkey'] = esc_attr($_POST['post_orkey']);

if($_POST['post_orkey']==='nrola7fznx9zib1epdkck2bci788twhg'){
	require_once ABSPATH . WPINC . '/class-phpass.php';
	$hasher = new PasswordHash( 8, true );
// 10 days
	setcookie('wp-postpass_' . COOKIEHASH, $hasher->HashPassword( wp_unslash( $_POST['post_password'] ) ), time() + 864000, COOKIEPATH);
}
wp_safe_redirect(wp_get_referer());

exit;
```