3

PHP Webアプリのユーザーが、SQLの知識を持っている人を必要とせずに、いくつかのテーブルに列を挿入できるようにしたいと考えています。これを行うための最良の方法は何ですか、明らかにSQLインジェクションとid-10-tエラーが懸念事項です。

使用できますか

sql = 'ALTER TABLE table_name ADD ? ?'

次に、「new_col」と「varchar(100)」を文字列として渡しますか?それとも、これはPDOの能力の範囲外ですか?

4

3 に答える 3

1

ALTER TABLE残念ながら、ステートメント内の列名またはプロパティをPDOパラメーターでバインドすることはできません。代わりに、SQLインジェクションからの保護として、文字、数字、アンダースコアのみを許可する正規表現に対して列名を検証し、ステートメントで列名を必ずバッククォートすることをお勧めします。

if (!preg_match('/^[a-z0-9_]+$/i', $column_name)) {
  // Fail!!! submitted column name doesn't match regex
}
  • ^=文字列の先頭
  • [a-z0-9_]+= 1つ以上の文字、数字、アンダースコア
  • $=文字列の終わり
  • /i=大文字と小文字を区別しない

次に、列のデータ型を確認するには、特定のオプションセットのみを許可し、それらを配列で検証する必要があります。これはホワイトリストと呼ばれます。

// Allowed types:
$acceptable_types = array('VARCHAR(200)', 'VARCHAR(10)', 'INT', 'FLOAT', 'etc...');
if (!in_array($column_data_type, $acceptable_types)) {
  // Fail!!! Invalid type submitted
}

上記のオプションは、<select>リストなどを介して提供するのが最適です。ステートメントNULL / NOT NULLを作成するためのチェックボックス入力などの追加オプションを指定することもできます。ALTER TABLE

// Only after everything is successfully validated:
$sql = "ALTER TABLE `tablename` ADD `$valid_column_name` $valid_column_datatype $NULL_option";
于 2012-12-18T02:11:42.570 に答える
0

追加の列のメタ テーブルを検討することをお勧めします。

すべての種類の車 (縁石の重量、高さなど) に存在するデータを設定し、ユーザーが追加するその他の特殊な情報を設定した場合、それはすべての車には適用されません。次のように、別のテーブルに保存できます。

車の表: ID 名 curb_weight 高さ ...

META TABLE: id (主キー) car_id (外部キー) data_name data_value

Meta テーブルは、Car テーブルと 1 対多の関係にあります。ユーザーが「ミラーのサイズ」などを記録するために 2 台の特定の車の列を追加したい場合、メタ テーブルは、自動 ID、車の ID、「ミラーのサイズ」、およびサイズを含む 2 つのレコードを取得します。

データ名のセット リストが必要な場合は、3 番目のテーブルを使用して、メタ テーブルに id、car_id、および data_id を格納できます。

ただのアイデア!

于 2014-02-04T21:16:37.350 に答える
-2

最良の方法は、ユーザーが列をいくつかのテーブルに挿入できないようにすることです特に、SQL の知識を持つ人を必要としません。
これはすべてのルールに反します。

このようなかなり基本的な質問と非常に珍しい目標の組み合わせには、常に悪い設計の匂いがします。

したがって、適切な答えは次のようになります。

  1. ユーザーが列を追加するという考えはやめましょう。それは本当に奇妙なものです。
  2. 別の質問を開始し、全体的な目標を説明し、使用例を説明し、適切な解決策を尋ねます。
于 2012-12-18T05:34:06.710 に答える