2009-05-18 26 views
3

someObject.Textは次のように設定されている場合は、私はその後、X ++コードインジェクションの脆弱性だインジェクション安全なコール()

string salesId = someObject.Text; 

IAxaptaRecord salesLine = ax.CreateRecord("SalesLine"); 
salesLine.ExecuteStmt("select * from %1 where %1.SalesId == '" + salesId + "'"); 

axpataビジネスコネクタを介して呼び出すための注入安全な方法はあります:

"SomeSalesOrder' || %1.SalesId == 'SomeOtherOrder" 

クエリをパラメータ化する方法はありますか、直接、xのデータアクセスコード++のすべてを書き、その後、COMからそれを呼び出す方が良いでしょうか?

答えて

2

あなたはすべてのケースをカバーしていることを確認してくださいする方法はありません... ExecuteStmtを使用して

は、ほとんど間違ったアプローチです。 Axaptaメソッド(パラメータ付き)に選択したものを書いて、そのメソッドを呼び出す必要があります。

+0

リテラルを使用しない場合、単純なクエリのデフォルトの動作は、安全であると考えられるプレースホルダ(パラメータ化されたクエリ)を使用することです。複雑なクエリ(結合)の場合、確実に確認する唯一の方法は、結合でForcePlaceholdersのヒントを使用することです。 –

-2

「to \ ' 」などに置き換えてください。

string salesId = someObject.Text.Replace("'", "\\'"); 
+0

(文字列クエリ、paramsオブジェクト[]) これは、変数に必要な作業(エスケープなど)を実行した後、string.Formatで期待通りの形式でクエリを受け入れます。 – holz

+0

を与えただけではなく、例えば、すべてのエッジケースを処理するためのフレームワークで扱うパラメータ化方法を探しています –

+0

問題はすべてエスケープ処理です正しくクエリが "%1Id == {0}"から選択した場合(ここで{0}はintでなければなりません)、 "42 || 1 == 1"が渡された場合、あなたが与えた方法でそれを逃れました。 私はここでx ++注入のエッジケースのすべてを知っているわけではないので、私自身のエスケープ方法を書いてはいけません。なぜなら、私が何かを逃してしまう可能性があるから、それが遅すぎた後でしか見つけられないからです。これは機密情報がたくさんある一般公開のウェブアプリ向けですから、注射の危険性がないように100%にする必要があります。 – holz

-2

ホルツ、

あなたはforcePlaceholderキーワードとパラメータ化SELECTステートメントを使用することができます。 これはX ++のデフォルトの動作ですが、この動作は複雑な結合に対してはオーバーライドできるため、forcePlaceholderヒントを暗黙的に指定することをお勧めします。

パラメータ化されたSELECTにはオーバーヘッドがかかり、パラメータの実際の値を最適化できないため、代わりにビューまたはaxaptaクエリを使用することを検討することをお勧めします。

よろしく、 Velislavマリノフ

私はあなたがExecuteParametizedStmt」のようなものですIAxaptaRecordための拡張メソッドを作成することができ、私は
+0

'forceplaceholders'は質問に記載された問題を解決しません。 値としてX ++でリテラルを使用しても、値はカーネルによって引用されるため、問題はありません。 –

+0

あなたは間違っています。 ForcePlaceholdersはパラメータ化されたクエリを作成しますが、ForceLiteralsはSQLインジェクションに対して脆弱です。 MSによるセキュリティホワイトペーパーを確認してください。 –

+0

セキュリティホワイトペーパー:http://download.microsoft.com/download/b/6/e/b6e77418-cde2-4ed4-a920-60d7f2d17757/Microsoft%20Dynamics%20AX%20Writing%20Secure%20X++%20Code.doc 問題は、Business Connectorを介した直接SQLの使用についてです。これは悪いことです。 'forceliterals' /' forceplaceholders'も別の問題です。カーネル引用が迂回される可能性がある場合、Forceliteralは問題であり、それは反証するのが難しいかもしれません。 –

関連する問題