サニタイズ・エスケープ

2020.04.07 2020.04.07

TOPICS

翻訳元記事はこちらです。

サニタイズ:安全な入力

サニタイズとは、入力データをクリーニングしたり、フィルタリングしたりすることです。データがユーザーからのものであれ、APIやWebサービスからのものであれ、何を期待していいのかわからない場合や、データの検証を厳密に行いたくない場合にサニタイズを使用します。

データをサニタイズする最も簡単な方法は、WordPress の組み込み関数を使うことです。

sanitize_*() シリーズのヘルパー関数は、安全なデータを確実に処理するための効果的な方法を提供してくれます。

安全でない可能性のあるデータを受け入れるときはいつでも、それを検証するかサニタイズすることが重要です。

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()は以下のようなことをしています。

テーマの安全性を確保するためには、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) は、いずれかのメソッドで使用することができます。

データの挿入と更新

SQLのエスケープ