-1

Zend のinsert()関数を使用して、データベース テーブルにレコードを挿入しています。例えば。データベース モデル オブジェクトから、関数を呼び出しZend_Db_Table's insert()て、受信データを配列として渡します$data

 $this->insert($data);

$data配列です。の内容は$data、整数、お金、テキストなどのデータ型が混在しています。

入ってくる配列を検証するために$data、関数を書きましたverifyData($data)

private function verifyData(&$data) {
    //Trim whitespace characters from incoming data.
    foreach($data as $key => $val)
    {
        $data[$key] = trim($val);
        if(empty($data[$key])) {
            unset($data[$key]);
        }
    }

    //Checking for not null table columns
    if( empty($data['id']) || empty($data['name']) || empty($data['age'])) {
        error_log("One of the required fields is missing");
        return false;
    }
    else {
        return true;
    }
}

上記のように、この関数:

  1. 入力データをトリミングし、$data 配列のフィールドが空の場合は設定を解除します。
  2. 次に、この関数は必須フィールドの存在をチェックし、必須フィールドが欠落している場合は false を返します。この特定の定義では、ID、名前、および年齢が必要です。ただし、検証したい必須ではないフィールドが他にもある可能性があります。例: $data['salary']

上記の関数に次の検証を追加する際にヘルプ/提案が必要です/他の可能な方法で:

  1. 配列の各要素のデータ型が期待どおりかどうかを確認したい/データを挿入する前に特定のデータ型に変換したい。
  2. SQL インジェクションの脅威に対処できるように、受信データを変換/処理したいと考えています。

データ型チェックを処理する 1 つの方法は、受信データ配列をループ処理し、特定の列の値をデータ型に変換して検証することです。しかし、上記の2点を実装するための効率的/標準的な方法があるかどうかを知りたい.

シナリオの例は、たとえば私の Web フォームで、新しい人が db に追加されたときに、名前と年齢が必須である名前、年齢、および給与を入力する必要があります。年齢と給与は整数のみで入力してください。この制限を PHP レベルで実装したいと考えており、Zend Framework を使用しています。

ヘルプ/提案をいただければ幸いです。

4

2 に答える 2

1

Zend_filter_Inputは Zend_Validation と Zend_Filter を使用してフィルタリングと検証をデータセットに適用します

//A simple exaample of how you might use Zend_Filter_Input
private function verifyData(&$data) {
    //Add any filters you want there are many standard filters, order of filters may matter
    $filters = array(
        '*' => 'StringTrim', //trim all fields
        'id' => 'Digits'     //filter for digits on id field
    );
    //add any validators you want there are many standard validators, order of validators may matter
    $validators = array(
        '*' => 'NotEmpty' //check all fields for empty()
    );
$input = new Zend_Filter_Input($filters, $validators, $data) {
    if ($input->isValid() {
       return TRUE;
    } else {
       return FALSE
    }    
}

言うまでもなく、これはこれがどのように機能するかの不完全な例ですが、基本的な考え方は理解できるはずです。検証を行うにはさまざまな方法があります。好きな方法を見つけて実行してください。

私の個人的なお気に入りは、入力段階 (フォーム、コントローラーなど) で基本的なフィルタリングと検証を行い、データをマッパーに送信してデータベースに挿入する前に、ドメイン モデルで他のフィルタリングまたは検証を適用することです。

幸運を...

標準フィルター
標準検証ツール

于 2012-07-05T09:56:38.543 に答える
0

insert遭遇する可能性のある SQL インジェクションの問題はすでに処理されているはずです。型チェックと変換に関しては、PHP で使用できるメソッドがいくつかあります。たとえば、次のようにチェックして変換しますint

if(ctype_digit($something)) {
    $something = (int)$something;
}

それは本当に必要な特定の検証に依存します。

于 2012-07-04T21:52:47.837 に答える