2012-04-11 3 views
0

私のSQLクエリでは、ユーザーが入力したフォームからデータを送信しています。hereのように、PDOで列名をパラメータ化することはできません。クエリの列名がフォームのフィールド名に基づいて動的に挿入されるため、これは重要です。

$ _POST配列で提出された列名をデータベースから引き出し、一致しないものを取り除くだけで、簡単に検証できます。 SQLインジェクションを避けるためにこれを行うのは良いことですか、システムリソースの浪費ですか(データベースに依存するリクエストの実行を効果的に倍増させるため)SQLクエリを送信するときに列名を検証する必要はありますか?

答えて

1

これは

または単にシステムリソース

の無駄であるSQLインジェクションを防ぐために行うには良いことです

sysからシンプルに選択するだけで無駄になることはありません温度表。

しかし、ユーザーが一部のフィールドを許可されていない場合でも、何らかの注入が可能です。たとえば、サイト管理者によって(仮想の)フィールド「user_role」が入力されていて、POSTでそのフィールドを定義できる可能性がある場合、ユーザーはアクセス権を変更できます。

したがって、フィールドのハードコード(ホワイトリスト)は唯一信頼できる方法です。

それが効果的にデータベース

男に依存しているすべての要求の実行を倍増として。照会されるデータベース。唯一の目的です。単純な選択クエリを維持できないデータベースはナンセンスです。クエリは異なります。 1つの挿入は、10選択よりも重いです。数量ではなく、品質でクエリを区別する必要があります。

クエリの列名は、フォームのフィールド名に基づいて動的に挿入されます。

ただし、挿入/更新クエリでは非常に正しいですが、SELECTオブジェクトでは、悪いデザインの大きなサインです。私はWHERE/ORDER BY句に変数のフィールド名を立てることができますが、テーブル名句のフィールドセットを書き留める必要がある場合は、データベースの設計が間違っています。

+0

おそらく私のSELECTクエリは動的なフィールド名を使用していません。あなたが言ったように、それはばかげているでしょう。 – hamalnamal

0

列名をハードコードして高速化することができます。また、テーブルスキーマが変更されるたびにコードを更新する必要がないように、プルされたテーブルの説明をキャッシュすることもできます。脇から

1

ハードコーディング列のリストは、次のように続いて

QuerableSources 
SrcTable  SrcColumn  DescriptToUser 
SomeTable  SomeColumn  Column used for 
AnotherTable AnotherColumn Something Else 
etc. 

として、あなたが構築し、あなたがから列クエリを許可するデータベース内の別のテーブルを経由して列のリストを構築することができユーザーが読みやすくするために "DescriptionToUser"コンテンツを選択するためのコンボボックスの例です。有効な列とテーブルのソースを制御します。

彼らが探している値は、SQLインジェクションを防ぐためにスクラブしてください。

関連する問題