気ままに

プログラム関連で困ったことを調べて気ままに投稿

【WordPress】エスケープ処理について

WordPressにおけるエスケープ処理

今回は、WordPressでのサイト構築も後半に入ってきて、スピードよりもセキュリティーを考えて変更が必要になったきたので、まずはWordPressの関数を使ってエスケープ処理を行うことにしました。

WordPressエスケープ関数

よく使われるエスケープ関数
他のエスケープ関数

esc_textareaのみバージョン3.1以上、他の関数は、WordPress 2.8以上で使用可能です。詳しいエスケープ処理方法については、
WordPressデータ検証にかかれているので、エスケープ処理を入れる時に見るといいです。


古いバージョンのWordPressでは、エスケープ処理の関数名が違いましたが、命名規則がばらばらだったので統一されたようです。また、古い関数を使用している人は、非推奨となっているので、気づいたら変更しましょう。

非推奨となったエスケープ用関数は新しく正しい関数に変更してください。 wp_specialchars()/en と htmlspecialchars() は esc_html()/enに。clean_url()/en は esc_url()/enに。attribute_escape()/en は esc_attr()/enに。さらに詳しくは データ検証 を参照してください。

http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%BC%E3%83%9E%E3%81%AE%E4%BD%9C%E6%88%90

エスケープ処理の使用例

スラッグ名の表示

下記のソースでターム名を表示する際、$term->nameをそのままechoせずにesc_html() 関数を使って、エスケープ処理してからHTMLとして表示しています。

<?php
$args = array(
	'post_type' => 'event', // 投稿タイプを指定
	'paged' => $paged,
	'posts_per_page' => 10,  // 表示件数
	'order' => 'date',
	'order' => 'DESC',
	'tax_query' => array(
		array(
			'taxonomy' => 'event_cat_tag',
			'terms' => array('music'),
			'field' => 'slug',
			'operator' => 'IN'
		)
	)
);
?>
<?php query_posts( $args ); ?>
<?php if (have_posts()) : ?>
	<?php while (have_posts()) : the_post(); 
	<h2><?php the_title(); ?></h2>
	<?php $terms = get_the_terms(get_the_ID(), 'event_cat'); ?>
	<a href="<?php the_permalink(); ?>">
	<?php
		if (!empty($terms)) {
			if (!is_wp_error( $terms )) {
				foreach($terms as $term) {
					echo esc_html($term->name);
				}
			}
		}
	<?php endwhile; ?>
<?php else : ?>
		<h1>イベントがありません</h1>
		<p>表示するイベントはありませんでした。</p>
<?php endif; ?>


the_title() や the_permalink() 関数は、なんでエスケープ処理が必要ないかというと、filter機能を使ってエスケープ処理が行われているからです。

filter機能について

エスケープ処理とは直接関係ないですが、処理を確認する上で参考になる為、補足として以下filterの機能について書きます。

フィルタ機能の処理については、WordPressをカスタマイズするなら覚えておきたいアクションフックとフィルターフックにて、書かれているので参照してください。

フィルタの機能を使うには、add_filter()関数を使って、フックする関数を指定します。
WordPressをインストールしたフォルダ構成がそのままの場合、「wp/wp-includes/default-filters.php」にthe_title()関数のフィルタ設定が書かれています。

<?php
// Display filters
add_filter( 'the_title', 'wptexturize'   );
add_filter( 'the_title', 'convert_chars' );
add_filter( 'the_title', 'trim'          );
?>

add_fiilterの第2引数がフックフィルタとして、the_title()が呼びだされた際に実行される関数となります。wptexturize(),convert_chars(),convert_chars()

Wordpressの自動変換機能の停止の仕方いろいろ(& → & 変換など)にわかりやす書かれているので、参考にしてみてください。


WordPressの処理で、エスケープが必要な処理の簡単な覚え方として、URLやタイトルの取得を行った変数をecho で出力する場合は、エスケープ処理が必要だと思って頂けれ、ほぼ大丈夫です。

ただし、remove_filter() で特定のフィルタ処理を外していたりadd_filter() 関数をコメントアウトしていた場合、the_xxx() といった関数を使う場合でも、エスケープ処理を毎回書く必要があることもあります。
自分の設定がどうなっているかを確認しながら、自己責任で処理を行ってください。

基礎からのWordPress (BASIC LESSON For Web Engineers)

基礎からのWordPress (BASIC LESSON For Web Engineers)

WordPress レッスンブック 3.x対応

WordPress レッスンブック 3.x対応

本格ビジネスサイトを作りながら学ぶ WordPressの教科書

本格ビジネスサイトを作りながら学ぶ WordPressの教科書