データのバリデーション
TOPICS
翻訳元記事はこちらです。
データバリデーションとは、事前に定義されたパターン(またはパターン)に対してデータを分析し、有効か無効かという決定的な結果を得るプロセスです。
通常、これはユーザー入力やAPIを介したWebサービスへの呼び出しなどの外部ソースからのデータに適用されます。
以下はバリデーションの簡単な例です。
- 必須項目が空欄になっていないか確認する
- 入力された電話番号が、数字と区切り文字のみになっていることを確認する
- 郵便番号が有効なものか確認する
- 数量フィールドが0より大きいことを確認する
データの検証は、できるだけ早い段階で行うべきです。それは、アクションを実行する前にデータを検証することを意味します。
バリデーションは、フロントエンドでJavaScriptを使用し、バックエンドでPHPを使用することで行うことができます。
データのバリデーション
少なくとも、PHPの組み込み関数、WordPressのコア関数、自分で書くカスタム関数の3つの方法があります。
PHPの組み込み関数
基本的な検証は、以下を含む多くの組み込みPHP関数を使用して行うことができます。
- isset()とempty()で、変数が存在するか、空でないかをチェックできます
- mb_strlen()とstrlen()で、文字数が期待した文字数になっているか確認できます
- preg_match()、strpos()で、文字列の中に特定の文字列が存在するかどうかをチェックします
- count()で、配列の中にいくつの要素があるかチェックします
- in_array()で、対象の要素が配列中にあるかチェックします
WordPressのコア関数
WordPressには、さまざまな種類のデータの検証に役立つ便利な機能がたくさんあります。ここではいくつかの例を紹介します。
- is_email() で、メールアドレスが有効な形式であるかチェックします
- term_exists()で、タグ、カテゴリー、タクソノミーのいずれかにタームが存在するかチェックします
- username_exists()で、対象のユーザー名が存在するかチェックします
- validate_file()で、入力されたファイルパスが実際のパスであるかどうかを検証します。 (ファイルが存在するかどうかは検証しません)
条件付きタグの一覧をチェックして、以下のような関数を探してみてください。
*_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
}