Skip to main content
OutSystems

動的SQL文の適切な作成

以下は、OutSystemsにおいて動的なSQL文を一般的なユースケースに実装した例です。これはSQLインジェクションの脆弱性の回避に有効です。

また、脆弱性につながる既知の不適切なプラクティスをOutSystemsプラットフォームで検出したときに表示される警告については、「SQLインジェクションに関する警告」をご覧ください。

フィルタ条件をオンまたはオフにする

Expand Inlineを有効にしたパラメータを使用せず、追加の変数を使用して条件のオン/オフを切り替えます。

たとえば、姓(surname)によるオプションフィルタを用意する場合、次のようなSQLクエリを定義できます。

SELECT {Users}.[Username], {Users}.[Surname], {Users}.[Firstname] FROM {Users} WHERE {Users}.[IsActive] = 1 AND (@filterBySurname = 0 OR {Users}.[Surname] LIKE '%' + @surnameFilter +'%')

クエリパラメータfilterBySurname(Booleanデータ型)およびsurnameFilter(Textデータ型)の値は次のようになります。

filterBySurname = surnameFilter <> "" surnameFilter = surnameFilter

このように、このSQL文を使用してすべてのユーザーまたは特定の姓(surname)のユーザーのリストを取得すると、Expand Inlineプロパティの有効化とEncodeSql関数の使用を避けることができます。

SQLクエリでカスタムソート順を実装する

準備されている文のクエリパラメータはデータの置換でのみ使用できます。テーブル名、テーブルフィールド、演算子、「ORDER BY」句などのSQL構文を指定するためのパラメータとしては使用できません。そのため、SQLクエリで返された結果のソート順をカスタマイズするには、カスタムソート順を定義するパラメータのExpand Inlineプロパティを有効にする必要があります。

前述のとおり、エンドユーザーが指定した値をSQL文の中で使用しないでください。これはSQL文のソート順でも同様に有効です。EncodeSqlビルドインはSQL文の一部ではなく文字列リテラルをエンコードするように設計されているため、この場合は保護を提供しません。

SQL文でカスタムソート順を実装するには、RichWidgetsで利用できるList_SortColumnウィジェットとList_SortColumn_GetOrderByサーバーアクションを併用します。詳細については、「開発に関するよくある質問」の「SQLクエリでのList Sort Columnウィジェットの使用」をご覧ください。

アプリケーションのエンドユーザーに複雑なソート機能を提供する必要がある場合は、列名/アトリビュート名を入力せずに必要なソートオプションを選択できるUIを提供する必要があります。エンドユーザーが選択したオプションに基づき、アプリケーションですべての列名とソート順を特定するようにしてください。

  • Was this article helpful?