27 votes

Comment ASP.NET ou ASP.NET MVC peut-il être protégé contre les attaques de cookies de domaine connexes?

Le domaine de cookie attaque (plus d'info) permet aux machines dans le même domaine DNS pour ajouter des cookies qui lui sera également envoyé à d'autres ordinateurs dans le même domaine.

Cela peut poser des problèmes d'authentification, ou, au pire, être un composant dans un état confus adjoint de l'attaque.

Question

Comment puis-je protéger ASP.NET ou ASP.NET MVC, à partir de ce type d'attaque?

Un possible scénario d'attaque

  1. Je me connecte à un "secure" web app
  2. Je reçois les informations d'identification pour mon compte
  3. J'inciter l'utilisateur à visiter mon site sur le même domaine DNS
  4. J'ai insérer le cookie (de mon creds)
  5. l'utilisateur remonte à votre application.
  6. Les cookies (ou écrasé) est envoyé au serveur
  7. L'utilisateur est en train de faire des choses sous mon compte

C'est un exemple simplifié, mais l'idée peut être porté à un autre style d'attaques, Im juste choisir le scénario qui ne semble pas "trop mal".

Une idée de comment ça "mal" si c'était l'étape 1 de une à deux étapes de l'attaque. Supposons que l'utilisateur a téléchargé un mauvais fichier qui était accessible uniquement dans son compte; de l'autre utilisateur alors involontairement les téléchargements de fichiers, l'exécution de tout code exécutable qui est là.

Il y a une tonne d'autres scénarios sont possibles... plutôt que de les énumérer tous ici, je suis à essayer de comprendre comment je peux protéger mon serveur de ce type d'attaque.

7voto

makerofthings7 Points 10028

Canal Lié Cookies

Le projet de la RFC vient d'un employé de Google et décrit un moyen pour les Clients d'utiliser un auto-signé Certificat de Navigateur (donc ne nécessitant aucune source de confusion "pop-up" pour l'utilisateur final) qui peut aussi aborder le cookie problème de sécurité connu comme "Lié au Domaine des Cookies"

Ce qui suit est un extrait de l' http://www.browserauth.net/ , une section de la RFC, certains commentaire intéressant, et quelques critiques sur cette extension.

Vue d'ensemble de la chaîne Liée Cookies

Une fois que le sous-jacent canal TLS utilise le protocole TLS authentification du client (avec le TLS-OBC extension), le serveur peut se lier à son des cookies pour le canal TLS en les associant avec le client de la clé publique, et de veiller à ce que les cookies ne sont jamais utilisés sur TLS canaux authentifié avec ce public (client) de la clé.

Cela signifie que si un tel canal, lié cookie est jamais volé hors de la machine d'un client, le cookie ne sera pas en mesure de s'authentifier une session HTTP au serveur à partir d'autres machines. Cela comprend l'homme-dans-le-milieu des attaquants qui injectent eux-mêmes dans la connexion entre le client et le serveur, peut-être en incitant les utilisateurs en cliquant à travers certificat de non-concordance de mises en garde: ce type man-in-the-middle devrez générer sa propre session TLS avec le serveur, qui n'est pas le match le canal que le cookie est lié à elle.

La Liaison De Canal

C'est le serveur de décider de lier des cookies pour TLS canaux. Si le client ne prend pas en charge TLS-OBC, ou si le cookie sur la pour seront utilisés dans les différentes origines, alors le serveur ne va pas canal-lier le cookie. Si elle décide de canal-lier le cookie, il doit associer le cookie avec le client de la clé publique. Ceci est similaire à la RFC 5929, mais à la place du client liaison de données à la clé publique du serveur, dans ce cas, le serveur serait de liaison de données (le biscuit) pour le client de la clé publique. Le serveur peut ce faire soit par simplement les stocker dans une base de données principale, le fait qu'un certain session HTTP est prévu pour être authentifié avec un client clé publique, ou il peut utiliser la cryptographie pour coder dans le cookie lui-même qui client TLS clé publique cookie est lié.

Illustration of a secure session between a server and browser

Dans la figure ci-dessus, le serveur inclut le client de la clé publique d'un point de vue cryptographique signé discbased, qui comprend également la authentifié id de l'utilisateur. Lorsque le serveur reçoit le cookie de retour de la part du client, il peut vérifier qu'en effet, il en a émis le cookie (par la vérification de la signature sur le cookie), et vérifier que le cookie a été envoyé sur le bon canal (par correspondance, le client TLS clé avec la clé mentionnée dans le cookie).

Pour être poursuivi ici.... http://www.browserauth.net/channel-bound-cookies


RFC Snip

TLS Origine Lié aux Certificats RFC Projet

(Extrait)

4.3. Cookie Durcissement

Une façon TLS-OBC peuvent être utilisés pour renforcer des cookies l'authentification se fait par "liaison" cookies pour une origine liée à le certificat. Le serveur, lors de la délivrance d'un cookie pour un HTTP session, associer le client à l'origine lié avec certificat la session (soit par le codage des informations sur le certificat sans possible de falsification dans le cookie, ou en l'associant avec le certificat le cookie de session par d'autres moyens). De cette façon, si et quand un cookie est volé à partir d'un client, il ne peut pas être utilisé sur une Connexion TLS initiée par un autre client, le cookie voleur aurait aussi pour voler la clé privée associée à la du client origine liée à un certificat, une tâche beaucoup plus difficile surtout lorsque l'on suppose l'existence d'une Plateforme de Confiance Module ou d'un autre Élément de sécurité qui permet de stocker l'
origine-lié-certificat de la clé privée.


Commentaire supplémentaire à partir de public-web-security@w3.org

Notez également que peu de contre-intuitivement, canal lié aux cookies protéger contre de nombreuses-domaine d'attaques, même si le client cert où ils sont liés à a portée plus large que un site web d'origine.

Imaginez, un instant, qu'un utilisateur agent crée un certificat auto-signé, qu'il utilise comme un client TLS cert pour toutes les connexions à tous les serveurs (pas une bonne idée en termes de vie privée, mais suivez-moi pour cette expérience de pensée). Les serveurs puis placer des cookies sur leurs domaines de premier niveau, mais canal-lier à l'agent utilisateur est seul et unique client cert.

Donc, disons qu'une application app.heroku.com définit un (canal) pour les cookies sur mon navigateur pour le domaine .heroku.com et qu'il est un attaquant sur attacker.heroku.com. Une attaque que nous avons peut-être inquiète, c'est que l'attaquant simplement les récoltes .heroku.com les cookies de mon navigateur par leurre m'attacker.heroku.com. Ils ne seront pas en mesure de réellement utiliser les cookies, cependant, parce que le cookie est le canal lié à mon navigateur du client cert, de ne pas l'attaquant du client cert.

Une autre attaque que nous avons peut-être inquiète, c'est que attacker.heroku.com jeux de un .heroku.com cookie sur mon agent utilisateur dans le but de faire de me connecter app.heroku.com comme lui-même. Encore une fois, en supposant que la seule manière pour que l'attaquant peut obtenir le cookie est d'obtenir à partir de app.heroku.com, ce qui signifie que les cookies qu'il a à sa disposition sera canal lié à son client cert, pas à mon client cert - ainsi, lorsque mon navigateur envoie à app.heroku.com ils ne seront pas valides.

Le TLS-OBC proposition, bien sûr, n'assume plus fine des "scopes" pour les certificats de client. La raison pour ceci, cependant, est purement pour éviter de suivi à travers les domaines non reliés. Liées-domaine attaques sont déjà assez mitigé, même si nous avons utilisé des gros grains de certificats client et à grain grossier (c'est à dire, de domaine) cookies. J'ai, au moins, trouvé cela un peu contre-intuitif au premier abord, puisque les autres propositions de la défense pour interdire à grain grossier, les cookies et l'utilisation de l'origine des cookies.


La critique de public-web-security@w3.org

Il y a un certain nombre de questions qui doivent être examinées pour TLS-OBC; je vais mettre en évidence un couple ici que je suis au courant.

  1. Certains SSL handshake logique peut-être besoin d'être légèrement modifié; voir https://bugzilla.mozilla.org/show_bug.cgi?id=681839 pour des discussions techniques.

  2. Il y a le potentiel de protection de la vie privée, en particulier si le client unique certificat est envoyé en texte clair avant la négociation du maître secret, un réseau passif d'observateur peut être en mesure d'identifier de manière unique un ordinateur client. L'attaquant aurait déjà l'adresse IP du client, donc ce n'est pas un énorme problème si le certificat est régénéré sur un changement d'adresse IP, mais susceptible d'annuler une grande partie de l'authentification des prestations. Une proposition visant à permettre un certificat du client pour être envoyé après le maître secret de la négociation a été faite. (ne peut pas trouver le bug maintenant, désolé)

  3. Une proposition comment #2 pourraient être abordés c'est ici: http://tools.ietf.org/html/draft-agl-tls-encryptedclientcerts

  4. Il y a de délicat interactions avec SPDY. Il y aura des mises à jour sur browserauth.net pour cela.

3voto

Aristos Points 40367

Points Principaux

  1. Donne pas la permission de s'exécuter dans le téléchargement des répertoires (un attaquant peut être de l'intérieur).
  2. Obtenez tous les possibles de l'utilisateur l'information qui est de se connecter au serveur (cookie est un seul).
  3. Surveiller le serveur et les alertes (trouvé/le voir, l'arrêter, fermer la porte).

Réponse à

Supposons que l'utilisateur a téléchargé un mauvais fichier qui était accessible uniquement dans son compte; de l'autre utilisateur alors involontairement les téléchargements de fichiers, l'exécution de aucun code exécutable qui est là.

Tout d'abord, vous ne devez pas permettre à exécuter quoi que ce soit sur votre téléchargé répertoires, parce que de même, les utilisateurs peuvent télécharger une page aspx et de l'exécuter et de parcourir vos fichiers. La première étape consiste à ajouter sur votre télécharger des répertoires web.config (mais aussi de définir les autorisations pour ne pas permettre d'exécuter quoi que ce soit).

<configuration>
    <system.web>
      <authorization>
        <deny users="*" />
      </authorization>
    </system.web>
</configuration>

relatif : j'ai été piraté. Mal aspx fichier téléchargé appelé AspxSpy. Ils essayent toujours. M'aider à les piéger‼

Voler les cookies

Permet de voir comment nous pouvons identifier l'utilisateur.

  1. Cookie
  2. Navigateur ID
  3. Propriété intellectuelle, y compris de proxy et de l'avant ips.
  4. Navigateur javascript activer (ou pas).
  5. Direct demander de mot de passe.
  6. Autre fichier stocké sur le client.

Maintenant, pour chaque enregistré dans la session, nous pouvons relier les quatre premières informations de l'ensemble, et si l'un d'eux le changement, nous pouvons nous connecter à lui et demander à nouveau de vous connecter.

Aussi est essentiel pour vous connecter d'une façon (avec une ligne de la base de données) le cookie avec le statut de connexion de l'utilisateur, de sorte que si l'utilisateur de se déconnecter, peu importe si certains voler son cookie, de ne pas être en mesure de voir les pages - ce que je veux dire, c'est le cookie qui l'amenèrent à connecter doit pas la seule que nous nous appuyons sur, mais aussi de nos données afin de suivre l'état de l'utilisateur.

Dans ce cas, même si certains de voler le cookie, si l'utilisateur de se déconnecter après certaines actions, le cookie n'est plus utile.

Donc, ce que nous faisons, c'est que nous nous connectons le cookie+ip+navigateur id+javascript informations de connexion, et si l'un d'entre eux à changer, nous ne pas confiance en lui, pas plus, jusqu'à ce que de vous connecter à nouveau.

Les Cookies

Un cookie n'est pas assez. Nous avons besoin d'au moins deux témoins, l'un qui ne fonctionnent que sur des pages sécurisées, et doit être sécurisé https et un que les travaux sur toutes les pages. Ces deux témoins doivent être connectés ensemble et cette connexion doit également être prise sur le serveur.

Donc, si l'un de ce cookie n'existe pas, ou que la connexion n'est pas de match, alors l'utilisateur à nouveau de ne pas avoir l'autorisation et la nécessité de se connecter à nouveau (avec alerte pour nous)

relative: certains pirates de voler le cookie de l'utilisateur et se connecter avec son nom sur un site web?

Une idée de connecter les témoins ensemble. Avec cette idée que je peux brancher le cookie de session avec le cookie d'authentification.

En cas d'échec

Il ya quelques étapes (ou des actions) qu'un hacker suivre (ne) quand se rendre à un site afin de pouvoir bénéficier de cette fenêtre d'opportunité et de gauche, une porte arrière ouverte.

  1. Créer un nouveau compte administrateur.
  2. Télécharger un fichier à exécuter en tant que navigateur et exécutable.

Comme je l'ai dit nous n'avons jamais permettre d'être en mesure de télécharger un fichier qui peut être exécuté, donc c'est facile. Les autres pour créer un nouveau compte administrateur est celle que nous avons besoin d'ajouter un mot de passe qui n'est pas enregistré sur un cookie, ou du néant existe de toute façon sur le client.

Donc, pour les rares actions comme, Nouvel Utilisateur de backoffice, modifier les privilèges des utilisateurs, de supprimer un utilisateur, etc, nous avons besoin de demander un deuxième mot de passe à chaque fois que seul l'administrateur sait.

De sorte que la deuxième mot de passe est le dernier messure.

Une dernière idée

Une idée que je n'ai pas fait, est de stocker de la façon dont les informations sur le client autre que le cookie, le ne peut pas être volé comme les cookies, ou même si il peut être volé est caché quelque part sur l'ensemble des données qu'il est impossible de le trouver.

Cette information peut être une extra id de l'utilisateur ainsi qu'avec les cookies, les données du navigateur, IP.

Je suis chose certains endroits possibles, mais ne pas avoir testé ou essayer encore dans la vie réelle. Ce sont quelques placé.

  1. Extension personnalisée, ou un plugin, malheureusement différent pour chaque navigateur qui ont la capacité d'enregistrer les données et ensuite nous pouvons les utiliser pour communiquer avec le serveur. Cela est nécessaire à l'action de l'utilisateur, pour installer ce plugin et pour les utilisateurs réguliers, cela peut lui faire peur et aller.
  2. Code caché à l'intérieur d'une bonne image de cache, sur l'en-tête de il, par exemple, sur l'etag. C'est aussi facile de ne pas travailler parce que nous ne pouvons pas être sûr que la demande d'image pour recharger...
  3. Certains de navigateur et d'autres capacités, par exemple, de lire et d'utiliser un certificat client, qui peut être utilisé pour échanger des données cryptées avec le serveur. Cette demande l'intervention de l'utilisateur pour installer ce certificat, et de notre part de les créer différent pour chaque utilisateur. Bon pour les comptes bancaires, mais pas pour les simples utilisateurs.

Donc, c'est mes idées... toute critique, ou une solution (pour savoir comment stocker de petites informations sur le client autre que le cookie) est la bienvenue.

La mise en œuvre

Pour le rendre réel sécurisée nous avons besoin de garder une trace de l'utilisateur sur le serveur, et sur la base de données. Une table qui se connectent à l'utilisateur, avec l'adresse ip, le navigateur id, et de l'autre, comme si maintenant, c'est connecter ou pas, est une mesure que nous pouvons utiliser pour prendre des décisions.

Si ne pas être en mesure d'utiliser une base de données, ou pas comme il est difficile, ensuite, la connexion peut être bu de hachage certaines données de l'ensemble et vérifier si cette empreinte est la même.

Par exemple, nous pouvons définir un cookie avec l'algorithme de hachage (Ip+BrowserID) et de vérifier si ce beaucoup ou pas.

Alertes - Journal

Tous les ci-dessus, ils se veulent automatiser. Comment jamais, je suggère aussi de montrer à l'utilisateur et à l'administrateur de certaines informations pour diagnostiquer et prévenir une attaque. Cette information peut être.

Pour l'utilisateur

  • Les 10 dernières informations de connexion de l' (IP, DateTime, Succès ou pas)
  • Envoyer un email sur l'utilisateur à propos de certaines actions (pour les sites de haute sécurité), comme connexion, déconnexion, les actions critiques.

Pour l'administrateur.

  • Journal et de montrer toute l'échec de la connexion sur les quatre paramètres de Cookie+IP+BroserID+Javascript Activer). Le plus de l'échec en peu de temps, plus d'attention nécessaire.
  • Vérifier l'échec de la connexion.
  • Vérifiez la page de lecture de l'utilisateur avec cookie activer (ou enregistrer) et le javascript est désactivé, parce que c'est comment scanner identifiés à partir de mon expérience.

3voto

makerofthings7 Points 10028

Fixer les Rfc

Le problème principal semble être ici que tous les hôtes peuvent écrire un cookie qui peut être remplacé par un autre hôte dans le même domaine. Que faire si il y a une façon d'écrire une valeur pour le client qui ne peut absolument pas être remplacé par un autre hébergeur? Je n'ai pas trouvé quelque chose comme ça est automatiquement inclus dans l'en-tête HTTP (comme un cookie)

Voici trois solutions qui pourraient travailler, mais j'aime la Solution 2 ou #3 si les navigateurs de mettre en œuvre correctement


Solution 1: Ajouter plus d'informations lors du téléchargement de cookies pour le serveur

Lorsque le client envoie des cookies pour le serveur, également inclure le domaine du cookie qui vous a été envoyé. Ensuite, le serveur sait ce domaine et le chemin pour trouver. Cela signifie que le client ajoute un en-tête HTTP Cookie-Details sur chaque demande:

GET /spec.html HTTP/1.1
Host: www.example.org
Cookie: name=value; name2=value2
Cookie-Details: name="value":"domain":"path":"IsSecure":"IsHTTPOnly"; name2="value2":"domain2":"path2":"IsSecure":"IsHTTPOnly"
Accept: */*

Le serveur peut alors ignorer le champ détails, ou il préférer à celui qui ne fournit pas les détails. La raison pour laquelle j'inclus le champ "valeur" dans la section de détails parce que le serveur ne serait pas en mesure de faire la différence entre les deux témoins qui ont le domaine défini à l' example.com et secure.example.com si les deux témoins ont le même nom. La plupart des navigateurs vous envoyer les valeurs dans un ordre aléatoire.

Peut-être cela peut être optimisé pour que le serveur peut dire au client si ce nouveau format cookie est pris en charge ou pas, et le client peut réagir en conséquence.


Solution 2: Étendre HTML5 LocalStorage, de sorte que les données (en option) automatiquement inséré dans l'en-tête HTTP

Si nous pouvions étendre HTML5 LocalStorage pour permettre de Sécuriser/HTTPOnly de données, nous pouvons imiter ce qui se fait dans la Solution n ° 1 ci-dessus, mais qui ont le changement entraîné par le HTML5 LocalStorage Groupe de Travail W3C

L'avantage de cela est qu'il ya moins de frais généraux que la solution n ° 1, depuis le plus prolixe cookie détails ne sont envoyées au serveur lors de son besoin. En d'autres termes, si une valeur sensible est enregistré à l'aide de la "nouvelle cookie" détails du format dans LocalStorage, alors il existe une séparation claire de quelles données doit être envoyé, et dans quel format.


Solution 3 "Témoin de validation"

  1. Un utilisateur visite une application web qui a ce "spécial" de la validation du mode activé.
  2. Sur la réponse HTTP de certains des cookies sont envoyés au navigateur. Les cookies peuvent être Uniquement HTTP, Sécurisé, ...rien)
  3. D'un côté, les cookies, l'autre en-tête est envoyée à l'utilisation des cookies: Set-CookieValidationHash. Il contient UN tableau JSON de l'algorithme SHA-256 haché cookie de clés et de valeurs, et indique la date d'expiration de la valeur
  4. Le navigateur, alors, logiquement, les liens cet en-tête pour les cookies avec le comportement suivant
    • Cet en-tête est placé dans un "Cookie de Validation Jar" qui ne peut être écrit par le même Domaine DNS et DNS Portée
  5. Cet en-tête est opaque pour le client et est renvoyé vers le serveur à chaque requête HTTP (comme un cookie)
  6. Le serveur va utiliser ce champ pour valider les cookies qui sont envoyés, et d'émettre une erreur (ou autre) si la somme de contrôle échoue.

3voto

makerofthings7 Points 10028

Proviennent des sources suivantes: http://www.w2spconf.com/2011/papers/session-integrity.pdf

5.2. De l'intégrité des en-Têtes Personnalisés

Au lieu d'assurer les cookies, nous pouvons atteindre l'intégrité de la session en choisissant une nouvelle méthode de stockage et de transmission de la session état. Alors que cela pourrait être fait à l'aide de plug-ins de navigateur comme Flash, nous préférons choisissez un modèle avec le moins de les dépendances, donc nous allons nous concentrer uniquement sur la base HTTP outils. La forme de base d'une requête HTTP a très peu d'endroits qui sont adaptés pour l'envoi de données avec intégrité. Des données dans l'URL ou du corps de l'entité de requêtes HTTP qui n'a pas d'intégrité, parce que les parties de la requête HTTP ne sont modifiables à travers des origines et donc spoofable par un attaquant. Les Cookies sont également faibles en cet égard, car ils peuvent être remplacées par l'attaquant dans notre modèle de menace. Cependant, grâce à l'utilisation d'une API JavaScript appelé XMLHttpRequest (XHR), nous pouvons envoyer des données à une coutume l'en-tête.

Arrière-plan. XMLHttpRequest (XHR) permet HTTP les requêtes contenant des en-têtes personnalisés et l' les réponses de lire, mais seulement à l'origine de l'exécution de Le JavaScript.(Voir la Note5) en conséquence, les demandes faites via XHR peut être distingué par un serveur nécessairement originaires de la site lui-même.

De la conception. Nous n'utilisons pas les cookies, et, au lieu de passer une session d'identifier token dans un en-tête HTTP personnalisé qui est seulement écrit via XMLHttpRequest. Le serveur doit traiter tous les les demandes dépourvues de cet en-tête personnalisé, ou contenant un invalide jeton, comme appartenant à une nouvelle session anonyme. Afin de persister cette session d'identification jeton à travers le redémarrage du navigateur et entre les différentes pages de la même application, le jeton peuvent être stockés dans HTML5 localStorage par JavaScript sur la réussite de l'authentification.

De sécurité. Observer que, dans ce modèle, la session d'identification jeton ne sera envoyée vers le serveur d'origine, et ne pas être inclus dans l'URL ou le corps de l'entité. Ces propriétés assurer la confidentialité et l'intégrité, respectivement. Contrairement à les cookies, le jeton ne peut pas être remplacé par l'attaquant, depuis localStorage complètement partitions de données entre les origines de la plupart des navigateurs (Voir la Note 6). Un site à l'aide de HTTPS peut s'assurer que le jeton n'est envoyée via le protocole HTTPS, ce qui garantit le secret de la jeton, même en présence d'un réseau actif attaquant. Dans plus, parce que ce jeton n'est pas envoyé automatiquement par le navigateur, il sert aussi à protéger contre les attaques de type CSRF.

Les inconvénients. Toutefois, cette approche présente plusieurs inconvénients. Tout d'abord, il exige que toutes les demandes nécessitant l'accès à l' la session d'un utilisateur à l'aide de XMLHttpRequest. Simplement l'ajout d'une séance d'identification jeton explicitement à toutes les demandes, beaucoup moins de les faire plus XHR, des modifications majeures pour la plupart des sites web existants, et serait lourd et difficile à mettre en œuvre correctement sans un cadre. Cette encore plus compliquée si les demandes de sous-ressources comme les images nécessitent un accès à l'état de session, car il n'est pas trivial pour charger des images via XHR. En troisième lieu, cette conception dépend la présence et de la sécurité de HTML5 localStorage, il sera impossible à mettre en œuvre sur certains anciens navigateurs

(Note 5) les Sites peuvent faire des demandes de site à l'aide de XHR si pris en charge par la navigateur et autorisé par le serveur cible

(Note 6) Vrai dans Chrome, Firefox, Safari et Opera sur OS X, plusieurs Linux les distributions, et Windows 7. Internet Explorer 8 ne permet pas de partition HTTP et HTTPS, mais Internet Explorer 9 ne.

2voto

makerofthings7 Points 10028

Source: le W3C Listes de Diffusion

L'IETF TLS groupe de travail a une proposition visant à lier des cookies pour TLS certificats de client, donc tant que la clé privée correspondant à la cert n'est que sur une machine, le cookie ne peut être utilisé que sur une seule machine.

Si vous souhaitez émuler le client TLS cert approche, vous pouvez utiliser localStorage pour stocker une clé privée et d'utiliser JS crypto 1 pour remplacer le document.cookie avec une version signée. C'est un peu maladroit, mais il peut être fait au travail. (Évidemment, serait mieux avec web crypto 2)

1 par exemple: http://www.ohdave.com/rsa/

2 http://www.w3.org/community/webcryptoapi/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X