Skip To Content

Appliquer des requêtes SQL standardisées

ArcGIS Server propose une option de sécurité qui force les développeurs à employer des requêtes SQL standardisées lorsqu’ils utilisent des services de carte, d’entités, d’imagerie et WFS via REST ou SOAP. Cela facilite l’interrogation des services ArcGIS Server par les développeurs et les applications et permet d’empêcher les attaques par injection de code SQL. Les requêtes standardisées sont appliquées par défaut, mais elles peuvent être désactivées par l’administrateur du serveur.

Requêtes standardisées

Lorsque les requêtes standardisées sont activées, ArcGIS Server recherche la syntaxe standard et n’autorise pas la syntaxe et les fonctions spécifiques à la base de données. Si vous développez des applications et que vous utilisez une syntaxe et des fonctions spécifiques à la base de données, vous devez mettre à jour les clauses WHERE du code de l’application pour qu’elles utilisent la syntaxe SQL normale prise en charge par ArcGIS. Vous pouvez également désactiver sur ArcGIS Server la fonction de recherche de requêtes standardisées.

Limites des requêtes standardisées

Les requêtes standardisées sont appliquées au site ArcGIS Server dans sa totalité. Elles ne peuvent pas être activées pour certains services et désactivées pour d’autres.

Les requêtes standardisées ne sont pas prises en charge sur les jointures entre différents espaces de travail. En outre, les tables de bases de données dont l’accès est possible via un fichier de connexion OLE DB ne sont pas prises en charge. Si les données de service contiennent ces sources, vous devez utiliser d’autres méthodes pour référencer les données.

Les sous-requêtes sous forme de clause WHERE, par exemple POP_2010 = (SELECT min(POP_2010)) FROM counties, ne sont pas prises en charge.

Rédiger une requête standardisée

Le tableau à la fin de cette rubrique décrit les fonctions SQL prises en charge dans ArcGIS Server. Vous pouvez vous y reporter pour savoir quelles fonctions SQL employer pour générer des requêtes standardisées pouvant être utilisées sur des services de carte, d’entités, d’imagerie et WFS dans vos applications.

Déterminer si des requêtes standardisées sont utilisées par ArcGIS Server

Comme mentionné précédemment, les requêtes standardisées sont activées par défaut et s’appliquent à tous les services de carte, d’entités, d’imagerie et WFS du site ArcGIS Server. Toutefois, un administrateur de serveur peut vérifier que des requêtes standardisées sont utilisées en se connectant au répertoire administrateur de ArcGIS Server et en accédant à system (système) > properties (propriétés) > update (mettre à jour). Si aucune propriété système n’apparaît dans la boîte de dialogue System Properties (Propriétés système) ou que la mention {"standardizedQueries": "true"} apparaît, cela signifie que les requêtes standardisées sont activées.

Pour savoir si des requêtes standardisées sont utilisées, les administrateurs, développeurs d’applications et clients peuvent également accéder à un service via le répertoire des services de ArcGIS Server et examiner la propriété Use Standardized Queries (Utiliser des requêtes standardisées). Pour les services de carte, d’entités et WFS, la propriété est accessible par l’intermédiaire d’une couche ou d’une table spécifique du service, par exemple https://gisserver.domain.com:6443/arcgis/rest/services/folder/service/service type/0. Pour les services d’imagerie, la propriété est disponible à l’extrémité du service, par exemple https://gisserver.domain.com:6443/arcgis/rest/services/folder/service/ImageServer.

Pour savoir comment accéder au répertoire d'administrateur ou désactiver les requêtes standardisées, reportez-vous à la section suivante de cette rubrique.

Désactiver les requêtes standardisées

Si vous devez utiliser des instructions de clauses WHERE spécifiques à la base de données dans l’application, vous pouvez désactiver les requêtes standardisées en accédant au répertoire administrateur de ArcGIS Server. Pour ce faire, suivez les instructions ci-après.

Attention :

En désactivant cette option de sécurité, votre site est plus exposé aux attaques par injection de code SQL.

Remarque :

La désactivation des requêtes standardisées n’est pas prise en charge pour les services d’entités hébergés dans ArcGIS Enterprise.

  1. Ouvrez le répertoire administrateur et ouvrez une session en tant qu’administrateur sur le site.

    Le répertoire administrateur est généralement disponible à l’adresse https://gisserver.domain.com:6443/arcgis/admin.

  2. Cliquez sur système > propriétés > mettre à jour.
  3. Sur la page Opération - mise à jour, entrez la chaîne suivante dans la boîte de dialogue System Properties (Propriétés système) :

    {"standardizedQueries": "false"}

  4. Cliquez sur Update (Mettre à jour).
  5. Redémarrez ArcGIS Server.

Votre site est désormais configuré pour permettre aux utilisateurs d’envoyer des requêtes aux services de carte, d’entités, d’imagerie et WFS via des requêtes non standardisées. Pour réactiver les requêtes standardisées, renouvelez les instructions ci-dessus, mais définissez la propriété standardizedQueries sur true.

Fonctions SQL prises en charge dans ArcGIS Server

La liste suivante présente les fonctions SQL prises en charge par ArcGIS Server ainsi que leur syntaxe respective. Lorsque les fonctions et la syntaxe suivantes sont utilisées dans les applications, ArcGIS Server les convertit afin qu’elles respectent la spécification de la base de données utilisée par le service.

Ces fonctions s’appliquent aux services Web ArcGIS Server et non aux couches Web hébergées.

Type de jonctionFonctionDescriptionExemple

Date

CURRENT_DATE

Renvoie la date actuelle dans le fuseau horaire de la session.

Remarque :

Le fuseau horaire de la session hébergée est toujours UTC.

Datefield < CURRENT_DATE

CURRENT_TIME

Renvoie l’heure actuelle dans le fuseau horaire de la session.

Remarque :

Le fuseau horaire de la session hébergée est toujours UTC.

Timestampfield < CURRENT_TIME

CURRENT_TIMESTAMP

Renvoie l'heure locale actuelle.

Remarque :

Le fuseau horaire de la session hébergée est toujours UTC.

Timestampfield < CURRENT_TIMESTAMP

EXTRACT(extract_field FROM extract_source)

Renvoie la partie extract_field de l'argument extract_source.

L'argument extract_field peut correspondre à l'un des mots-clés suivants : ANNEE, MOIS, JOUR, HEURE, MINUTE ou SECONDE.

Recherche toutes les lignes du mois de novembre :

EXTRACT(MONTH FROM Datefield) = 11

Mathématiques

ABS(numeric_exp)

Renvoie la valeur absolue (positive) de l'expression numérique spécifiée.

ABS(-99)=90

ACOS(numeric_exp)

Renvoie l’arc cosinus de numeric_exp sous forme d’un angle exprimé en radians.

ASIN(numeric_exp)

Renvoie l’arc sinus de numeric_exp sous forme d’un angle exprimé en radians.

ATAN(numeric_exp)

Renvoie l’arc tangente de numeric_exp sous forme d’un angle exprimé en radians.

CEILING(numeric_exp)

Renvoie le plus petit nombre entier supérieur ou égal à l’expression numérique spécifiée.

Recherchez toutes les lignes dans lesquelles l’entier plafond de numeric_exp est égal à une valeur de votre choix :

CEILING(ratings)=90

COS(numeric_exp)

Renvoie le cosinus de numeric_exp sous forme d’un angle exprimé en radians.

COSH(numeric_exp)

Renvoie le cosinus hyperbolique de numeric_exp sous forme d’un angle exprimé en radians.

FLOOR(numeric_exp)

Renvoie le plus grand nombre entier inférieur ou égal à l’expression numérique spécifiée.

Recherchez toutes les lignes dans lesquelles l’entier plancher de numeric_exp est égal à une valeur de votre choix :

FLOOR(ratings)=75

LOG(float_exp)

Renvoie le logarithme naturel de l’expression flottante spécifiée.

LOG10(float_exp)

Renvoie le logarithme de base 10 de l’expression flottante spécifiée.

MOD(integer_exp1, integer_exp2)

Renvoie le reste de la division de integer_exp1 par integer_exp2.

Recherchez toutes les lignes dans lesquelles integer_exp1 est un nombre pair :

MOD(userid,2)=0

POWER(numeric_exp, integer_exp)

Renvoie la valeur de l’expression spécifiée à la puissance indiquée.

POWER(Numericfield, 2) = 16

ROUND(numeric_exp, integer_exp)

Renvoie une valeur numérique arrondie à la longueur ou précision spécifiée.

SIGN(numeric_exp)

Renvoie un indicateur du signe mathématique de numeric_exp.

Exemples : 0 pour zéro, 1 pour positif, -1 pour négatif.

Recherchez toutes les lignes dans lesquelles numeric_exp est un nombre négatif :

SIGN(elevation)=-1

SIN(numeric_exp)

Renvoie le sinus de numeric_exp sous forme d’un angle exprimé en radians.

SINH(numeric_exp)

Renvoie le sinus hyperbolique de numeric_exp sous forme d’un angle exprimé en radians.

TAN(numeric_exp)

Renvoie la tangente de numeric_exp sous forme d’un angle exprimé en radians.

TANH(numeric_exp)

Renvoie la tangente hyperbolique de numeric_exp sous forme d’un angle exprimé en radians.

TRUNCATE(numeric_exp, integer_exp)

Renvoie un numeric_exp tronqué à integer_exp positions à droite de la virgule sans arrondir la valeur.

TRUNCATE(0.5463111445,3)=0.546

Agréger

AVG(numeric_exp, integer_exp)

Renvoie la moyenne calculée des valeurs dans numeric_exp.

outStatistics=[{"statisticType": "avg","onStatisticField": "pop1997","outStatisticFieldName": "avg_pop1997"}]

COUNT(string_exp OR ASTERISK)

Renvoie le nombre de lignes contenant un string_exp.

outStatistics=[{"statisticType": "count","onStatisticField": "p_females","outStatisticFieldName": "count_p_females"}]

MAX(numeric_exp)

MAX(string_exp)

MAX(datetime_exp)

Renvoie la valeur de tangente dans numeric_exp, string_exp ou datetime_exp.

Recherchez la valeur maximale parmi toutes les lignes numeric_exp :

outStatistics=[{"statisticType": "max","onStatisticField": "p_males","outStatisticFieldName": "max_p_males"}]

MIN(numeric_exp)

MIN(numeric_exp)

MIN(numeric_exp)

Renvoie la plus petite valeur dans numeric_exp, string_exp ou datetime_exp.

Recherchez la valeur minimale parmi toutes les lignes numeric_exp :

outStatistics=[{"statisticType": "min","onStatisticField": "pop1990","outStatisticFieldName": "min_pop1990"}]

STDDEV(numeric_exp)

Renvoie l’écart type des valeurs dans numeric_exp.

Recherchez la valeur d’écart type par mi toutes les lignes numeric_exp :

outStatistics=[{"statisticType": "stddev","onStatisticField": "eval_score","outStatisticFieldName": "stddev_eval_score"}]

SUM(numeric_exp)

Renvoie la somme des valeurs dans numeric_exp.

Recherchez la somme des valeurs parmi toutes les lignes numeric_exp :

outStatistics=[{"statisticType": "sum","onStatisticField": "p_females","outStatisticFieldName": "sum_p_females"}]

VAR(numeric_exp)

Renvoie la variance des valeurs dans numeric_exp.

Recherchez la valeur de variance parmi toutes les lignes numeric_exp :

outStatistics=[{"statisticType": "var","onStatisticField": "pop1980","outStatisticFieldName": "var_pop1980"}]

Chaîne

CHAR_LENGTH(string_exp)

Renvoie la longueur en caractères de la chaîne en entrée.

Recherchez toutes les lignes dont la longueur de string_exp est supérieure à 10 :

CHAR_LENGTH(string_exp) > 10

CONCAT(string_exp1, string_exp2)

Renvoie une chaîne obtenue par la concaténation de deux valeurs de chaîne ou plus.

Sortie d’une version concaténée de string_exp1 et de string_exp2 avec un caractère de concaténation :

OutFields=CONCAT(id,CONCAT(I-,name))

LOWER(string_exp)

Renvoie une chaîne égale à string_exp en convertissant toutes les majuscules en minuscules. La valeur locale par défaut est celle de la base de données.

Recherchez toutes les lignes dans lesquelles la valeur est la chaîne de votre choix, quel que soit le cas :

LOWER(string_field) = "lowered_string"

POSITION(cahracter_exp1 IN character_exp2)

Renvoie la position entière dans le premier character_exp1 de character_exp2.

Recherchez toutes les lignes dont le premier caractère est « I » :

POSITION('I' IN state_name) = 1

SUBSTRING(string_exp FROM start FOR length)

SUBSTRING(string_exp, integer_exp_start, integer_exp_length)

Renvoie une chaîne de caractères dérivée de string_exp, commençant à la position de caractère spécifiée par start pour les caractères length.

Recherche toutes les lignes dont les deux premiers caractères des valeurs dans Stringfield sont Ch :

SUBSTRING(Stringfield FROM 1 FOR 2)='Ch'

TRIM(BOTH|LEADING|TRAILING trim_character FROM string_exp)

Renvoie l'argument string_exp avec trim_character supprimés du début, de la fin ou des deux extrémités de la chaîne.

Sortie string_field sans les préfixe et suffixe non souhaités :

OutFields=TRIM(BOTH '__' FROM string_exp)

UPPER(string_exp)

Renvoie une chaîne égale à string_exp en convertissant toutes les minuscules en majuscules. La valeur locale par défaut est celle de la base de données.

UPPER(name) = "TEXAS"

Autre

CAST(expression AS target_data_type)

Renvoie une expression convertie en target_data_type.

Recherchez toutes les lignes dans lesquelles l’expression convertie un en type de données spécifié est égale à la valeur souhaitée :

CAST(parcel_id AS INT)=38456

COALESCE(expression1,expression2,...)

Renvoie la première valeur non nulle à partir d’une liste d’expressions.

Recherchez toutes les lignes dans lesquelles la première valeur non nulle est la valeur spécifiée :

COALESCE(preferred_name, nickname, first_name) = 'MyName'

CURRENT_USER

Renvoie l’utilisateur actuellement connecté.

Remarque :

Ne renvoie pas l’utilisateur de base de données actuel.

Recherchez toutes les lignes dans lesquelles l’utilisateur actuellement connecté est le seul opérateur.

workerfield=CURRENT_USER

Recherchez toutes les lignes dans lesquelles l’utilisateur actuellement connecté figure en tant qu’opérateur, même en présence d’autres opérateurs.

position(CURRENT_USER in workerfield) > 0

NULLIF(expression1,expression2)

Compare deux expressions. Si elles sont égales, renvoie NULL. Si elles ne sont pas égales, renvoie expression1.

Donne le résultat des comparaisons NULLIF entre expression1 et expression2:

outFields=NULLIF(units_sold, unit_sell_goal)