簡単な背景: Web アプリケーション用の Form Builder を作成しています。ビルダーの目的は、管理者がページ上のフォームをすばやく追加/変更できるようにすることです。これらのフォームによって収集されたデータをレポートで簡単に検索できるようにするために、ユーザー入力データを保持するフォームごとにアプリケーションでテーブルを作成することにしました。
セキュリティを意識して、すべてのテーブル名と列名は適切にエスケープされ、適切な引用符 (MySQL のバック クォーテーション `) で囲まれています。ただし、CREATE ステートメントのデータ型のエスケープや引用については知りません。インデックス作成と検索を改善するために、さまざまなデータ型を使用できるようにしたいと考えています。つまり、フォームの作成/変更時に動的に決定されるということです。
私たちが取っている現在のルートは、サポートしている可能性のあるデータ型をホワイトリストに登録し、オプションのサイズ入力を強制的に数値にすることです。このように、悪意のあるコードは BLOB 列を作成できず、VARCHAR のサイズとして "128); DROP DATABASE;" を渡します。128 または 0 のいずれかに変換されます (PHP が文字列から数値への変換を処理する方法を今忘れています)。
フィードバックが欲しかったのですが、これで十分な保護になると思いますか? テーブル名を適切な引用符で囲むのと同様に、私たちを保護するSQLを書く方法はありますか?
また、データ型のサイズにどのような危険があるかを知っている人はいますか? 多くのスペースを消費する可能性があると予想していますが、セキュリティには問題はありません。