2

明らかに、サーバー側ですべてのユーザー入力データを検証する必要があります。「適切な」入力検証と見なされるものと、それを実行する順序に興味があります。

現在(および過去の最近のプロジェクト)の時点で、私は次のようにしています:

ユーザー入力を取得し、オブジェクトをインスタンス化し、メソッドを呼び出します。

if(isset($_POST['addCat'])) {
    $db = new DBConnection;
    $categories = new Category($db);

    if($categories->insert_cat($_POST['name']) === TRUE) {
        echo "Category Inserted Successfully!";
    }
}

インスタンス化されたオブジェクトから呼び出されるメソッド:
1. ユーザー入力をエスケープする
2. data_validation オブジェクトをインスタンス化する (以下の検証オブジェクトを参照)

class Categories {
    public function insert_cat($catName) {
        $catName = $this->mysqli->real_escape_string($catName);
        $validate = new data_validation;

        if(!($validate->validate_string($catName))) {
            echo "Invalid characters found in category name";
            die();
        }

        $query = $this->mysqli->query("INSERT INTO categories(name) VALUES ('".$catName."')");

        if($query === false) {
            printf("Error: %s\n", $this->mysqli->error);
            die();
        } else {
            return true;
        }
    }
}

data_validation クラス:
1. データをトリミングします
2. データを正規表現に一致させます
3. データベース挿入のためにデータを insert_cat メソッドに返します

class data_validation {
    public function validate_string($data) {
        // Remove excess whitespace
        $data = trim($data);

        if ( preg_match("/^[0-9A-Za-z \.\-\'\"]+$/", $data) ) {
            return true;
        } else {
            //return 'Not a valid string';
            return false;
        }
    }
}

つまり、基本的に私の質問は次のとおりです。最初にデータをエスケープしてからトリミングし、次に正規表現と比較してから、htmlentites()またはそのようなものを追加してフォーマットを保持するのは適切ですか、それとも別の順序で行う必要がありますか?

セキュリティの習慣を改善するためのヒントは大歓迎です!

4

1 に答える 1