ArcGIS Server には、REST または SOAP を通してマップ サービス、フィーチャ サービス、イメージ サービス、WFS サービスを操作する開発者に対して、標準化された SQL クエリの使用を強制するセキュリティ オプションが用意されています。これを使用すると、開発者とアプリケーションにとって、ArcGIS Server サービスのクエリが容易になるとともに、SQL インジェクション攻撃を防ぐことができます。標準化されたクエリはデフォルトで適用されますが、サーバー管理者は無効化することができます。
標準化されたクエリについて
標準化されたクエリが有効な場合、ArcGIS Server によって標準の構文がチェックされ、データベース固有の関数や構文は使用できなくなります。データベース固有の関数や構文を現在使用しているアプリケーション開発者は、アプリケーションのコード内にある WHERE 句を更新して、ArcGIS がサポートする一般的な SQL 構文を使用する必要があります。また、標準化されたクエリのチェックを無効化するように ArcGIS Server を設定することもできます。
標準化されたクエリの制限
標準化されたクエリは ArcGIS Server サイト全体に適用されます。サービスによって有効と無効を使い分けることはできません。
標準化されたクエリは、異なるワークスペース間の結合ではサポートされていません。また、OLE DB 接続ファイルを通じてアクセスされるデータベース テーブルはサポートされていません。これらのソースがサービスのデータに含まれる場合、データを参照するのに別の方法を使用する必要があります。
たとえば、POP_2010 = (SELECT min(POP_2010) FROM counties のような WHERE 句のサブクエリはサポートされていません。
標準化されたクエリの記述方法
このトピックの最後にある表には、ArcGIS Server でサポートされている SQL 関数が掲載されています。この表は、アプリケーション内でマップ サービス、フィーチャ サービス、イメージ サービス、WFS サービスに対して使用できる標準化されたクエリを生成するために使用可能な SQL 関数を理解するのに役立ちます。
標準化されたクエリが ArcGIS Server で使用されているかどうかを確認する方法
前述したように、標準化されたクエリはデフォルトで有効になっていて、ArcGIS Server サイトのすべてのマップ サービス、フィーチャ サービス、イメージ サービス、WFS サービスに適用されます。サーバー管理者は ArcGIS Server Administrator Directory にログインし、[system] > [properties] > [update] の順に参照して、標準化されたクエリが使用されているかどうかを確認することができます。[System Properties] ダイアログ ボックスにシステム プロパティが表示されないか、[{"standardizedQueries": "true"}] が表示されている場合、標準化されたクエリは有効になっています。
別の方法として、管理者、アプリケーション開発者、およびクライアントは、ArcGIS Server Services Directory を通じてサービスにアクセスし、[Use Standardized Queries] プロパティを調べることで、標準化されたクエリが使用されているかどうかを確認できます。マップ サービス、フィーチャ サービス、および WFS サービスの場合、サービスの特定のレイヤーまたはテーブル (https://gisserver.domain.com:6443/arcgis/rest/services/folder/service/service type/0 など) にアクセスして、プロパティを調べることができます。イメージ サービスの場合、プロパティはサービスのエンドポイント (https://gisserver.domain.com:6443/arcgis/rest/services/folder/service/ImageServer など) にあります。
ArcGIS Server Administrator Directory へアクセスする手順や、標準化されたクエリを無効化する方法については、このトピックの次のセクションをご参照ください。
標準化されたクエリの無効化
アプリケーションでデータベース固有の WHERE 句ステートメントを使用する必要がある場合、ArcGIS Server Administrator Directory にアクセスして、標準化されたクエリを無効化することができます。手順は次のとおりです。
注意:
このセキュリティ オプションを無効にすることで、サイトは SQL インジェクション攻撃に対して脆弱になります。
備考:
標準化されたクエリの無効化は、ArcGIS Enterprise のホスト フィーチャ サービスではサポートされていません。
- ArcGIS Server Administrator Directory を開き、サイトの管理者権限を持つユーザーでログインします。通常、ArcGIS Server Administrator Directory は https://gisserver.domain.com:6443/arcgis/admin で使用できます。
- [system] > [properties] > [update] の順にクリックします。
- [Operation - update] ページで、[System Properties] ダイアログ ボックスに次の文字列を入力します。
{"standardizedQueries": "false"}
- [更新]をクリックします。
- ArcGIS Server を再起動します。
これで、標準化されていないクエリを使用して、マップ、フィーチャ、イメージ、および WFS サービスへのリクエストを送信できるようにサイトが構成されました。標準化されたクエリをもう一度有効にするには、上記の手順を繰り返し、[standardizedQueries] プロパティを [True] に設定します。
ArcGIS Server でサポートされている SQL 関数
ArcGIS Server でサポートされている SQL 関数と各関数の構文を次の表に示します。アプリケーション内で次の関数と構文が使用されている場合、ArcGIS Server は、サービスで使用されているデータベースの仕様に合わせてこれらの関数を変換します。
これらの関数は、ホスト Web レイヤーではなく、ArcGIS Server Web サービスに適用されます。
関数タイプ | 関数 | 説明 | 例 | 備考 |
---|---|---|---|---|
日時 | CURRENT_DATE | セッションのタイム ゾーンにおける現在の日付を返します。 | Datefield < CURRENT_DATE | 次の日付とタイムスタンプの構文だけがサポートされています。 date 'yyyy-mm-dd'(例: Datefield = date '2012-05-29') timestamp 'yyyy-mm-dd hh:mm:ss'(例: Datefield = timestamp '2012-05-29 15:14:25') |
CURRENT_TIMESTAMP | 現在の現地時間を返します。 | Timestampfield < CURRENT_TIMESTAMP | ||
EXTRACT(extract_field FROM extract_source) | 年、月、日、時間、分など、日付/時刻の一部を返します。 extract_field 引数には、YEAR、MONTH、DAY、HOUR、MINUTE、または SECOND のいずれかのキーワードを指定できます。 | 11 月のすべての行を検索します。 EXTRACT(MONTH FROM Datefield) = 11 | ||
算術演算 | ABS(numeric_exp) | 指定した数値式の絶対値 (正の値) を返します。 | ||
CEILING(numeric_exp) | 指定した数値式以上で、最も小さな整数を返します。 | |||
FLOOR(numeric_exp) | 指定した数値式以下で、最も大きな整数を返します。 | |||
LOG(float_exp) | 指定した浮動小数点式の自然対数を返します。 | |||
LOG10(float_exp) | 指定した浮動小数点式の常用対数を返します。 | |||
POWER(numeric_exp, integer_exp) | 指定した式の、指定した累乗の値を返します。 | POWER(Numericfield, 2) = 16 | ||
ROUND(numeric_exp, integer_exp) | 指定した長さまたは精度に丸めた数値を返します。 | |||
TRUNCATE(numeric_exp, integer_exp) | 値を丸めずに、特定の長さまたは精度にした数値を返します。 | |||
String | CHAR_LENGTH(string_exp) | 入力文字列の長さ (文字数) を返します。 | ||
CONCAT(string_exp1, string_exp2) | 複数の文字列を連結した文字列を返します。 | |||
LOWER(string_exp) | 大文字のデータを小文字に変換した文字式を返します。 | |||
SUBSTRING(string_exp FROM start FOR length) | 文字またはテキスト式の一部を返します。 | Stringfield の値から、最初の 2 文字が Ch である行をすべて検索します。 SUBSTRING(Stringfield FROM 1 FOR 2)='Ch' | ||
UPPER(string_exp) | 小文字のデータを大文字に変換した文字式を返します。 |