Skip to main content

 

参考情報

 

 

OutSystems

SQLインジェクションに関する警告

メッセージ
Avoid enabling the Expand Inline property of a SQL Query Parameter since it could make your application vulnerable to SQL injection.
原因

SQL要素で定義したSQLクエリを実行するとき、OutSystemsはデフォルトで準備されている文を使用します。これらの準備されている文にはSQLパラメータやプレースホルダが含まれており、SQL文を実行する前にこれらの値を定義します。これらのパラメータには指定された型の値のみを保存することができ、任意のSQLフラグメントを保存することはできません。

クエリパラメータのExpand Inlineプロパティを有効にすると、その値をSQLパラメータ値として処理できなくなります。そのクエリパラメータ値は、SQLエンジンによる最初の評価とリテラルへの変換が行われないまま、SQL文に含められます。これは、クエリパラメータを使用して動的にSQLフラグメントを完全なSQL文に挿入できることを意味しますが、同時に、必要な予防措置を取らなければエンドユーザーがこれを悪用できることも意味します。

準備されている文を使用してSQLインジェクション攻撃を回避する方法の詳細については、OWASPの「SQL Injection Prevention Cheat Sheet」をご覧ください。

警告を非表示にしても安全な場合
エンドユーザーによる入力値がSQL文に追加されないようになっている場合にのみ、この警告を非表示にしてください。

推奨事項: Expand Inlineを使用しない

OutSystemsは、Expand InlineプロパティがdisabledになっているすべてのクエリパラメータにSQLパラメータを使用します。このプロパティはデフォルトで無効になっており、これによってSQLインジェクション攻撃に対するデフォルトの保護を提供しています。

パラメータをインラインに展開して適切に使用することは困難です。なぜならば、すべてのユーザー入力を適切にエスケープ処理してからSQL文で使用する必要があるからです。できる限り、このプロパティを完全に有効にしないでください。

OutSystemsには、このプロパティを有効にせずに一般的なユースケースを実装する方法があります。 「動的SQL文の適切な作成」をご覧ください。

Expand Inlineを使用する必要がある場合は、以下の推奨事項も考慮してください。

EncodeSqlを使用して文字列リテラルをエンコードする

EncodeSql関数は、Expand Inlineプロパティが有効になっているとき、SQL文で使用される文字列リテラルをエンコードします。

EncodeSqlを使用する際は、以下に示す不適切なプラクティスを避けてください。

— EncodeSqlを使用してSQLパラメータの内容全体をエンコードしないでください。例:
myparameter = EncodeSql("WHERE surname = " + @myVariable1 + " OR name = " + @myVariable2)
このパターンはほとんどの場合不適切であり、このようにすると警告が表示されます。
EncodeSqlは文字列リテラルのエンコードにのみ使用し、SQL文のフラグメント全体のエンコードには使用しないでください。

— EncodeSqlの呼び出し内のすべての値をラップして「WHERE column IN (@values)」句を作成しないでください
values = EncodeSql(name1 + "," + name2 + "," + name)
この方法ではSQLインジェクションから保護されません
代わりに、BuildSafe_InClauseIntegerList関数とBuildSafe_InClauseTextList関数を使用して「WHERE column IN (@values)」句を作成します。

Replaceを使用した手動による文字列エンコードを実行しない
文字列リテラルのエンコードは、EncodeSql関数でのみ行う必要があります。Replace関数を使用して手動でエンコードを実行するとエラーが発生しやすくなります。さらに、アプリケーションにバグができ、後でアプリケーションのエンドユーザーによって悪用される可能性があります。
  • Was this article helpful?