2016-04-01 18 views
2

ユーザがテーブルの定義済みカラムに対して式を生成できるようにしました。ユーザーは列や表を作成し、一意の列と非NULL列などの制約を定義できます。私はまた、 "計算された列"を生成できるようにしたい。私PostgreSQLはので、私はこのような表現を使うだろうと周りを取得するために、計算列を許可しないことを承知しています:ユーザーはこのSQLカラムに対するユーザ生成式の安全な方法

{{CarPrice}} + ({{CarPrice}} * {{TaxRate}}) 

のようなものを入力することができます

SELECT CarPrice, TaxRate, CarPrice + (CarPrice * TaxRate) AS FullPrice FROM CarMSRP 

その後は

に翻訳さ
CarPrice + (CarPrice * TaxRate) 

これがSQLインジェクションに対して脆弱かどうかはわかりません。もしそうなら、どうすればこれを安全にすることができますか?

+0

ビューを作成させるのはなぜでしょうか?ビューは計算カラムを持つことができます –

答えて

1

私が正しく理解していれば、あなたは上記のようにユーザー入力を受け取り、選択列リストに置き換えてください。そうであれば、それは安全ではないと確信している:

"* from SomeSystemTable--({{CarPrice}} + ({{CarPrice}} * {{TaxRate}})" 

許可を得ている他のテーブルから何かを選択できるようになる。式ツリーを構築して、次のことを避けることができます。ユーザー入力を解析して、(算術式の解析などの)変数とその間の算術演算を記述する構造体に構文解析します。それ以外の場合は、文字列からすべての{{}}を削除することができます({{}}が表の列に対応することを確認してください)、 "+ - *()"と空白文字だけを残してください。

ユーザーエクスペリエンスの観点から、とにかく式を解析し、実際にクエリを実行せずにエラーを警告する必要があることに注意してください。

2

なぜこれを行うには保存された手順を利用しませんか?

このようにして、ユーザーが書き込んだものを受け取る変数を定義し、BLACKLISTED単語(DELETE、TRUNCATE、ALL、*など)があるかどうかを確認できます。

私はPostgreSQLについて知らないけど、そこでは不可能な場合は、それらを翻訳してSELECTステートメントを呼び出す前に問題のあるコマンドをチェックすることもできます。

+0

PostgreSQLのオプションだと思いますが(分かりません)、これは間違いなく正しいオプションです。より安全ですが、SPを変更するときに再コンパイルする必要はありません – levelonehuman

関連する問題