1

テーブル名は可変ですが、SELECT のみが許可され、特定のテーブル (ユーザー、ログなど) が除外されることは確かです。ユーザーが SQL クエリを入力してテンプレート レポートを作成できるレポート フォームを作成しています。

SELECT 'field1' As 'foo', 'field2' as 'bar'.. 'fieldn' 
FROM 'table1',..'tablen'
JOIN ... ON ...
WHERE CONDITION

私はテーブル名を既存のテーブルのhtml選択リストに入れることができると思っていますが。

また、Users と Log を除くすべてのテーブルへの SELECT アクセスのみを持つユーザー report_appname@localhost を作成しますか? その場合、クエリの正規表現チェックを気にする必要はありませんか?

(これはPHPになります)

(理想的には、管理者がクエリを入力するだけの単一のテキストエリアが欲しかっただけで、レポート機能が出力を取得して適切に表示するなど)

4

2 に答える 2

2

デザインを再考することをお勧めします。

  • SQL を完全に解析しないと、有効な select ステートメントを特定する (および他のすべてのステートメントを除外する) ことは基本的に不可能です。正規表現はその仕事をするつもりはありません。

  • select ステートメントのみを許可した場合でも、ユーザーがデータベースに対してサービス拒否攻撃を実行する可能性があります。永久に実行される select ステートメントを作成するのは非常に簡単です (私たちは皆、それを行っています)。悪意のあるユーザーが急いでサイトをクラッシュさせる可能性があります。また、善意のユーザーでさえ、偶然にこれを行う可能性があります。

ユーザーがレポートを作成するためのオプションをより制限した方がよいでしょう。リストから特定のテーブルと列を選択して、適切なクエリを作成できるようにします。

私自身は経験がありませんが、良い出発点として役立つ無料の MySQL レポート ソフトウェアがおそらく出回っています。

于 2013-03-28T12:32:07.153 に答える
0

アプリケーションの設計を再考する必要があると思います。ユーザー テーブルとログ テーブルは 1 つのデータベースに配置し、レポートのデータを含むテーブルは別のデータベースに配置する必要があります。

それらすべてが 1 つのデータベースに既にある場合は、別のデータベースを作成し、それらをリンクしてから、ユーザーがクエリを介してアクセスできるテーブルに対してのみ、あるデータベースから別のデータベースへのシノニムを作成します。

ユーザーは、作成したばかりのデータベースでクエリを実行し、シノニムを持つテーブルに限定されます。

ケースの説明が比較的曖昧であるため、これが最善の選択肢であるかどうかはわかりませんが、私が持っている情報に基づいて、これが解決策になる可能性があります.

于 2013-03-28T12:41:36.017 に答える