MENU

esc_url()– Function –

esc_url()は、URLをエスケープして出力するためのテンプレートタグです。不正なURLの混入を防ぎ、サイトのセキュリティを高めます。

目次

機能の説明

esc_url()は、外部リンクやフォームのaction属性など、URLとして出力される値を検証し、不正なURLスキーム(例:javascript:など)を排除します。これにより、クロスサイトスクリプティング(XSS)攻撃のリスクを軽減します。

シンプルなコード例

<?php
$url = 'https://example.com/?param=<script>alert("XSS")</script>';
echo '<a href="' . esc_url($url) . '">リンク</a>';
?>

この例では、<script>タグが含まれるURLがエスケープされ、https://example.com/?param=%3Cscript%3Ealert(%22XSS%22)%3C/script%3Eとして出力されます。これにより、悪意のあるスクリプトが実行されることを防ぎます。

使い方の解説

esc_url()は、ユーザー入力のURLをリンクやリダイレクト先として使う場合に推奨されます。フォームのaction属性や、アンカータグ<a>hrefに指定するURLも、この関数を使って安全に処理します。

引数

$url (必須)

エスケープしたいURLを指定します。

$protocols (任意)

許可するプロトコル(例:httphttpsmailtoなど)を配列で指定します。指定しない場合は、WordPressのデフォルトプロトコルが使用されます。

$context (任意)

URLが使われる文脈を指定する文字列です。文脈に応じてWordPressがエスケープ処理を調整する場合があります(例:displayeditなど)。

戻り値

エスケープされたURL

不正な部分をエスケープし、正しい形式のURLを返します。許可されていないプロトコルの場合、空文字列を返します。

オプション

esc_url()に特別なオプションはありませんが、プロトコルの制限がオプションの役割を果たします。

使用例

<?php
$allowed_url = 'https://example.com';
echo '<a href="' . esc_url($allowed_url, array('http', 'https')) . '">安全なリンク</a>';
?>

この例では、httphttpsのみを許可しています。指定したプロトコル以外のURLが渡された場合は、エスケープ処理が行われた結果、空文字列が返されます。

一緒に使うことが多い関連タグ

wp_redirect()

wp_redirect()は、ユーザーを指定のURLにリダイレクトするテンプレートタグです。リダイレクト先のURLにはesc_url()を適用することで安全性が向上します。

<?php
$url = 'https://example.com/dashboard';
if (is_user_logged_in()) {
    wp_redirect(esc_url($url));
    exit;
}
?>

このコードは、ログインしているユーザーをhttps://example.com/dashboardにリダイレクトします。esc_url()でURLを安全に処理しています。

esc_attr()

esc_attr()は、HTML属性値をエスケープするためのタグです。フォームのaction属性など、URLが属性値に使用される場合はesc_attr()と併用します。

<?php
$action_url = 'https://example.com/submit';
echo '<form action="' . esc_attr(esc_url($action_url)) . '" method="POST">';
?>
  <input type="submit" value="送信">
</form>

この例では、esc_url()でURLをエスケープした後にesc_attr()を使って、フォームのaction属性に安全に出力しています。

追加情報を取得したい場合

get_permalink() で取得できるURL

<?php
$post_url = get_permalink(42); // ID 42 の投稿のパーマリンクを取得
echo esc_url($post_url);
?>

get_permalink()で取得した投稿のURLをesc_url()でエスケープし、安全に出力しています。

出力できる情報

  • permalink: 投稿や固定ページのパーマリンク
  • category_link: カテゴリーのURL
  • tag_link: タグのURL

想定されるトラブル

不正なURLがそのまま出力される

esc_url()を使っていないか、誤った場所で使っている。

解決策

ユーザー入力や外部から取得したURLは必ずesc_url()でエスケープしてから出力する。

許可していないプロトコルのURLが使えない

許可するプロトコルが不足している。

解決策

$protocols引数で必要なプロトコルを明示的に指定します。

Q&A

esc_url()はすべてのURLに使うべきですか?

外部から取得したURLやユーザー入力のURLは、XSS攻撃を防ぐためにesc_url()を使うべきです。ただし、内部的に安全なURLには不要です。

URL以外の文字列もesc_url()でエスケープできますか?

いいえ、esc_url()はURL専用のエスケープ関数です。他の用途にはesc_html()esc_attr()を使いましょう。

まとめ

esc_url()は、URLを安全にエスケープして出力するためのテンプレートタグです。外部入力やユーザー入力のURLを表示する際に利用することで、XSS攻撃のリスクを低減します。

カスタマイズ例

1