Suite

Comment protéger le nom et l'emplacement du fichier json chargé en utilisant html5 et javascript ?


Les données des marqueurs (pas la carte) sont stockées dans un fichier json/csv/js. Nous voulons afficher toutes les données sous forme de marqueurs sur la carte. Mais comment protéger le fichier de données brutes de l'accès public ?

Suivant l'exemple sur le site Web de la brochure, le nom et l'emplacement du fichier de données sont actuellement visibles en texte brut dans le fichier index.html. N'importe qui peut les télécharger après avoir consulté le code source du html.

Existe-t-il un moyen de protéger nos données brutes de l'accès public ?

par exemple, en encodant le nom et l'emplacement du fichier et il n'y a aucun moyen de le décoder ?

Ou utiliser une méthode d'autorisation, la tokenisation, oAuth, l'API RestFul ?

Ou utiliser PHP au lieu de HTML ?

Tous les conseils et suggestions sont les bienvenus !


N'oubliez pas que JavaScript s'exécute sur la machine du client, sous son contrôle. Ils sont autorisés à définir des points d'arrêt et à inspecter les variables au moment de l'exécution sur leur propre machine. Vous pouvez réduire et masquer JavaScript, mais Chrome DevTools dispose d'un bouton de joli format en un clic pour annuler partiellement la réduction suffisamment pour que les points d'arrêt fonctionnent efficacement.

Pour faire court, si vous donnez les données brutes à la machine cliente, alors vous avez donné les données brutes, et vous l'avez fait en utilisant la propre infrastructure réseau du client.

Une alternative est que vous pouvez "fondre" les données dans des symboles rastérisés intégrés dans l'imagerie sur le serveur. Par exemple, j'ai récemment vu une démo CartoDB Cesium où les points d'intérêt ont été gravés dans les couches d'imagerie, de sorte que le client ne gère pas directement les données lat/lon brutes. Récupérer les points bruts nécessite beaucoup plus d'efforts, en passant au crible des tuiles d'images haute résolution et une sorte de reconnaissance d'image, cela pourrait donc être un moyen de garder les valeurs numériques exactes plus confidentielles.


Comment créer un système d'authentification sans état sécurisé pour une application JavaScript côté client

je construis un système d'authentification sans état pour une application Dart (Dart est compilé en JavaScript, donc l'ensemble de l'application est un fichier index.html qui charge JavaScript et s'exécute dans le navigateur) et j'ai découvert qu'il est assez difficile de créer une authentification sans état système réellement sécurisé.

La pile est la suivante : Application Dart qui effectue des POST JSON sur un backend Spring MVC (Java) en utilisant Jackson pour convertir entre les objets JSON et Java. Tout sera derrière SSL lorsqu'il entrera en production.

Scénario 1 : l'utilisateur se connecte, je garde une session côté Java - ce n'est pas sans état et causera des problèmes lors de l'équilibrage de charge du backend.

Scénario 2 : En appuyant sur le bouton de connexion, un POST est effectué par Dart sur le contrôleur d'authentification qui vérifie les informations d'identification et renvoie un jeton (qui peut être un ensemble d'UUID concaténés). Le token revient au frontend - Ce token combiné au nom d'utilisateur devra ensuite être transmis avec chaque requête. L'application Dart doit maintenant stocker ce jeton quelque part, puisqu'une application Dart compile en JavaScript, les cookies ne semblent pas être une option (JavaScript peut-il accéder aux cookies ?). Le stockage local HTML5 me vient à l'esprit, mais d'après ce que j'ai lu, il est assez facile de détourner ce jeton si une forme de vulnérabilité XSS est disponible (et je suppose que les plugins de navigateur et les barres d'outils qui injectent du JavaScript dans la page peuvent également accéder à ce jeton ?).

Scénario 3: Tout comme dans le scénario 2, je reçois un jeton du backend Spring MVC, mais au lieu de le stocker dans le stockage local HTML5, je conserve une variable JavaScript et la transmet si une nouvelle fenêtre est ouverte. Le même problème s'applique ici, puisqu'il se trouve à l'intérieur d'une variable javascript, tout type de vulnérabilité XSS ou de plug-in de navigateur peut capturer ce jeton et détourner la session.

Pour éviter les attaques par force brute, toute demande envoyée, si la combinaison nom d'utilisateur-jeton est incorrecte, le jeton de ce nom d'utilisateur sera invalidé et l'utilisateur devra se reconnecter. Les jetons expirent également après 15 minutes.

Est-ce un moyen sûr de maintenir l'état ? SI ce n'est pas le cas, comment puis-je sécuriser cette implémentation sans état avec jeton ou quelle serait une meilleure implémentation ?


4 réponses 4

Votre approche est tout à fait correcte. Vous devez modifier quelques éléments pour que cela fonctionne :
Pour chaque élément de la liste, créez un objet qui a toutes les propriétés qui doivent être dans le fichier json, placez-le dans la liste et à la fin convertissez cette liste en chaîne json.
Après cela, enregistrez la chaîne json dans le fichier (ou faites autre chose avec… peut-être enregistrez-la en tant que document dans la bibliothèque de documents ?).
Vous pouvez utiliser le code suivant pour créer les objets et la chaîne json :

L'autre problème que vous avez rencontré avec ConvertTo-Json est lié au fait que vous avez appelé Write-Host sur le résultat de la commande ConvertTo-Json. Si vous avez créé une variable, lui avez attribué la valeur de ConvertTo-Json, puis l'avez écrite sur l'hôte avec Write-Host, cela aurait bien fonctionné (je ne sais pas pourquoi c'est le cas - cela fonctionne bien si vous l'essayez directement dans la console et c'est totalement différent si vous l'avez dans le fichier de script).
La solution à ce problème est indiquée dans les deux dernières lignes de mon code ci-dessus.

Maintenant, si vous voulez créer json à partir de votre variable $ListItems, une erreur s'affichera, car la commande ConvertTo-Json essaiera de sérialiser toutes les propriétés des éléments de liste, et ces propriétés ne sont pas initialisées (vous devez explicitement initialiser les propriétés avant d'y accéder). L'erreur sera :

La solution consiste à créer les objets personnalisés, à attribuer les valeurs à ses propriétés et à les convertir en json (le code que j'ai collé ci-dessus).


6 réponses 6

Je pense que ta question se résume en fait à : Quand dois-je utiliser une approche NoSQL par rapport au SGBDR ? Vous avez opté tôt pour JSON (une décision NoSQL), peut-être parce que vous avez des consommateurs Ajax.

La réponse, bien sûr, au moment d'utiliser les approches NoSQL par rapport aux SGBDR dépend essentiellement du type de données avec lesquelles vous travaillez et des consommateurs que vous prévoyez d'avoir. Si vos données sont essentiellement relationnelles (hiérarchies assez plates, pas de types de données étranges comme les images ou l'audio, relations prévisibles entre les schémas qui peuvent être facilement décrites dans les clés), et vos consommateurs devraient éventuellement inclure des personnes qui souhaitent effectuer des requêtes de Business Intelligence (interrogation ad hoc), alors un SGBDR est la voie à suivre. Il est assez facile de transformer une requête en une représentation JSON, donc cela ne surcharge pas considérablement vos consommateurs Ajax - cela ajoute juste un peu de codage de transformation dans vos points de terminaison (REST/SOAP/whatever). inversement, si vos données sont très hiérarchiques (schémas profonds), contiennent des types de données étranges comme des images, de l'audio, de la vidéo, etc., il y a peu de relations entre les entités, et vous savez que vos utilisateurs finaux ne feront pas de BI, alors NoSQL/stockage JSON peut être approprié.

Bien sûr, même ces directives générales ne sont pas solides. La raison pour laquelle Google a développé le système de fichiers Google, MapReduce (travail qui a été utilisé par Doug Cutting pour construire Hadoop chez Yahoo) et plus tard BigQuery (un moyen [sans schéma] orienté NoSQL de gérer des données à grande échelle) était précisément car ils avaient beaucoup de demandes de BI ad hoc, et ils ne pouvaient pas faire évoluer les approches relationnelles jusqu'aux échelles tera/peta/exa/zetta/yotta qu'ils essayaient de gérer. La seule approche pratique consistait à évoluer, en sacrifiant une partie de la convivialité des requêtes ad hoc qu'un SGBDR fournit et en substituant un algorithme simple (MapReduce) qui pourrait être codé assez facilement pour n'importe quelle requête donnée.

Compte tenu de votre schéma ci-dessus, ma question serait essentiellement: Pourquoi ne serait pas tu utilises un SGBDR ? Je ne vois pas vraiment de raison de ne pas le faire. Notre profession est censée être axée sur l'ingénierie, pas sur la mode, donc notre instinct devrait être de choisir la solution la plus simple qui fonctionne, n'est-ce pas ? Je veux dire, vos points de terminaison peuvent avoir à faire une petite traduction si vos consommateurs sont Ajaxy, mais vos données semblent très plates et il semble probable que les utilisateurs professionnels voudront faire toutes sortes de requêtes ad hoc sur des choses comme des événements musicaux (ce qui l'événement a été le plus fréquenté à moins de 50 miles de notre capitale l'année dernière ?)

« N'allez pas chercher conseil auprès des elfes, car ils diront à la fois non et oui. -- Frodon


Comment fonctionnent les scripts intersites

Une attaque XSS typique comporte deux étapes :

  1. Pour exécuter du code JavaScript malveillant dans le navigateur d'une victime, un attaquant doit d'abord trouver un moyen d'injecter du code malveillant (charge utile) dans une page Web que la victime visite.
  2. Après cela, la victime doit visiter la page Web avec le code malveillant. Si l'attaque est dirigée contre des victimes particulières, l'attaquant peut utiliser l'ingénierie sociale et/ou le phishing pour envoyer une URL malveillante à la victime.

Pour que la première étape soit possible, le site Web vulnérable doit inclure directement l'entrée de l'utilisateur dans ses pages. Un attaquant peut alors insérer une chaîne illicite qui sera utilisée au sein de la page web et traitée comme du code source par le navigateur de la victime. Il existe également des variantes d'attaques XSS où l'attaquant incite l'utilisateur à visiter une URL en utilisant l'ingénierie sociale et la charge utile fait partie du lien sur lequel l'utilisateur clique.

Ce qui suit est un extrait de pseudo-code côté serveur utilisé pour afficher le commentaire le plus récent sur une page Web :

Le script ci-dessus prend simplement le dernier commentaire d'une base de données et l'inclut dans une page HTML. Il suppose que le commentaire imprimé se compose uniquement de texte et ne contient aucune balise HTML ou autre code. Il est vulnérable au XSS, car un attaquant pourrait soumettre un commentaire contenant une charge utile malveillante, par exemple :

Le serveur Web fournit le code HTML suivant aux utilisateurs qui visitent cette page Web :

Lorsque la page se charge dans le navigateur de la victime, le script malveillant de l'attaquant s'exécute. Le plus souvent, la victime ne s'en rend pas compte et est incapable d'empêcher une telle attaque.


Étape 5. ткройте Firebase в своем приложении

SDK Firebase JavaScript оддерживает следующие родукты Firebase. аждый продукт не является обязательным и доступен, как показано.

Base de feu ространство имен (v8 и ниже) нтернет Node.js
налитика firebase.analytics()
тентификация firebase.auth()
Cloud Firestore firebase.firestore()
ачные функции для клиентского SDK Firebase firebase.functions()
ен сообщениями в облаке firebase.message()
ачное ранилище firebase.storage()
ониторинг роизводительности ( ета- ерсия) firebase.performance()
аза данных в реальном времени firebase.database()
Configuration à distance ( ета- ерсия) firebase.remoteConfig()


Stockage local et comment l'utiliser sur des sites Web

Stocker des informations localement sur un ordinateur utilisateur est une stratégie puissante pour un développeur qui crée quelque chose pour le Web. Dans cet article, nous examinons à quel point il est facile de stocker des informations sur un ordinateur pour les lire plus tard et expliquons à quoi vous pouvez les utiliser.

Ajouter de l'état au Web : le « pourquoi » du stockage local

Le principal problème avec HTTP en tant que couche de transport principale du Web est qu'il est apatride. Cela signifie que lorsque vous utilisez une application et que vous la fermez, son état sera réinitialisé la prochaine fois que vous l'ouvrirez. Si vous fermez une application sur votre bureau et la rouvrez, son état le plus récent est restauré.

Rencontrer Optimisation des images, le tout nouveau guide pratique d'Addy Osmani pour optimiser et livrer images de haute qualité sur le Web. Des formats et compression à la livraison et à la maintenance : tout en un seul 528 pages livre.

C'est pourquoi, en tant que développeur, vous devez stocker l'état de votre interface quelque part. Normalement, cela se fait côté serveur et vous devez vérifier le nom d'utilisateur pour savoir vers quel état revenir. Mais que faire si vous ne voulez pas forcer les gens à s'inscrire ?

C'est ici que stockage local entre. Vous garderiez une clé sur l'ordinateur de l'utilisateur et la liriez lorsque l'utilisateur revient.

C est pour le cookie. Est-ce assez bon pour moi ?

La façon classique de le faire est d'utiliser un cookie. Un cookie est un fichier texte hébergé sur l'ordinateur de l'utilisateur et connecté au domaine sur lequel s'exécute votre site Web. Vous pouvez y stocker des informations, les lire et les supprimer. Les cookies ont cependant quelques limitations :

  • Ils ajoutent à la charge de chaque document consulté sur le domaine.
  • Ils permettent jusqu'à seulement 4 Ko de stockage de données.
  • Étant donné que les cookies ont été utilisés pour espionner le comportement de navigation des personnes, les personnes et les entreprises soucieuses de leur sécurité les désactivent ou demandent à chaque fois qu'on leur demande si un cookie doit être défini.

Pour contourner le problème du stockage local - les cookies étant une solution plutôt datée au problème - le WHATWG et le W3C ont proposé quelques spécifications de stockage local, qui faisaient à l'origine partie de HTML5 mais ont ensuite été mises de côté car HTML5 était déjà assez grand .

Utilisation du stockage local dans les navigateurs compatibles HTML5

L'utilisation du stockage local dans les navigateurs modernes est ridiculement facile. Tout ce que vous avez à faire est de modifier l'objet localStorage en JavaScript. Vous pouvez le faire directement ou (et c'est probablement plus propre) utiliser les méthodes setItem() et getItem() :

Si vous lisez la clé de saveur préférée, vous obtiendrez &ldquovanilla&rdquo :

Pour supprimer l'élément, vous pouvez utiliser — pouvez-vous deviner ? — la méthode removeItem() :

C'est tout ! Vous pouvez également utiliser sessionStorage au lieu de localStorage si vous souhaitez que les données ne soient conservées que jusqu'à la fermeture de la fenêtre du navigateur.

Contournement du problème &ldquoStrings uniquement&rdquo

Un inconvénient gênant du stockage local est que vous ne pouvez stocker que des chaînes dans les différentes clés. Cela signifie que lorsque vous avez un objet, il ne sera pas stocké correctement.

Vous pouvez le voir lorsque vous essayez le code suivant :

Essayer ceci dans la console montre que les données sont stockées en tant qu'[objet objet] et non les informations sur l'objet réel :

Vous pouvez contourner ce problème en utilisant les méthodes natives JSON.stringify() et JSON.parse() :

Où trouver des données de stockage local et comment les supprimer

Pendant le développement, vous pouvez parfois rester bloqué et vous demander ce qui se passe. Bien sûr, vous pouvez toujours accéder aux données en utilisant les bonnes méthodes, mais parfois vous voulez simplement vider la plaque. Dans Opera, vous pouvez le faire en allant sur Préférences → Avancé → Stockage, où vous verrez quels domaines ont des données locales et combien :

Faire cela dans Chrome est un peu plus problématique, c'est pourquoi nous avons fait un screencast :

Mozilla n'a pas d'accès au menu jusqu'à présent, mais le fera à l'avenir. Pour l'instant, vous pouvez accéder à la console Firebug et supprimer le stockage manuellement assez facilement.

Donc, c'est ainsi que vous utilisez le stockage local. Mais à quoi pouvez-vous l'utiliser ?

Cas d'utilisation n°1 : stockage local des données de service Web

L'une des premières utilisations du stockage local que j'ai découverte a été la mise en cache des données du Web lorsqu'il faut beaucoup de temps pour les obtenir. Mon entrée World Info pour le défi Event Apart 10K montre ce que je veux dire par là.

Lorsque vous appelez la démo pour la première fois, vous devez attendre jusqu'à 20 secondes pour charger les noms et les emplacements géographiques de tous les pays du monde à partir du service Web Yahoo BOSS Premium. Si vous appelez la démo une deuxième fois, il n'y a aucune attente car, vous l'aurez deviné, je l'ai mise en cache sur votre ordinateur à l'aide du stockage local.

Le code suivant (qui utilise jQuery) fournit la fonctionnalité principale pour cela. Si le stockage local est pris en charge et qu'il existe une clé appelée thewholefrigginworld , appelez la méthode render() , qui affiche les informations. Sinon, affichez un message de chargement et appelez l'API Geo à l'aide de getJSON() . Une fois les données chargées, stockez-les dans thewholefrigginworld et appelez render() avec les mêmes données :

Vous pouvez voir la différence de temps de chargement dans le screencast suivant :

Le code des infos mondiales est disponible sur GitHub.

Cela peut être extrêmement puissant. Si un service Web ne vous autorise qu'un certain nombre d'appels par heure mais que les données ne changent pas si souvent, vous pouvez stocker les informations dans un stockage local et ainsi empêcher les utilisateurs d'utiliser votre quota. Un badge photo, par exemple, pourrait extraire de nouvelles images toutes les six heures, plutôt que toutes les minutes.

Ceci est très courant lors de l'utilisation de services Web côté serveur. La mise en cache locale vous empêche d'être banni des services, et cela signifie également que lorsqu'un appel à l'API échoue pour une raison quelconque, vous aurez toujours des informations à afficher.

getJSON() dans jQuery est particulièrement flagrant pour accéder aux services et briser leur cache, comme expliqué dans cet article de blog de l'équipe YQL. Étant donné que la demande au service à l'aide de getJSON() crée une URL unique à chaque fois, le service ne fournit pas sa version en cache mais accède plutôt pleinement au système et aux bases de données chaque fois que vous lisez des données à partir de celui-ci. Ce n'est pas efficace, c'est pourquoi vous devez mettre en cache localement et utiliser ajax() à la place.

Cas d'utilisation n° 2 : Maintenir l'état d'une interface en toute simplicité

Un autre cas d'utilisation consiste à stocker l'état des interfaces. Cela peut être aussi grossier que de stocker l'intégralité du code HTML ou aussi intelligent que de conserver un objet avec l'état de tous vos widgets. L'interface de recherche Yahoo Firehose (source sur GitHub) est un exemple où j'utilise le stockage local pour mettre en cache le code HTML d'une interface :

Le code est très simple — en utilisant YUI3 et un test de stockage local autour de l'appel de stockage local :

Remarquer: Nous avons restauré votre dernière recherche pour vous - pas de données en direct&rsquo) > > >)

Vous n'avez pas du tout besoin de YUI, cela ne fait que faciliter les choses. La logique pour mettre en cache génériquement les interfaces dans le stockage local est toujours la même : vérifiez si un bouton &ldquoSubmit&rdquo a été activé (en PHP, Python, Ruby ou autre) et, si c'est le cas, stockez l'innerHTML de l'ensemble du formulaire sinon, il suffit de lire depuis local stockage et remplacer le innerHTML du formulaire.

Le côté obscur du stockage local

Bien sûr, toute technologie puissante comporte le danger que des personnes en abusent à des fins plus sombres. Samy, l'homme derrière le ver MySpace & ldquoSamy is my hero, a récemment publié une démo assez effrayante appelée Evercookie, qui montre comment exploiter toutes sortes de techniques, y compris le stockage local, pour stocker les informations d'un utilisateur sur son ordinateur même lorsque les cookies sont activés. désactivé. Ce code pourrait être utilisé de toutes sortes de manières, et à ce jour, il n'y a aucun moyen de le contourner.

Lectures complémentaires sur SmashingMag :

Des recherches comme celle-ci montrent que nous devons très bientôt examiner les fonctionnalités et les modules complémentaires HTML5 du point de vue de la sécurité pour nous assurer que les utilisateurs peuvent enregistrer les actions et les informations des utilisateurs à leur insu. Un opt-in pour le stockage local, tout comme vous devez choisir de partager votre emplacement géographique, peut être de mise, mais d'un point de vue UX, cela est considéré comme maladroit et intrusif. Vous avez de bonnes idées ?


HTML5 et extensions multimédias

L'utilisation de la vidéo HTML5 seule a de nombreuses limitations, cependant, l'ajout des spécifications Media Source Extensions (MSE) et Encrypted Media Extensions (EME) ajoute les avantages du streaming à débit adaptatif et de la lecture de contenu protégé, respectivement.

La prise en charge de MSE permet à JavaScript de générer des flux pour la lecture multimédia à l'aide de balises multimédias HTML afin que vous puissiez lire des flux en direct ou à la demande avec HTML5. Cela signifie que la technologie de lecteur indépendante du navigateur peut être construite sans l'utilisation de technologies de plug-in, permettant des fonctionnalités de lecture telles que la diffusion en continu à débit adaptatif, le décalage temporel, l'insertion d'annonces, le montage vidéo et plusieurs pistes audio. Les vidéos sont encodées une fois, puis lues de manière cohérente sur les navigateurs modernes et sur la plupart des tablettes et smartphones.


Journalisation supplémentaire

Vous pouvez activer le securityDebugLogRejets et securityDebugLogDetails propriétés de l'application pour consigner des informations supplémentaires, ce qui peut aider à identifier les problèmes de configuration. Pour ajouter ces propriétés dans Wowza Streaming Engine Manager, vous devez les définir comme propriétés personnalisées dans l'application. Voir Ajouter une propriété personnalisée pour plus de détails.

Voici les valeurs qui doivent être utilisées dans le Ajouter une propriété personnalisée boîte de dialogue pour chaque propriété de journalisation personnalisée :


Comment protéger le nom et l'emplacement du fichier json chargé en utilisant html5 et javascript ? - Systèmes d'information géographique

Spécification générale des flux de vélos en libre-service (GBFS)

Ce document explique les types de fichiers et de données qui composent la spécification générale de Bikeshare Feed (GBFS) et définit les champs utilisés dans tous ces fichiers.

Cette documentation fait référence à v3.0-RC (version candidate).
Pour la version actuelle, voir version 2.2. Pour les versions passées et à venir, voir le README.

Les mots clés « DOIT », « OPTION " dans ce document doivent être interprétés comme décrit dans les RFC2119, BCP 14 et RFC8174 lorsque, et seulement lorsque, ils apparaissent en majuscules, comme indiqué ici.

Cette spécification a été conçue en tenant compte des concepts suivants :

  • Fournir l'état du système à ce moment
  • Ne fournissez pas d'informations dont l'objectif principal est historique

La spécification prend en charge les conseils de voyage en temps réel dans les applications gourmandes en GBFS.

La version de la spécification GBFS à laquelle un flux est conforme est déclarée dans le champ version de tous les fichiers. Voir Format de sortie.

Les meilleures pratiques GBFS définissent que :

Producteurs GBFS DEVRAIT fournir des points de terminaison conformes à la fois à la branche de prise en charge à long terme (LTS) de la spécification actuelle ainsi qu'à la dernière branche de version dans les 3 mois au moins suivant une nouvelle spécification MAJEUR ou alors MINEUR sortie de version. Il n'est pas nécessaire de supporter plus d'un MINEUR sortie du même MAJEUR groupe de libération parce que MINEUR les versions sont rétrocompatibles. Voir la spécification des versions

Consommateurs GBFS DEVRAIT, au minimum, prendre en charge la branche LTS actuelle. Il est fortement RECOMMANDÉ que les consommateurs GBFS prennent en charge les versions ultérieures.

URL de flux GBFS par défaut, par ex. https://www.example.com/data/gbfs.json ou https://www.example.com/data/fr/system_information.json DOIT diriger les consommateurs vers le flux conforme à la branche de documentation LTS actuelle.

Cette section définit les termes qui sont utilisés tout au long de ce document.

  • JSON - (JavaScript Object Notation) est un format léger pour le stockage et le transport de données. Ce document utilise de nombreux termes définis par la norme JSON, notamment champ, tableau et objet. (https://www.w3schools.com/js/js_json_datatypes.asp)
  • Champ - En JSON, une paire nom/valeur se compose d'un nom de champ (entre guillemets), suivi de deux-points, suivi d'une valeur. (https://www.w3schools.com/js/js_json_syntax.asp)
  • GeoJSON - GeoJSON est un format pour coder une variété de structures de données géographiques. (https://geojson.org/)
  • OBLIGATOIRE - Le champ DOIT être inclus dans l'ensemble de données, et une valeur DOIT être fournie dans ce champ pour chaque enregistrement.
  • FACULTATIF - Le champ PEUT être omis de l'ensemble de données. Si une colonne FACULTATIVE est incluse, certaines des entrées dans ce champ PEUVENT être des chaînes vides. Un champ omis équivaut à un champ vide.
  • Conditionnellement REQUIS - Le champ ou le fichier est REQUIS sous certaines conditions, qui sont décrites dans la description du champ ou du fichier. En dehors de ces conditions, ce champ ou fichier est FACULTATIF.
Nom de fichier OBLIGATOIRE Définit
gbfs.json Oui
(à partir de la v2.0)
Fichier de découverte automatique qui renvoie à tous les autres fichiers publiés par le système.
gbfs_versions.json
(ajouté dans la v1.1)
OPTIONNEL Répertorie tous les points de terminaison de flux publiés selon les versions de la documentation GBFS.
system_information.json Oui Détails, y compris l'opérateur du système, l'emplacement du système, l'année de mise en œuvre, l'URL, les coordonnées, le fuseau horaire.
véhicules_types.json
(ajouté en v2.1)
Conditionnellement REQUIS Décrit les types de véhicules que l'opérateur du système propose à la location. OBLIGATOIRE des systèmes qui incluent des informations sur les types de véhicules dans le fichier free_bike_status. Si ce fichier n'est pas inclus, tous les véhicules du flux sont supposés être des vélos non motorisés.
information_station.json Conditionnellement REQUIS Liste de toutes les stations, leurs capacités et leurs emplacements. REQUIS pour les systèmes utilisant des quais.
station_status.json Conditionnellement REQUIS Nombre de véhicules et de quais disponibles à chaque station et disponibilité des stations. REQUIS pour les systèmes utilisant des quais.
free_bike_status.json Conditionnellement REQUIS (à partir de la v2.1) Décrit tous les véhicules qui ne sont pas actuellement en location active. REQUIS pour les véhicules flottants (sans dock). OPTIONNEL pour les véhicules en station (amarrés). Les véhicules faisant partie d'une location active NE DOIVENT PAS apparaître dans ce flux.
heures_système.json OPTIONNEL Heures de fonctionnement du système.
system_calendar.json OPTIONNEL Dates de fonctionnement du système.
system_regions.json OPTIONNEL Régions dans lesquelles le système est divisé.
system_pricing_plans.json OPTIONNEL Système de tarification du système.
system_alerts.json OPTIONNEL Alertes système actuelles.
geofencing_zones.json
(ajouté en v2.1)
OPTIONNEL Les zones de géorepérage et leurs règles et attributs associés.

Les ensembles de données DEVRAIENT être publiés sur une URL publique, permanente et facilement accessible. (par exemple, https://www.example.com/gbfs/v3/gbfs.json). L'URL DEVRAIT être directement disponible sans nécessiter de connexion pour accéder au fichier afin de faciliter le téléchargement en consommant des applications logicielles.

Pour être conforme à GBFS, tous les systèmes DOIVENT avoir une entrée dans le fichier systems.csv.

Des outils automatisés pour la surveillance des performances des applications DEVRAIENT être utilisés pour garantir la disponibilité des flux. Les producteurs DEVRAIENT fournir un contact technique pouvant répondre aux pannes de flux dans le champ feed_contact_email du fichier system_information.json.

Arrêts saisonniers, interruptions de service

Les flux DEVRAIENT continuer à être publiés pendant les fermetures saisonnières ou temporaires. Les URL de flux NE DEVRAIENT PAS renvoyer un 404. Un tableau de vélos vide DEVRAIT être renvoyé par free_bike_status.json . Les stations dans station_status.json DEVRAIENT être définies sur is_renting:false , is_returning:false et is_installed:false le cas échéant. Les dates d'arrêt saisonnier DEVRAIENT être reflétées dans system_calendar.json .

Les annonces d'interruptions de service, y compris les stations désactivées ou les fermetures temporaires de stations ou de systèmes DEVRAIENT être faites dans system_alerts.json .

  • Tous les fichiers DEVRAIENT être JSON valides
  • Tous les fichiers de la spécification PEUVENT être publiés dans un chemin d'URL ou avec un autre nom (par exemple, station_info au lieu de station_information.json ) (à partir de la v2.0).
  • Toutes les données DEVRAIENT être encodées en UTF-8
  • Les sauts de ligne DEVRAIENT être représentés uniquement par des caractères de nouvelle ligne unix ( )
  • La pagination n'est pas prise en charge.
  • Les fichiers sont distribués en tant que points de terminaison HTTP individuels.
    • Les fichiers OBLIGATOIRES NE DOIVENT PAS 404. Ils DOIVENT retourner un fichier JSON correctement formaté tel que défini dans le format de sortie.
    • Fichiers FACULTATIFS MAI 404. Un 404 d'un fichier FACULTATIF NE DEVRAIT PAS être considéré comme une erreur.

    Les éditeurs DEVRAIENT implémenter la découverte automatique des flux GBFS en établissant un lien vers l'emplacement du point de terminaison de découverte automatique gbfs.json.

    • L'emplacement du fichier de découverte automatique DEVRAIT être fourni dans la zone HTML de la page d'accueil de mobilité partagée hébergée à l'URL spécifiée dans le champ URL du fichier system_infomation.json.
    • Ceci est référencé via un relier balise au format suivant :
      • <link rel="gbfs" type="application/json" href="https://www.example.com/data/gbfs.json" />
      • Les références:
      • Chaque ensemble de fichiers de données DEVRAIT être distribué dans un seul langage tel que défini dans system_information.json.
      • Un système qui souhaite publier des flux dans plusieurs langues DEVRAIT le faire en publiant plusieurs distributions, telles que :
        • https://www.example.com/data/en/system_information.json
        • https://www.example.com/data/fr/system_information.json

        Le texte riche NE DOIT PAS être stocké dans des champs de texte de forme libre. Les champs NE DEVRAIENT PAS contenir du HTML.

        Toutes les chaînes de texte destinées aux clients (y compris les noms de stations) DEVRAIENT utiliser la casse mixte (pas TOUTES LES MAJUSCULES), conformément aux conventions locales pour la mise en majuscule des noms de lieux sur les écrans capables d'afficher des caractères minuscules.

        Les abréviations NE DEVRAIENT PAS être utilisées pour les noms et autres textes (par exemple, St. pour Street) à moins qu'un emplacement ne soit appelé par son nom abrégé (par exemple, « aéroport JFK »). Les abréviations peuvent être problématiques pour l'accessibilité par le logiciel de lecture d'écran et les interfaces utilisateur vocales. Les logiciels de consommation peuvent être conçus pour convertir de manière fiable des mots complets en abréviations pour l'affichage, mais la conversion d'abréviations en mots complets est sujette à un plus grand risque d'erreur.

        Les noms utilisés pour les stations, les stations virtuelles et les zones géographiquement clôturées DEVRAIENT être lisibles par l'homme. Les conventions de nommage utilisées pour les emplacements DEVRAIENT prendre en compte une variété de cas d'utilisation comprenant à la fois du texte et des cartes.

        Les descriptions NE DEVRAIENT PAS inclure des informations si spécifiques qu'elles pourraient être utilisées pour le suivi de véhicules ou de trajets.

        Les flux DEVRAIENT fournir 6 chiffres (0,000001) de précision pour les coordonnées lat/long en degrés décimaux.

        Décimales Degrés Distance à l'équateur
        0 1.0 111 km
        1 0.1 11,1 km
        2 0.01 1,11 km
        3 0.001 111 mètres
        4 0.0001 11,1 m
        5 0.00001 1,11 m
        6 0.000001 0,11 m
        7 0.0000001 1,11 cm

        Les données renvoyées par les points de terminaison en temps quasi réel station_status.json et free_bike_status.json DEVRAIENT être aussi proches que possible du temps réel, mais en aucun cas elles ne devraient être obsolètes de plus de 5 minutes. Des valeurs appropriées DEVRAIENT être définies à l'aide de la propriété ttl pour chaque point de terminaison en fonction de la fréquence à laquelle les données des flux sont actualisées ou mises à jour. Pour les points de terminaison en temps quasi réel où les données doivent toujours être actualisées, la valeur ttl DEVRAIT être 0 . L'horodatage last_updated représente la connaissance par l'éditeur de l'état actuel du système à ce moment précis. L'horodatage last_reported représente la dernière fois qu'une station ou un véhicule a signalé son état au backend de l'opérateur.

        Il est RECOMMANDÉ que tous les ensembles de données GBFS soient proposés sous une licence de données ouverte. Les licences de données ouvertes permettent aux consommateurs d'utiliser, de modifier et de partager librement les données GBFS à n'importe quelle fin et à perpétuité. La licence des données GBFS offre une certitude aux consommateurs GBFS, leur permettant d'intégrer les données GBFS dans leur travail. Tous les ensembles de données GBFS DEVRAIENT spécifier une licence en utilisant le champ license_id avec un identifiant SPDX ou en utilisant le champ license_url avec une URL pointant vers une licence personnalisée dans system_information.json . Voir le référentiel GBFS pour une comparaison d'un sous-ensemble de licences standard.

        • Tableau - Un élément JSON constitué d'une séquence ordonnée de zéro ou plusieurs valeurs.
        • Boolean - Une des deux valeurs possibles, true ou false . Les valeurs booléennes DOIVENT être des booléens JSON, pas des chaînes (c'est-à-dire true ou false , pas "true" ou "false" ). (à partir de la v2.0)
        • Date - Jour de service au format AAAA-MM-JJ. Exemple : 2019-09-13 pour le 13 septembre 2019.
        • E-mail - Une adresse e-mail. Exemple : [email protected]
        • Enum (Valeurs énumérables) - Une option d'un ensemble de constantes prédéfinies dans la colonne "Définit". Les valeurs d'énumération DEVRAIENT être en minuscules. Exemple : Le champ rental_methods contient les valeurs creditcard , paypass , etc.
        • Flotter (ajouté en v2.1) - Un nombre à virgule flottante de 32 bits.
        • GeoJSON FeatureCollection - Une FeatureCollection telle que décrite par l'IETF RFC 7946 https://tools.ietf.org/html/rfc7946#section-3.3.
        • GeoJSON Multipolygon - Un objet de géométrie tel que décrit par l'IETF RFC https://tools.ietf.org/html/rfc7946#section-3.1.7.
        • ID - Doit être représenté sous la forme d'une chaîne qui identifie cette entité particulière. Une pièce d'identité :
          • DOIT être unique dans les champs similaires (par exemple, station_id DOIT être unique parmi les stations)
          • ne doit pas être unique au monde, sauf indication contraire
          • NE DOIT PAS contenir d'espaces
          • DOIT être persistant pour une entité donnée (station, plan, etc.). Une exception est le vélo flottant bike_id , qui NE DOIT PAS être persistant pour des raisons de confidentialité (voir free_bike_status.json ). (à partir de la v2.0)

          Extensions Outside of the Specification

          To accommodate the needs of feed producers and consumers prior to the adoption of a change, additional fields can be added to feeds even if these fields are not part of the official specification. Custom extensions that may provide value to the GBFS community and align with the GBFS Guiding Principles SHOULD be proposed for inclusion in the specification through the change process.

          Field names of extensions SHOULD be prefixed with an underscore ( _) character. It is strongly RECOMMENDED that these additional fields be documented on the wiki page of the GBFS repository in this format:

          Submitted by Field Name File Name Defines
          Publisher's name _field_name Name of GBFS endpoint where field is used Description of purpose of use

          Every JSON file presented in this specification contains the same common header information at the top level of the JSON response object:

          Field Name REQUIRED Taper Defines
          last_updated Oui Timestamp Indicates the last time data in the feed was updated. This timestamp represents the publisher's knowledge of the current state of the system at this point in time.
          ttl Oui Non-negative integer Number of seconds before the data in the feed will be updated again (0 if the data should always be refreshed).
          version
          (added in v1.1)
          Oui String GBFS version number to which the feed confirms, according to the versioning framework.
          Les données Oui Object Response data in the form of name:value pairs.

          The gbfs.json discovery file SHOULD represent a single system or geographic area in which vehicles are operated. The location (URL) of the gbfs.json file SHOULD be made available to the public using the specification’s auto-discovery function.

          Field Name REQUIRED Taper Defines
          Langue Oui Langue The language that will be used throughout the rest of the files. It MUST match the value in the system_information.json file.
          - feeds Oui Array An array of all of the feeds that are published by this auto-discovery file. Each element in the array is an object with the keys below.
          - name Oui String Key identifying the type of feed this is. The key MUST be the base file name defined in the spec for the corresponding feed type ( system_information for system_information.json file, station_information for station_information.json file).
          - url Oui URL URL for the feed. Note that the actual feed endpoints (urls) MAY NOT be defined in the file_name.json format. For example, a valid feed endpoint could end with station_info instead of station_information.json .

          gbfs_versions.json (added in v1.1)

          Each expression of a GBFS feed describes all of the versions that are available.

          The following fields are all attributes within the main "data" object for this feed.

          Field Name REQUIRED Taper Defines
          versions Oui Array Contains one object, as defined below, for each of the available versions of a feed. The array MUST be sorted by increasing MAJOR and MINOR version number.
          - version Oui String The semantic version of the feed in the form X.Y .
          - url Oui URL URL of the corresponding gbfs.json endpoint.

          The following fields are all attributes within the main "data" object for this feed.

          If a rental_uris . android field is populated then this field is REQUIRED, otherwise it is OPTIONAL.

          See the Analytics section for how viewing apps can report the origin of the deep link to rental apps.

          This field is REQUIRED if a rental_uris . android field is populated, otherwise it is OPTIONAL.

          If a rental_uris . ios field is populated then this field is REQUIRED, otherwise it is OPTIONAL.

          See the Analytics section for how viewing apps can report the origin of the deep link to rental apps.

          This field is REQUIRED if a rental_uris . ios field is populated, otherwise it is OPTIONAL.

          vehicle_types.json (added in v2.1)

          REQUIRED of systems that include information about vehicle types in the free_bike_status file. If this file is not included, then all vehicles in the feed are assumed to be non-motorized bicycles. This file SHOULD be published by systems offering multiple vehicle types for rental, for example pedal bikes and ebikes.
          The following fields are all attributes within the main "data" object for this feed.

          • human (Pedal or foot propulsion)
          • electric_assist (Provides power only alongside human propulsion)
          • electric (Contains throttle mode with a battery-powered motor)
          • combustion (Contains throttle mode with a gas engine-powered motor)

          All stations included in station_information.json are considered public (e.g., can be shown on a map for public use). If there are private stations (such as Capital Bikeshare’s White House station), these SHOULD NOT be included here. Any station that is represented in station_information.json MUST have a corresponding entry in station_status.json .

          • Broadway and East 22nd Street
          • Convention Center
          • Central Park South
          • key (e.g. operator issued vehicle key / fob / card)
          • creditcard
          • paypass
          • applepay
          • androidpay
          • transitcard
          • accountnumber
          • téléphoner

          true - The station is a location without physical infrastructure, defined by a point (lat/lon) and/or station_area (below).
          false - The station consists of physical infrastructure (docks).

          If this field is empty, it means the station consists of physical infrastructure (docks).

          If this is a virtual station defined using the is_virtual_station field, this number represents the total number of vehicles of all types that can be parked at the virtual station.

          true - Valet services are provided at this station.
          false - Valet services are not provided at this station.

          If this field is empty, it is assumed that valet services are not provided at this station.

          This URI SHOULD be a deep link specific to this station, and SHOULD NOT be a general rental page that includes information for more than one station. The deep link SHOULD take users directly to this station, without any prompts, interstitial pages, or logins. Make sure that users can see this station even if they never previously opened the application.

          If this field is empty, it means deep linking isn’t supported in the native Android rental app.

          Note that URIs do not necessarily include the station_id for this station - other identifiers can be used by the rental app within the URI to uniquely identify this station.

          See the Analytics section for how viewing apps can report the origin of the deep link to rental apps.

          Android App Links example value: https://www.example.com/app?sid=1234567890&platform=android

          This URI SHOULD be a deep link specific to this station, and SHOULD NOT be a general rental page that includes information for more than one station. The deep link SHOULD take users directly to this station, without any prompts, interstitial pages, or logins. Make sure that users can see this station even if they never previously opened the application.

          If this field is empty, it means deep linking isn’t supported in the native iOS rental app.

          Note that the URI does not necessarily include the station_id - other identifiers can be used by the rental app within the URL to uniquely identify this station.

          See the Analytics section for how viewing apps can report the origin of the deep link to rental apps.

          iOS Universal Links example value: https://www.example.com/app?sid=1234567890&platform=ios

          This URL SHOULD be a deep link specific to this station, and SHOULD NOT be a general rental page that includes information for more than one station. The deep link SHOULD take users directly to this station, without any prompts, interstitial pages, or logins. Make sure that users can see this station even if they never previously opened the application.

          If this field is empty, it means deep linking isn’t supported for web browsers.

          Example 1: Physical station

          Example 2: Virtual station

          Describes the capacity and rental availability of a station. Data returned SHOULD be as close to realtime as possible, but in no case should it be more than 5 minutes out-of-date. See Data Latency. Data reflects the operator's most recent knowledge of the station’s status. Any station that is represented in station_status.json MUST have a corresponding entry in station_information.json .

          true - Station is installed on the street.
          false - Station is not installed on the street.

          true - Station is renting vehicles. Even if the station is empty, if it would otherwise allow rentals, this value MUST be true .
          false - Station is not renting vehicles.

          If the station is temporarily taken out of service and not allowing rentals, this field MUST be set to false .

          true - Station is accepting vehicle returns. Even if the station is full, if it would otherwise allow vehicle returns, this value MUST be true .
          false - Station is not accepting vehicle returns.

          If the station is temporarily taken out of service and not allowing vehicle returns, this field MUST be set to false .

          (as of v2.1) Describes all vehicles that are not currently in active rental. REQUIRED for free floating (dockless) vehicles. OPTIONAL for station based (docked) vehicles. Data returned SHOULD be as close to realtime as possible, but in no case should it be more than 5 minutes out-of-date. See Data Latency. Vehicles that are part of an active rental MUST NOT appear in this feed. Vehicles listed as available for rental MUST be in the field and accessible to users. Vehicles that are not accessible (e.g. in a warehouse or in transit) MUST NOT appear as available for rental.

          true - Vehicle is currently disabled.
          false - Vehicle is not currently disabled.

          This URI SHOULD be a deep link specific to this vehicle, and SHOULD NOT be a general rental page that includes information for more than one vehicle. The deep link SHOULD take users directly to this vehicle, without any prompts, interstitial pages, or logins. Make sure that users can see this vehicle even if they never previously opened the application. Note that as a best practice providers SHOULD rotate identifiers within deep links after each rental to avoid unintentionally exposing private vehicle trip origins and destinations.

          If this field is empty, it means deep linking is not supported in the native Android rental app.

          Note that URIs do not necessarily include the bike_id for this vehicle - other identifiers can be used by the rental app within the URI to uniquely identify this vehicle.

          See the Analytics section for how viewing apps can report the origin of the deep link to rental apps.

          Android App Links example value: https://www.example.com/app?sid=1234567890&platform=android

          This URI SHOULD be a deep link specific to this vehicle, and SHOULD NOT be a general rental page that includes information for more than one vehicle. The deep link SHOULD take users directly to this vehicle, without any prompts, interstitial pages, or logins. Make sure that users can see this vehicle even if they never previously opened the application. Note that as a best practice providers SHOULD rotate identifiers within deep links after each rental to avoid unintentionally exposing private vehicle trip origins and destinations.

          If this field is empty, it means deep linking is not supported in the native iOS rental app.

          Note that the URI does not necessarily include the bike_id - other identifiers can be used by the rental app within the URL to uniquely identify this vehicle.

          See the Analytics section for how viewing apps can report the origin of the deep link to rental apps.

          iOS Universal Links example value: https://www.example.com/app?sid=1234567890&platform=ios

          This URL SHOULD be a deep link specific to this vehicle, and SHOULD NOT be a general rental page that includes information for more than one vehicle. The deep link SHOULD take users directly to this vehicle, without any prompts, interstitial pages, or logins. Make sure that users can see this vehicle even if they never previously opened the application. Note that as a best practice providers SHOULD rotate identifiers within deep links after each rental to avoid unintentionally exposing private vehicle trip origins and destinations.

          If this field is empty, it means deep linking isn’t supported for web browsers.

          This OPTIONAL file is used to describe hours and days of operation when vehicles are available for rental. If system_hours.json is not published, it indicates that vehicles are available for rental 24 hours a day, 7 days a week.

          Field Name REQUIRED Taper Defines
          rental_hours Oui Array Array of objects as defined below. The array MUST contain a minimum of one object identifying hours for every day of the week or a maximum of two for each day of the week objects ( one for each user type).
          - user_types Oui Array An array of member and/or nonmember value(s). This indicates that this set of rental hours applies to either members or non-members only.
          - days Oui Array An array of abbreviations (first 3 letters) of English names of the days of the week for which this object applies (e.g. ["mon", "tue", "wed", "thu", "fri", "sat, "sun"] ). Rental hours MUST NOT be defined more than once for each day and user type.
          - start_time Oui Temps Start time for the hours of operation of the system in the time zone indicated in system_information.json.
          - end_time Oui Temps End time for the hours of operation of the system in the time zone indicated in system_information.json.

          Describes the operating calendar for a system. This OPTIONAL file SHOULD be published by systems that operate seasonally or do not offer continuous year-round service.

          Field Name REQUIRED Taper Defines
          calendars Oui Array Array of objects describing the system operational calendar. A minimum of one calendar object is REQUIRED. If start and end dates are the same every year, then start_year and end_year SHOULD be omitted.
          - start_month Oui Non-negative Integer Starting month for the system operations ( 1 - 12 ).
          - start_day Oui Non-negative Integer Starting date for the system operations ( 1 - 31 ).
          - start_year OPTIONAL Non-negative Integer Starting year for the system operations.
          - end_month Oui Non-negative Integer Ending month for the system operations ( 1 - 12 ).
          - end_day Oui Non-negative Integer Ending date for the system operations ( 1 - 31 ).
          - end_year OPTIONAL Non-negative Integer Ending year for the system operations.

          Describe regions for a system that is broken up by geographic or political region.