一通りコーディングが出来るようになって、Wordpressのオリジナルテーマ開発も出来るようになった。。

いよいよ実務や!!
と意気込んでいませんか?
WordPress初学者の方は、見た目を作れるコーディングだけに注力しすぎて、セキュリティ対策を怠っている場合が多いです。
実務ではもちろんセキュリティ対策が求められます。
こちらをしっかり押さえておかないと、損害賠償を請求されるような事案になる可能性もあります。
この記事では、テーマ開発を行う際必ず行うべきWordpressのセキュリティ対策について解説していきます。
必ず実施すべきセキュリティ対策
WordPressテーマ開発の際、気をつけるべきセキュリティ対策は以下になります。
- サニタイズとエスケープ処理
- SQLインジェクション対策
- CSRF対策
もちろんこれだけが全てではありませんが、基本的に上記の3つのセキュリティ対策は特に気に掛ける必要があります。
一つ一つ解説していきます。
サニタイズとエスケープ処理
まずはサニタイズとエスケープ処理です。
それぞれ一言でまとめると以下になります。
- サニタイズ
-
- ユーザーからの入力データを安全に処理する
- エスケープ
-
- データを画面に出力する際、安全に出力する
それぞれ具体的に使用するタイミングについて解説していきます。
サニタイズを行うタイミング
サニタイズを行うタイミングは、ユーザーから情報を受け取った時です。
例えば、ユーザーがお問い合わせページでフォームからデータを送信したとします。
この時、フォームからデータを受け取った際、サニタイズを行う必要があります。
具体的には以下の通りです。
// ユーザーがフォームで送信したデータを受け取る
$user_name = $_POST['user_name'];
// サニタイズを行い、安全な文字列に変換
$safe_user_name = sanitize_text_field($user_name);
// サニタイズ後のデータをデータベースに保存
update_option('user_name', $safe_user_name);
PHPここでは、sanitize_text_fieldがサニタイズのコードになります。
エスケープを行うタイミング
エスケープを行うタイミングは、ユーザーが入力したデータを画面に出力する時です。
例えばユーザーが投稿したコメントを出力する実装があったとします。
この時、投稿されたコメントに対してエスケープを行う必要があります。
具体的には以下の通りです。
このコードでは、esc_htmlがエスケープのコードになります。
// ユーザーが入力したデータを受け取る
$user_comment = $_POST['user_comment'];
// エスケープ処理を行い、安全に表示できる形に変換
$safe_comment = esc_html($user_comment);
// エスケープ後のデータを画面に表示
echo '<div>' . $safe_comment . '</div>';
PHPサニタイズとエスケープを行う理由
サニタイズとエスケープを適切に行わないと起こってしまう可能性がある被害があります。
それが、悪意のあるコードを誰かに埋め込まれる可能性です。
悪意のあるコードを埋め込まれた場合、ユーザー情報が盗まれるなどの被害が起こる可能性があります。
有名どころで言えば、XSS攻撃です。
XSS攻撃は、悪意のあるスクリプトを実行して、ユーザーの個人情報が盗まれる原因となります
XSS攻撃については、こちらの記事が図解付きで分かりやすかったです。


興味ある方はご参照ください。
SQLインジェクション対策
SQLインジェクション対策を一言でまとめると以下になります。
- SQLインジェクション対策
-
- データベースの中にある情報を悪意のあるユーザーから守る対策
ここからは具体的に使用するタイミングについて解説していきます。
SQLインジェクション対策を行うタイミング
SQLインジェクション対策を行うタイミングは、ユーザーからの情報をSQLクエリに埋め込むタイミングです。
具体例を出すために、ログイン機能があるページでSQLインジェクション対策をする方法を解説します。
コードがこちらになります。
global $wpdb;
// フォームからのデータを受け取る
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// ユーザー名とパスワードを受け取る
$username = $_POST['username'];
$password = $_POST['password'];
// プレースホルダを使ってSQLクエリを準備
$query = $wpdb->prepare(
"SELECT ID, user_login, user_pass FROM {$wpdb->prefix}users WHERE user_login = %s",
$username
);
// クエリ実行
$user = $wpdb->get_row($query);
// ユーザーが存在するかどうかを確認
if ($user) {
// パスワードの照合(wp_check_passwordを使用してハッシュを照合)
if (wp_check_password($password, $user->user_pass, $user->ID)) {
// ログイン成功
echo "ログイン成功!";
// セッションやクッキーを設定してユーザーをログインさせる
// wp_set_auth_cookie($user->ID);
} else {
// パスワードが一致しない場合
echo "パスワードが間違っています。";
}
} else {
// ユーザーが見つからない場合
echo "ユーザー名が見つかりません。";
}
}
PHPここで行われているSQLインジェクション対策は、prepareメソッドです。
prepareメソッド
prepareメソッドは、SQLクエリを実行する前にユーザーの入力を安全に処理するための準備をするメソッドです。
prepareメソッドを使用する際は二つの引数を使用します。
- 第一引数
-
- SQLクエリ
- 第二引数
-
- プレースホルダに挿入するデータ
prepareメソッドを使用する際のポイントは、%sが記載されている箇所です。
この%sは、プレースホルダと呼ばれる、データを埋め込むための位置です。
この%sを記載することによって、直接文字列をSQLクエリに埋め込むことなく、入力データを安全に挿入できます。
このプレースホルダと、送信されたデータを結びつけるのがprepareメソッドの第二引数です。
この第二引数に、取得したユーザー名を記載してプレースホルダと受け取ったデータを結びつけます。
これでSQLインジェクション対策の完了です。
CSRF対策
CSRF対策を一言でまとめると以下になります。
- CSRF対策
-
- ユーザーのセッション情報を悪意のある攻撃からユーザーを守る対策
こちらを行わないとアカウントを無断で使用してプロフィールを変更したり勝手に商品を決済される可能性があります。
ここからは具体的に使用するタイミングについて解説していきます。
CSRF対策を行うタイミング
CSRF対策を行うタイミングは、3回あります。
一つ一つ解説していきます。
- 1回目
-
- リクエスト送信時
- 2回目
-
- リクエスト送信後
リクエスト送信時
まずリクエスト送信時に行うことは、nonceフィールドの埋め込みです。
nonceフィールドとは、送られたリクエストが正当であるかを検証するためのセキュリティトークンです。
こちらはコメントの投稿画面を想定しています。
以下が具体的なコードになります。
<?php
// コメントフォームの表示
function custom_comment_form() {
?>
<form action="<?php echo site_url('/wp-comments-post.php'); ?>" method="post">
<textarea name="comment" required></textarea>
//nonceフィールドの埋め込み
<?php wp_nonce_field('custom_comment_nonce_action', 'custom_comment_nonce_name'); ?>
<input type="submit" value="コメントを投稿">
</form>
<?php
}
PHPここでのポイントは、wp_nonce_fieldです。
こちらを記載することによってnonceフィールドをコメント投稿画面に埋め込みます。
リクエスト送信後
リクエストが送信されたらその後サーバー側でnonceフィールドを検証します。
具体的なコードはこちらになります。
<?php
// コメント送信時の処理
function custom_comment_post_check($comment_data) {
// 送信された nonce を検証
if (!isset($_POST['custom_comment_nonce_name']) || !wp_verify_nonce($_POST['custom_comment_nonce_name'], 'custom_comment_nonce_action')) {
// nonce が無効な場合は、CSRF攻撃の疑いがあるため処理を中止
die('不正なリクエストです。');
}
// nonce が有効な場合、コメントの処理を続ける
return $comment_data;
}
// コメントの処理フック
add_filter('preprocess_comment', 'custom_comment_post_check');
PHPこの中でif文を使って送信されたnonceが正しいかを検証します。
ここでnonceフィールドに何も問題がなければ、returnを使ってコメントの処理を実行します。
まとめ
ここまでWordpressでオリジナルテーマ開発する際に必要なセキュリティ対策について解説しました。
他にもたくさんセキュリティ対策はありますが、今回は特に優先度が高い3つを取り上げました。
最後まで読んでいただきありがとうございました!