データのバリデーション

2020.04.07 2020.04.07

TOPICS

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

データバリデーションとは、事前に定義されたパターン(またはパターン)に対してデータを分析し、有効か無効かという決定的な結果を得るプロセスです。

通常、これはユーザー入力やAPIを介したWebサービスへの呼び出しなどの外部ソースからのデータに適用されます。

以下はバリデーションの簡単な例です。

データの検証は、できるだけ早い段階で行うべきです。それは、アクションを実行する前にデータを検証することを意味します。

バリデーションは、フロントエンドでJavaScriptを使用し、バックエンドでPHPを使用することで行うことができます。

データのバリデーション

少なくとも、PHPの組み込み関数、WordPressのコア関数、自分で書くカスタム関数の3つの方法があります。

PHPの組み込み関数

基本的な検証は、以下を含む多くの組み込みPHP関数を使用して行うことができます。

WordPressのコア関数

WordPressには、さまざまな種類のデータの検証に役立つ便利な機能がたくさんあります。ここではいくつかの例を紹介します。

条件付きタグの一覧をチェックして、以下のような関数を探してみてください。

*_exists()*_validate()、および is_*() のような名前の関数を検索します。これらのすべてが検証関数ではありませんが、多くの関数が役立ちます。

カスタムPHPとJavaScriptの関数

自分でPHPやJavaScriptの関数を書いて、プラグインに含めることができます。バリデーション関数を書くときは、質問のような名前をつけたいでしょう (例: is_phone, is_available, is_us_zipcode)。

この関数はデータが有効かどうかに応じて、trueかfalseのどちらかのブール値を返します。これにより、この関数を条件として使用することができます。

例1

ユーザーが入力する米国の郵便番号入力フィールドがあるとします。

<input id="wporg_zip_code" type="text" maxlength="10" name="wporg_zip_code">

テキストフィールドでは最大10文字までの入力が可能で、使用できる文字の種類に制限はありません。1234567890 のような有効なものを入力することもできますし、eval() のような無効なものを入力することもできます。

入力フィールドのmaxlength属性はブラウザによってのみ強制されるので、サーバ上で入力の長さを検証する必要があります。そうしないと、攻撃者はmaxlengthの値を変更してしまう可能性があります。

バリデーションを使用することで、有効な郵便番号のみを受け入れるようにすることができます。

まず、米国の郵便番号を検証する関数を書く必要があります。

<?php function is_us_zip_code($zip_code) { // scenario 1: empty if (empty($zip_code)) { return false; } // scenario 2: more than 10 characters if (strlen(trim($zip_code)) > 10) {
        return false;
    }
 
    // scenario 3: incorrect format
    if (!preg_match('/^\d{5}(\-?\d{4})?$/', $zip_code)) {
        return false;
    }
 
    // passed successfully
    return true;
}

フォームを処理するとき、コードはwporg_zip_codeフィールドをチェックし、その結果に基づいてアクションを実行しなければなりません。

if ( isset( $_POST['wporg_zip_code'] ) && is_us_zip_code( $_POST['wporg_zip_code'] ) ) {
    // your action
}

例2

ある投稿についてデータベースに問い合わせをしようとしていて、 ユーザーに問い合わせ結果をソートする機能を与えたいとします。

この例では、(入力パラメータ “orderby” に格納されている)入力されたソートキーが有効かどうかを、PHPの組み込み関数in_arrayを使用して許可されたソートキーの配列と比較することでチェックしています。
これにより、ユーザーが悪意のあるデータを渡したり、ウェブサイトを危険にさらしたりすることを防ぐことができます。

入力されたソートキーを配列と照合する前に、そのキーは WordPress の組み込み関数 sanitize_key に渡されます。この関数は、特にキーが小文字であることを保証します。 (in_array は大文字小文字を区別して検索を行います)

in_arrayの3番目のパラメータに “true “を渡すと、厳密な型チェックが可能になります。これにより、入力されるソートキーが他のデータ型ではなく文字列であることを確認することができます。

<?php
$allowed_keys = ['author', 'post_author', 'date', 'post_date'];
 
$orderby = sanitize_key( $_POST['orderby'] );
 
if ( in_array( $orderby, $allowed_keys, true ) ) {
    // modify the query to sort by the orderby key
}