サニタイズ・エスケープ
TOPICS
翻訳元記事はこちらです。
サニタイズ:安全な入力
サニタイズとは、入力データをクリーニングしたり、フィルタリングしたりすることです。データがユーザーからのものであれ、APIやWebサービスからのものであれ、何を期待していいのかわからない場合や、データの検証を厳密に行いたくない場合にサニタイズを使用します。
データをサニタイズする最も簡単な方法は、WordPress の組み込み関数を使うことです。
sanitize_*()
シリーズのヘルパー関数は、安全なデータを確実に処理するための効果的な方法を提供してくれます。
- sanitize_email()
- sanitize_file_name()
- sanitize_html_class()
- sanitize_key()
- sanitize_meta()
- sanitize_mime_type()
- sanitize_option()
- sanitize_sql_orderby()
- sanitize_text_field()
- sanitize_title()
- sanitize_title_for_query()
- sanitize_title_with_dashes()
- sanitize_user()
- esc_url_raw()
- wp_filter_post_kses()
- wp_filter_nohtml_kses()
安全でない可能性のあるデータを受け入れるときはいつでも、それを検証するかサニタイズすることが重要です。
Inputフィールドの例
titleという名前のinputフィールドがある場合
<input id="title" type="text" name="title">
sanitize_text_field()関数で、サニタイズできます。
$title = sanitize_text_field( $_POST['title'] );
update_post_meta( $post->ID, 'title', $title );
sanitize_text_field()
は以下のようなことをしています。
- 無効な UTF-8 をチェックします
- 「<」を実態に変換します
- すべてのタグを削除します
- 改行、タブ、余分なホワイトスペースを削除します
テーマの安全性を確保するためには、WordPress API とそのヘルプ機能に頼ることを忘れないでください。
エスケープ:安全な出力
データを出力する際には、必ず適切にエスケープするようにしてください。
エスケーピングとは、不正なHTMLやスクリプトタグのような不要なデータを除去することで出力を安全にするプロセスです。
エスケーピングは、エンドユーザーにレンダリングする前にデータを保護し、XSS (クロスサイトスクリプティング) 攻撃を防ぎます。
クロスサイトスクリプティング(XSS)は、一般的にウェブアプリケーションに見られるコンピュータセキュリティの脆弱性の一種です。XSS を利用すると、攻撃者はクライアント側のスクリプトを他のユーザーが閲覧しているウェブページに注入することができます。クロスサイトスクリプティングの脆弱性は、攻撃者が同一オリジンポリシーなどのアクセス制御を迂回するために使用されることがあります。
WordPressには、最も一般的なシナリオで使えるヘルパー機能がいくつかあります。
esc_html() – この関数は、HTML要素が表示されているデータの一部分を囲んでいる場合にいつでも使用します。
<?php echo esc_html( $title ); ?>
esc_url() – この関数は、HTML 要素の src 属性や href 属性を含むすべての URL で使用します。
<img src="<?php echo esc_url( $great_user_picture_url ); ?>" />
esc_js() – インラインJavascriptにはこの関数を使用します。
<a href="#" onclick="<?php echo esc_js( $custom_js ); ?>">Click me</a>
esc_attr() – この関数は、HTML要素の属性に表示される他のすべてのものに使用します。
<ul class="<?php echo esc_attr( $stored_class ); ?>"> </ul>
esc_textarea() – textarea要素内で使用するテキストをエンコードします。
<textarea><?php echo esc_textarea( $text ); ?></textarea>
出力のエスケープは、できるだけ最後のタイミングに行う必要があります。
ローカライズでエスケープ
echo を使ってデータを出力するのではなく、e()
や _()
のような WordPress のローカライズ関数を使うのが一般的です。
これらの関数は、単にローカライズ関数をエスケープ関数の中でラップしただけのものです。
esc_html_e( 'Hello World', 'text_domain' );
// same as
echo esc_html( __( 'Hello World', 'text_domain' ) );
これらのヘルパー関数は、ローカライズとエスケープを組み合わせたものです。
カスタムエスケープ
特定の方法で出力をエスケープする必要がある場合には、 wp_kses()
(「キス」と発音します) 関数が便利です。例えば、出力にHTML要素や属性を表示させたい場合があります。
この関数は、指定された HTML 要素、属性、属性値のみが出力されるようにし、HTML エンティティを正規化します。
$allowed_html = [
'a' => [
'href' => [],
'title' => [],
],
'br' => [],
'em' => [],
'strong' => [],
];
echo wp_kses( $custom_content, $allowed_html );
wp_kses_post()
は wp_kses
のラッパー関数で、 $allowed_html
は投稿コンテンツで使用するルールのセットです。
echo wp_kses_post( $post_content );
データベースのエスケープ
SQL インジェクション攻撃を防ぐために、SQL クエリ内のすべてのデータは、SQL クエリを実行する前に SQL エスケープされていなければなりません。WordPress には、SQL クエリのエスケープを支援する $wpdb
というヘルパークラスが用意されています。
データの取得
エスケープされた SQL クエリ (この例では $sql
) は、いずれかのメソッドで使用することができます。
- $wpdb->get_row($sql)
- $wpdb->get_var($sql)
- $wpdb->get_results($sql)
- $wpdb->get_col($sql)
- $wpdb->query($sql)