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
(任意)-
許可するプロトコル(例:
http
、https
、mailto
など)を配列で指定します。指定しない場合は、WordPressのデフォルトプロトコルが使用されます。 $context
(任意)-
URLが使われる文脈を指定する文字列です。文脈に応じてWordPressがエスケープ処理を調整する場合があります(例:
display
、edit
など)。
戻り値
- エスケープされたURL
-
不正な部分をエスケープし、正しい形式のURLを返します。許可されていないプロトコルの場合、空文字列を返します。
オプション
esc_url()
に特別なオプションはありませんが、プロトコルの制限がオプションの役割を果たします。
使用例
<?php
$allowed_url = 'https://example.com';
echo '<a href="' . esc_url($allowed_url, array('http', 'https')) . '">安全なリンク</a>';
?>
この例では、http
とhttps
のみを許可しています。指定したプロトコル以外の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を表示する際に利用することで、XSS攻撃のリスクを低減します。