follow us in feedly
PHP

ワードプレスのセキュリティ対策

WEBアプリーケーションを作成するためのフレームワークには基本的なセキュリティ対策は施されています。もちろんワードプレスもそうですが、カスタマイズするのであればセキュリティ対策への理解も必要になってきます。ワードプレスの代表的な組み込み関数を紹介します。

2019年2月28日

XSSとCSRF対策 エスケープとトークン認証

XSS(クロスサイトスクリプティング)とCSRF(クロスサイトリクエストフォージェリ)はどちらも悪意のあるスクリプトが仕込まれたリンクをクリックさせることで攻撃が始まり、結果としてどちらも「本人に成りすまして悪さ」をします。秘匿情報が盗み見されたり、勝手に記事が投稿されたり・・・。
 もちろんこれはワードプレスに限った話ではなく動的にWEBページを生成するWEBアプリケーション全てに言えることなので、ワードプレスだけがこうした攻撃にことさら弱いというわけではありません。それは2017年に米国ホワイトハウスのホームページにワードプレスが採用されたことからもわかります。
The White House

セキュリティの専門家ではない人間がその真相に迫ることはなかなか難しいのですが、対策としてはXSSに対しては動的出力部分のエスケープ処理。CSRFに対してはトークンによる認証が基本になりますので、最低限のセキュリティ対策としてこの2つは必ずやらなくてはなりません。特にカスタムフィールドの出力はエスケープされていませんので例外なくエスケープします。

以下にワードプレスに備わっているセキュリティ関係の組み込み関数のいくつかをご紹介します。

esc_html()

ワードプレスの基本のエスケープ関数です。&, <, >, “, ‘ をエスケープします。
関数リファレンス/esc html – WordPress Codex 日本語版

■記述例
<?php esc_html($sample); ?>

esc_attr()

esc_html()と同じく&, <, >, “, ‘ をエスケープしますがhtml属性の場合はこちらを使用します。html属性とはalt、id、name、value属性などです。
関数リファレンス/esc attr – WordPress Codex 日本語版

■記述例(フォーム)
<input type="text" name="<?php esc_attr($sample); ?>">

esc_url()

URLをエスケープする場合はこちらを使用します。
関数リファレンス/esc url – WordPress Codex 日本語版

■記述例
<a href="<?php echo esc_url(home_url()); ?>">HOME</a>

wp_kses_post()

投稿や固定ページで許可されるHTMLタグ以外を除去します。<script>、</script>、<iframe>、</iframe>、<?php・・・?>などが丸ごと削除されます。改行タグやリンクタグなどは出力されますので入力フィールドでのhtmlタグ使用を許可する場合はこちらを使用します。
関数リファレンス/wp kses post – WordPress Codex 日本語版

■記述例(カスタムフィールド)
<p><?php echo wp_kses_post(get_field('text')); ?></p>

wp_nonce_field(), wp_verify_nonce()、wp_create_nonce()

ワードプレスに備わっているトークンの生成とその認証関数です。お問い合わせフォームで使用することの多いプラグインMW WP Formもこのnonceを利用しているようです。
関数リファレンス/wp nonce field – WordPress Codex 日本語版
関数リファレンス/wp verify nonce – WordPress Codex 日本語版
関数リファレンス/wp create nonce – WordPress Codex 日本語版

■記述例
<?php wp_nonce_field(); ?>

// 上記によって出力されるhtml
<input type="hidden" id="_wpnonce" name="_wpnonce" value="09bad1fef3" />
<input type="hidden" name="_wp_http_referer" value="/sample/" />
■記述例
<?php if (!isset($_POST['_wpnonce']) || !wp_verify_nonce($_POST['_wpnonce'], -1)) {
	echo '認証できませんでした';
	exit;
}; ?>

以上で「ワードプレスのセキュリティ対策」の解説を終わります。

このエントリーをはてなブックマークに追加