問題: 私の仕事は、さまざまな製品に関する情報を保持し、この情報を提供および管理するRESTful APIを作成するデータベースを作成することです。しかし、クライアントはこれらの製品に必要なすべての情報を正確に把握していないため、後で新しい製品のプロパティに対応するためにデータベースに新しい列とテーブルが追加される可能性があります。私の質問は、これらの変更をすぐに受け入れるデータベースを作成し、少しでも変更しなくてもまだ存在しない製品プロパティに基づいて製品を安全にフェッチできるクエリを構築することです。動的準備文を使用した安全で拡張性のあるデータベース
提案された解決策: 次の構造のテストデータベースをセットアップしました。
+------------------+
| item |
+----+------+------+
| id | name | cost |
+----+------+------+
| 0 | test | 50 |
+----+------+------+
+--------------+
| color |
+----+---------+
| id | val |
+----+---------+
| 0 | blue |
| 1 | purple |
+----+---------+
+--------------------+
| item_color |
+---------+----------+
| item_id | color_id |
+---------+----------+
| 0 | 0 |
| 0 | 1 |
+---------+----------+
'item'テーブルには後でカラムが追加され、さらに多くのジャンクションテーブルが追加される可能性があります。
製品の検索要求にはhttp://www.example.com/api/products?color=purple&cost=50 が必要です。私は、適切な製品を検索するために準備された文を動的に構築しています。
function column_exists($column, $pdo) {
$statement = $pdo -> prepare("DESCRIBE item");
$statement -> execute();
$columns = $statement -> fetchAll(PDO::FETCH_COLUMN);
$column_exists = in_array($column, $columns);
return $column_exists;
}
function table_exists($table, $pdo) {
$statement = $pdo -> prepare("SHOW TABLES");
$statement -> execute();
$tables = $statement -> fetchAll();
$table_exists = in_array($table, $tables);
return $table_exists;
}
プロパティが「アイテム」テーブル内の列として、あるいはテーブルとして検出されない場合:最初のIは、プロパティが「アイテム」テーブルに含まれており、以下の機能を使用して、別のテーブル内にあるどのされるかを決定します名前を指定すると、例外がスローされます。私のコードの構文は次のようになり
プリペアドステートメント:
$sql = "SELECT * FROM item WHERE cost = :cost
AND id IN (SELECT item_id FROM item_color
WHERE color_id IN (SELECT id FROM color WHERE val = :color));";
そしてそうのように実行されるだろう、私が知りたいのは何
$statement = $pdo -> prepare($sql);
$statement -> execute(Array(":cost" => $cost, ":color" => $color));
: 私はなどの主要なボトルネックが発生しますデータベースが増え、頻繁にアクセスされますか?私の検索方法は1次SQLインジェクション攻撃に対して安全ですか?私がやっていること
: を私は初歩的なデータベース設計の原理と基本的なSQLインジェクション攻撃/防御方法については読んだことがあります。私は準備されたステートメントを動的に作成することを試みましたが、私が見つけた資料は私が探しているものではありません。私は基本的なBobby Tables attackに対して私のデザインをテストしました。この質問は関連性があるのはなぜ
:私が読んだ 設計原理は、フィールドに新しいものがあまりにも柔軟性がどのように柔軟測るする方法がありませんとの分析から利益を得ることができるデータベースがあまりにも柔軟にしようとしてに対して警告しますこの例。また、準備されたステートメントは、静的テンプレートとしてのみ使用されるように意図されているようです。私がこの魅力的なものを構築するための動的な方法を見つけたら、おそらく他の初心者もそうだろうから、我々は大きなセキュリティ上の脆弱性を作り出しているかどうかを知る必要があります。最後に、これらの質問には、データベースの設計とそれに対して実行されるクエリの構造が直接関係しているため、一緒に質問しました。
詳細: php v5.6.17 mysql v5.6。35
テーブルや列を推測してデータベース全体にアクセスできるという問題があると思います。 – LKKP4ThX
どのような問題がありますか?これが道路のボトルネックを引き起こすと思いますか?私は実際に小切手がどのくらいのオーバーヘッドを追加しているのか分かりません。 –
いいえ、セキュリティ面からです。誰かがデータベースユーザー、列のパスワードを試してみたら? – LKKP4ThX