[WordPress]送信完了画面を自作した時に気をつけること

以下、作業用メモです。調べたことをメモしています。

送信完了画面に直接アクセスできることは避ける

WordPressでフォームの送信完了ページを直接URLでアクセス可能にすることは、セキュリティやユーザーエクスペリエンスの観点から見ても好ましくない場合がある。

セキュリティの観点からは、送信完了ページには通常、ユーザーが入力した情報の一部や全体が表示されることがある。これらの情報がURLを知っている第三者に見られる可能性があるため、直接アクセスを許可することは避けるべき。

また、ユーザーエクスペリエンスの観点からも、フォーム送信後に表示される完了ページは、ユーザーがフォームを正しく送信したことを確認するためのもの。このページに直接アクセスできると、ユーザーはフォーム送信が成功したかどうかを正しく理解できなくなる可能性がある。

したがって、一般的には、フォーム送信完了ページへの直接アクセスは制限することが推奨される。

具体的な方策1

WordPressで送信完了ページへの直接アクセスを制限するために、以下のようなPHPコードを使用する。

// ページテンプレートの最初に以下のコードを追加します
if (!isset($_SERVER['HTTP_REFERER'])) {
    // リファラが設定されていない場合、ホームページにリダイレクトします
    wp_redirect(home_url());
    exit;
}

// リファラが設定されている場合、そのURLがフォームのURLと一致するか確認します
$referrer = wp_get_referer();
$form_url = home_url('/your-form-url/'); // ここにフォームのURLを設定します

if ($referrer !== $form_url) {
    // リファラがフォームのURLと一致しない場合、ホームページにリダイレクトします
    wp_redirect(home_url());
    exit;
}

このコードは、送信完了ページへの直接アクセスを制限する。ユーザーがフォームから送信した場合のみ、送信完了ページにアクセスできる。

ただし、この方法は完全なソリューションではない。なぜなら、HTTPリファラはクライアント側で容易に偽装できるから。 より堅牢なソリューションを実装するためには、例えば一時的なトークンを使用してフォーム送信を追跡するなどの追加的な手段が必要となる。

具体的な方策2 ※こちらを採用※

以下のコードは、WordPressのPHPファイルでよく見られるもので、直接アクセスを防ぐためのもの。

ABSPATHはWordPressが定義する定数で、WordPressの絶対パスを表す。このコードがあると、もしABSPATHが定義されていなければ(つまり、ファイルがWordPress環境外から直接アクセスされた場合)、スクリプトの実行を停止する。これにより、不正なアクセスを防ぐことができ、このパターンは、WordPressのプラグインやテーマなどでよく見られる。

if ( ! defined( 'ABSPATH' ) ) // 'ABSPATH' という定数が定義されていない場合
     exit; // スクリプトの実行を停止する

WordPressのPHPファイルに if ( ! defined( 'ABSPATH' ) ) exit; を使用すると、そのファイルへの直接アクセスを防ぐことができる。これは、送信完了ページなど、特定のページへの直接アクセスを防ぐために役立つ。

ちなみに、特定の固定ページで動作させたい場合は以下。

if ( is_page('slug') ) {
    if ( ! defined( 'ABSPATH' ) ) // 'ABSPATH' という定数が定義されていない場合
        exit; // スクリプトの実行を停止する
}

このコードは、ファイルがWordPress環境内から適切に呼び出されている場合(つまり、WordPressのコア、プラグイン、テーマなどから)には問題ない。しかし、この定数が定義されていない場合(つまり、直接アクセスされた場合)、exit関数が呼び出されてスクリプトの実行が停止する。

したがって、このコードを使用することで、送信完了ページへの直接アクセスを防ぐことが可能。

この記事を書いた人