Freecodecamp: Le bouton Code Locked / Unlocked est une expérience utilisateur déroutante pour les débutants

CrĂ©Ă© le 24 janv. 2018  Â·  40Commentaires  Â·  Source: freeCodeCamp/freeCodeCamp



Description du problĂšme

Le bouton "Code Locked" de la version bĂȘta apparaĂźt sur le tout premier dĂ©fi: "Say Hello to HTML Elements". Je pense que cela a Ă  voir avec les amĂ©liorations de sĂ©curitĂ© rĂ©centes pour empĂȘcher l'injection de javascript via l'URI? Dans tous les cas, il n'y a pas de code dans mon URI. L'URI est https://beta.freecodecamp.org/en/challenges/basic-html-and-html5/say-hello-to-html-elements. Je suppose que c'est peut-ĂȘtre parce que le code enregistrĂ© a Ă©tĂ© trouvĂ© dans le stockage local? VĂ©rifier le stockage local pour le code Ă  exĂ©cuter est sĂ»rement bien au-delĂ  de la capacitĂ© de quelqu'un qui vient de commencer le cours?

Étant donnĂ© que c'est le tout premier dĂ©fi, c'est dĂ©finitivement dĂ©routant et au-delĂ  de l'expertise d'un dĂ©butant pour dĂ©cider si le code est sĂ©curisĂ© ou non. Nous leur demandons de prendre une dĂ©cision pour laquelle ils n'ont pas Ă©tĂ© formĂ©s. J'Ă©tais mĂȘme confus en tant que dĂ©veloppeur expĂ©rimentĂ©. Que dois-je rechercher pour savoir si le code est fiable? Ce n'est certainement pas mon Ă©lĂ©ment <h1> ou quoi que ce soit d'autre dans l'Ă©diteur de texte?

De plus, cela ne correspond pas aux instructions qui parlent de clicking the "Run tests" button" .

Comment pouvons-nous améliorer l'expérience utilisateur tout en la maintenant sécurisée?

Informations sur le navigateur

  • Nom du navigateur, version: Chrome, 63
  • SystĂšme d'exploitation: Ubuntu
  • Mobile, ordinateur de bureau ou tablette: ordinateur de bureau

Capture d'Ă©cran

image

UI critical path

Tous les 40 commentaires

@tchaffee merci pour le rapport, fermant cela en faveur de https://github.com/freeCodeCamp/freeCodeCamp/issues/16250

@raisedadead Issue # 16250 dĂ©crit un problĂšme diffĂ©rent. Ma prĂ©occupation est la suivante: comment un dĂ©butant sait-il si le code peut ĂȘtre exĂ©cutĂ© en toute sĂ©curitĂ©? L'expĂ©rience utilisateur est mauvaise car il n'y a aucun moyen pour un dĂ©butant d'avoir les informations nĂ©cessaires pour prendre cette dĂ©cision.

D'accord ... cela signifie que nous aurions besoin d'un défi d'étape, pour l'embarquement.

@QuincyLarson avez-vous quelque chose en tĂȘte?

Ou peut-ĂȘtre revoir comment nous avons initialement prĂ©vu cette exigence? Existe-t-il un risque d'exĂ©cuter du code Ă  partir du stockage local? Je reçois l'avertissement mĂȘme s'il n'y a pas de code dans l'URI, et cela semble ĂȘtre un avertissement inutile car c'est juste mon travail enregistrĂ©.

Je ne connais pas le contexte de ce cas d'utilisation, mais je pense que le code dans l'URI est destiné au partage? Et je suppose que c'est le vrai risque pour la sécurité?

Nous pourrions peut-ĂȘtre envisager une autre solution pour partager du code plutĂŽt que de demander aux programmeurs dĂ©butants de dĂ©cider si le code peut ĂȘtre exĂ©cutĂ© en toute sĂ©curitĂ©. Je pense qu'il vaudrait la peine de comprendre d'abord ce qu'offre la solution existante et quelles Ă©taient les exigences qui mĂšnent Ă  notre solution actuelle. Ou il se peut que le partage de code via URI soit juste une mauvaise idĂ©e.

Ou peut-ĂȘtre revoir comment nous avons initialement prĂ©vu cette exigence? Existe-t-il un risque d'exĂ©cuter du code Ă  partir du stockage local? Je reçois l'avertissement mĂȘme s'il n'y a pas de code dans l'URI, et cela semble ĂȘtre un avertissement inutile car c'est juste mon travail enregistrĂ©.

L'exigence est bien Ă©tablie. Nous avons dĂ» rĂ©soudre plusieurs problĂšmes XSS en production. Le plus rĂ©cent devait bloquer complĂštement le partage. Il existe plusieurs vecteurs sur la maniĂšre dont un code non sĂ©curisĂ© peut ĂȘtre exĂ©cutĂ©.

Un utilisateur, par exemple, pourrait mĂȘme copier du code coller de n'importe oĂč, ce qui pourrait en pratique conduire Ă  de tels problĂšmes. Le correctif actuel n'empĂȘche pas un tel vecteur, mais limite techniquement toute exĂ©cution avec l'avertissement. L'UX qui l'entoure est bien sĂ»r une prĂ©occupation et nĂ©cessite donc un parcours d'apprentissage.

Nous pourrions peut-ĂȘtre envisager une autre solution pour partager du code plutĂŽt que de demander aux programmeurs dĂ©butants de dĂ©cider si le code peut ĂȘtre exĂ©cutĂ© en toute sĂ©curitĂ©.

Bien sĂ»r, pourquoi pas. N'hĂ©sitez pas Ă  jeter un coup d'Ɠil et nous aimerions avoir une solution qui augmente le correctif actuel qui est essentiellement un bloc infra-niveau sur l'exĂ©cution. Bien sĂ»r, si vous ĂȘtes intĂ©ressĂ©, nous pourrions utiliser l'aide avec un PR.

Ou il se peut que le partage de code via URI soit juste une mauvaise idée.

Nous avons des bacs prévus, mais cela n'arrivera pas bientÎt, car nous préparons l'infra autour de lui. Voir https://github.com/freeCodeCamp/freeCodeCamp/issues/11263

C'était comme ça, quand l'Utilisateur était le seul modÚle, et que nous devions garder notre DB légÚre, nous prévoyons de la rendre plus découplée progressivement.

L'exigence est bien Ă©tablie.

Laquelle? Je comprends que la récupération de code à partir du stockage local est l' une des exigences. Cela a du sens pour moi - les campeurs ne devraient pas perdre le code sur lequel ils ont commencé à travailler.

Existe-t-il une autre exigence pour exécuter le code à partir de l'URI? Je ne sais pas grand-chose à ce sujet, cela sonne juste une cloche du problÚme de sécurité que j'ai vu il y a quelques semaines.

Ils semblent ĂȘtre deux exigences diffĂ©rentes avec deux objectifs diffĂ©rents et des risques de sĂ©curitĂ© diffĂ©rents?

N'hĂ©sitez pas Ă  jeter un coup d'Ɠil et nous aimerions avoir une solution qui augmente le correctif actuel qui est essentiellement un bloc infra-niveau sur l'exĂ©cution.

Je ne suis pas un expert en sécurité, mais je serais heureux d'essayer de trouver quelque chose si je peux mieux comprendre les exigences. Quelqu'un pourrait-il décrire toutes les exigences en détail du point de vue du campeur, ainsi que la faille de sécurité que les derniers changements ont tenté de corriger? Aussi, qu'est-ce qu'un "bloc infra-level"?

Nous avons des bacs en plan.

Le problÚme ne décrit pas cette solution de maniÚre suffisamment détaillée pour que je puisse comprendre de quoi il s'agit. Pourriez-vous me donner plus de détails sur ce que sont les «bacs» et quelle est la solution envisagée?

Quoi qu'il en soit, je ne veux pas en faire quelque chose de plus grand qu'il ne l'est. Peut-ĂȘtre qu'un dĂ©fi d'Ă©tape pour l'intĂ©gration est la bonne solution pour le moment. Mais je suis vraiment curieux de savoir Ă  quoi ressemblerait cette intĂ©gration. Est-il possible d'enseigner aux campeurs dĂšs le dĂ©but quel code doit ĂȘtre fiable et lequel ne le devrait pas? Si vous avez quelque chose en tĂȘte, j'aimerais le voir parce que c'est peut-ĂȘtre plus simple que je ne l'imagine.

Merci pour votre curiosité, sur l'architecture du projet. Je voudrais certainement répondre à toutes vos questions, mais j'ai peur, tout expliquer sur ce fil ne sera pas suffisant ni justifié.

Je comprends que vous commencez peut-ĂȘtre avec ceci, donc je vais essayer d'ĂȘtre aussi clair que possible, mais s'il vous plaĂźt laissez tomber vos requĂȘtes s'il y a quelque chose qui n'est pas clair.

Je vais prendre cette requĂȘte et essayer de vous donner le contexte:

Quelqu'un pourrait-il décrire toutes les exigences en détail du point de vue du campeur, ainsi que la faille de sécurité que les derniers changements ont tenté de corriger? Aussi, qu'est-ce qu'un "bloc infra-level"?

  • PremiĂšrement, il y a une Ă©norme diffĂ©rence sur la façon dont le code est Ă©valuĂ© et exĂ©cutĂ© en production (freeCodeCamp.org) et en prĂ©paration (beta.freeCodeCamp.org) cĂŽtĂ© client. Discuter de cela est un peu hors de portĂ©e, je vous conseille donc de jeter un coup d'Ɠil au code. Mais, juste pour vous donner une vue d'ensemble du processus, il faut prendre le code dans l'Ă©diteur et l'exĂ©cuter dans le contexte du navigateur (en utilisant eval , renvoyer le code ) bien que de maniĂšre trĂšs diffĂ©rente.

  • Maintenant, revenons au point de vue du campeur. Imaginez tous les scĂ©narios que vous feriez en tant que campeur:

    • Vous pouvez commencer Ă  modifier le code dans votre Ă©diteur.
    • Vous pouvez coller du code dans votre Ă©diteur
    • Vous pouvez modifier partiellement, passer Ă  un autre dĂ©fi et revenir.
    • Vous pouvez visiter le profil de quelqu'un, cliquer sur le lien Afficher la solution, ou cliquer sur un lien dans le forum, etc. Autrement appelĂ© URI.
    • Vous pourriez ...
      ou toute combinaison de ce qui précÚde est également possible.
  • Dans tous les cas, il atteint le mĂȘme Ă©diteur oĂč le code sera analysĂ© et Ă©valuĂ©.
  • Cette analyse peut provenir du code tapĂ©, du stockage local ou de l'URI.
  • Dans tous les cas, des contrĂŽles de sĂ©curitĂ© seront effectuĂ©s, par exemple la protection contre les boucles infinies, le striping et / ou le remplacement des tags lors de l'encodage de la solution avant l'envoi en DB, etc.

  • Avec le non. de combinaisons, il est vraiment complexe de gĂ©rer plusieurs vecteurs d'attaque.

  • C'est juste la sĂ©curitĂ©.

  • Ensuite, vient le workflow:

    • le stockage local est nĂ©cessaire pour avoir un moyen, pour "enregistrer automatiquement" le travail, sans toucher la base de donnĂ©es.
    • Il en est ainsi, car seules les solutions soumises et approuvĂ©es doivent aller Ă  la base de donnĂ©es.
    • Les solutions partielles (Ă©ditĂ©es ou copiĂ©es), c'est-Ă -dire (Soumis + PAS en cours de rĂ©ussite ou en cours) devront ĂȘtre sur le stockage local.
    • De plus, les transactions (partage / affichage de l'URI) entre la base de donnĂ©es et le stockage local doivent ĂȘtre encodĂ©es / dĂ©codĂ©es pour les raisons que j'ai mentionnĂ©es plus tĂŽt.

Ici, par transactions, j'entends arriver Ă  un Ă©tat oĂč, l'Ă©diteur a du code, c'est-Ă -dire parce qu'un utilisateur clique sur un lien partagĂ© depuis son profil ou ailleurs.

La priorité de chargement des solutions pour l'évaluation est Editor > Local Storage > URI/DB

Si vous comparez les scénarios et le flux de travail, vous aurez probablement une meilleure idée de la complexité de la logique, tout en gardant les vecteurs d'attaque à distance.

Par conséquent, une vérification globale consiste à ne rien exécuter dans l'éditeur sur tous les défis, sans consentement explicite, via une méthode de déverrouillage du code. C'est le bloc infra-niveau dont je parle. Cela ne va nulle part, jusqu'à ce qu'il y ait un moyen sûr d'exécuter tout le code dans un environnement isolé dans le navigateur.

Je suis d'accord que cela peut ĂȘtre mauvais pour l'UX. Par consĂ©quent, l'intĂ©gration pourrait ĂȘtre un moyen de montrer pourquoi cela est nĂ©cessaire, sans entrer dans trop de complexitĂ© et sans effrayer les nouveaux utilisateurs.

Enfin, les bacs seraient quelque chose de similaire comme des liens courts , vous voyez ailleurs. Ex: codepen, jsbin etc. Remarque: je simplifie l'idée ici.

Celles-ci pourraient nous aider à stocker / visualiser le code en toute sécurité sans la surcharge de priorité actuelle.

ALORS,

Le vrai correctif UX explique simplement l'avertissement, dans un défi d'intégration.

Veuillez noter que j'ai peut-ĂȘtre plus simplifiĂ© les choses ici. Si vous avez l'intĂ©rĂȘt, je vous recommande de vĂ©rifier le code. En cas de blocage, nous sommes ouverts Ă  tout accord sur ce front. Veuillez donc dĂ©poser vos requĂȘtes ici.

Encore une fois juste pour réitérer:

  1. Oui, il existe plusieurs exigences, mais toutes ont le mĂȘme point d'entrĂ©e pour l'exĂ©cution / l'Ă©valuation et la visualisation. Par consĂ©quent, il est nĂ©cessaire de verrouiller / dĂ©verrouiller. Ils entraĂźnent tous les mĂȘmes risques de sĂ©curitĂ©.
  2. Il s'agit à partir de maintenant d'une vérification générale de tous les chemins entrants du code dans le mécanisme d'évaluation.
  3. Nous devons absolument aborder l'UX comme une forme d'apprentissage:

Est-il possible d'enseigner aux campeurs dĂšs le dĂ©but quel code doit ĂȘtre fiable et lequel ne le devrait pas? Si vous avez quelque chose en tĂȘte, j'aimerais le voir parce que c'est peut-ĂȘtre plus simple que je ne l'imagine.

  1. Le code, ce campeur créé pour la solution au défi (soit en tapant manuellement, soit en copiant / collant à partir de n'importe quel autre éditeur) est approuvé.

  2. Le code, qui a Ă©tĂ© crĂ©Ă© par quelqu'un d'autre (y compris les liens de son propre profil), n'est PAS fiable et doit ĂȘtre revu une fois. Ils pourraient simplement vĂ©rifier que la solution dans l'Ă©diteur a du sens pour eux. Parce que, s'ils dĂ©verrouillent un code alĂ©atoire, sans comprendre ce que c'est, ils risquent peut-ĂȘtre certains gardes de sĂ©curitĂ©.

Nous avons juste besoin de préparer un verbiage autour des deux points ci-dessus et de créer un défi d'intégration.

J'espĂšre que cela vous donne un peu de contexte? Sinon, n'hĂ©sitez pas Ă  ajouter d'autres requĂȘtes. Bonne contribution!

@raisedadead Votre explication dĂ©taillĂ©e aide beaucoup. J'ai encore quelques questions / observations qui, je l'espĂšre, nous mĂšneront Ă  la meilleure mise en Ɠuvre Ă  court et Ă  long terme.

il prend le code dans l'éditeur et l'exécute dans le contexte du navigateur (en utilisant eval

C'est le point faible qui crĂ©e les problĂšmes de sĂ©curitĂ©. Je ne dis pas que c'est Ă©vitable, mais juste en notant que c'est quelque chose Ă  rĂ©flĂ©chir au cas oĂč quelqu'un trouverait un moyen plus sĂ»r de fournir la mĂȘme fonctionnalitĂ©. Peut-ĂȘtre pas parce qu'en fin de compte, vous devez exĂ©cuter du code. Mais gardons l'esprit ouvert Ă  ce sujet. Je m'engage Ă  poser des questions.

Regardons de plus prÚs les fonctionnalités et les exigences:

Les solutions partielles (Ă©ditĂ©es ou copiĂ©es), c'est-Ă -dire (Soumis + PAS en cours de rĂ©ussite ou en cours) devront ĂȘtre sur le stockage local.

Le code, ce campeur créé pour la solution au défi (soit en tapant manuellement, soit en copiant / collant à partir de n'importe quel autre éditeur) est approuvé.

D'aprĂšs ce qui prĂ©cĂšde, il me semble que le code du stockage local doit ĂȘtre approuvĂ© mais ne l'est pas. Existe-t-il un moyen de faire la distinction entre le code qui provient d'un URI (certainement pas fiable) et le code que j'ai prĂ©cĂ©demment tapĂ© et qui provient de mon stockage local? Ce petit changement Ă  lui seul rendrait l'UX bien meilleur. D'autant que nous pourrions rendre le message beaucoup plus prĂ©cis: "vous avez utilisĂ© un URI avec du code, faites-vous confiance au code?"

S'il est possible de dĂ©tecter et de ne pas faire confiance uniquement au code qui provient d'un URI, alors je pense qu'il pourrait bien s'intĂ©grer dans le flux de travail et les fonctionnalitĂ©s existants. Si le code provient d'un URI, nous n'enregistrerons aucun code dans le stockage local tant que l'utilisateur n'aura pas appuyĂ© sur "Code Locked / Unlock?" bouton. AprĂšs quoi, l'utilisateur a indiquĂ© qu'il faisait confiance au code, afin qu'il puisse ĂȘtre placĂ© en toute sĂ©curitĂ© dans le stockage local, puis exĂ©cutĂ© sans avertissement Ă  l'avenir lorsqu'il reviendra.

À plus long terme, je me demande vraiment si l'envoi de code dans un URI est juste une mauvaise idĂ©e dans l'ensemble, et si nous pourrions trouver un meilleur moyen de partager des solutions et du code. Mais je rĂ©pĂšte que c'est une question Ă  plus long terme car elle nĂ©cessite de grands changements dans la façon dont les choses sont actuellement faites.

Ils pourraient simplement vérifier que la solution dans l'éditeur a du sens pour eux.

Cela m'a convaincu que l'intĂ©gration pourrait ĂȘtre suffisamment simple pour ĂȘtre efficace. "Si vous ne reconnaissez pas ou ne comprenez pas le code dans l'Ă©diteur, ne lui faites pas confiance."

Mais s'il est possible de faire la distinction entre le code qui provient d'un URI et le code dans le stockage local, je me demande mĂȘme si l'intĂ©gration est nĂ©cessaire, car l'avertissement uniquement dans cette situation ne me semble pas ĂȘtre un mauvais UX. "Vous venez d'utiliser le code d'un URI, veuillez vous assurer que le code dans l'Ă©diteur a du sens avant de le dĂ©verrouiller."

@raisedadead Je ne sais pas si vous avez déjà rencontré @tchaffee mais il est un contributeur prolifique à freeCodeCamp. C'est un développeur expérimenté et l'une des personnes principales derriÚre nos nouveaux projets testables .

D'accord ... cela signifie que nous aurions besoin d'un défi d'étape, pour l'embarquement.

Nous ne voulons pas ajouter d'autres défis par étapes. Si quoi que ce soit, nous voulons nous débarrasser des défis que nous avons.

C'est parce que les gens ne lisent pas .

L'une des raisons pour lesquelles nous essayons de rendre le texte de la leçon de défi aussi laconique que possible est que plus il y a de texte, moins l'utilisateur aura la patience de le lire.

@tchaffee a raison - nous devons améliorer l'UX de cela.

Je propose de ne verrouiller le code que s'ils sont parvenus au défi en cliquant sur une URL contenant le code de quelqu'un d'autre. Sinon, nous ne devons pas les avertir de l'exécution du code.

JSBin, CodePen, je ne pense pas qu'aucun de ces sites ne prĂ©vienne les gens d'exĂ©cuter le code d'autres personnes de cette maniĂšre. Je pense que nous pouvons les avertir, mais seulement dans les situations oĂč il est probable qu'ils exĂ©cutent du code qui ne leur appartient pas. Sinon, cliquer sur ce bouton est vraiment ennuyeux et augmentera l'attrition.

Vous pouvez commencer Ă  modifier le code dans votre Ă©diteur.

Aucune serrure nécessaire.

Vous pouvez coller du code dans votre Ă©diteur

Aucun verrou nécessaire (nous devrions supposer que vous avez déjà lu le code que vous collez)

Vous pouvez modifier partiellement, passer à un autre défi et revenir.

Aucun verrou nécessaire

Vous pouvez visiter le profil de quelqu'un, cliquer sur le lien Afficher la solution, ou cliquer sur un lien dans le forum, etc.

C'est la seule situation oĂč le verrou est nĂ©cessaire Ă  mon humble avis.

En outre, nous devons reformuler cela pour indiquer que nous n'avons pas besoin d'un message de survol. Nous n'utilisons pas de messages en survol ailleurs dans la base de code, et ne le devrions pas car ils ne fonctionnent pas sur mobile. Tout le texte que nous voulons utiliser doit ĂȘtre Ă©crit sur le bouton lui-mĂȘme.

basic_javascript__increment_a_number_with_javascript___freecodecamp_

Tout le texte que nous voulons utiliser doit ĂȘtre Ă©crit sur le bouton lui-mĂȘme.

Je pense que le texte du bouton existant pourrait fonctionner si vous affichez également un lien sous le bouton du type "Pourquoi mon code est-il verrouillé?". Juste une suggestion.

De plus, je peux essayer de résoudre ce problÚme si personne d'autre n'a le temps de le faire. J'aurais besoin d'aide pour que quelqu'un me pointe vers tout le code pertinent. Mais s'il y a quelqu'un de plus qualifié et de plus disposé, laissez-le prendre cette question.

@tchaffee Ce serait génial!

PlutĂŽt que d'avoir un lien, nous devons juste trouver un moyen succinct de l'expliquer en aussi peu de mots que possible, mĂȘme si le bouton fait deux lignes. "J'ai confiance en ce code. DĂ©verrouillez-le."

Encore une fois, nous voulons que ce bouton n'apparaisse que lorsque le code n'est pas celui du campeur.

@QuincyLarson oui, alors que je voudrais Ă©galement Ă©viter un flux d'

Cela laisse toujours le fait que, selon la logique actuelle cĂŽtĂ© client, l'implĂ©mentation du blocage uniquement du code non utilisateur doit ĂȘtre implĂ©mentĂ©e.

J'entends par lĂ  que la logique du bouton "I trust this code. Unlock it." pour ne pouvoir s'afficher que lorsque le code provient de l'URI, etc. doit encore ĂȘtre implĂ©mentĂ©e.

J'ajouterai un PR pour mettre Ă  jour l'Ă©tiquette et fermer l'autre problĂšme https://github.com/freeCodeCamp/freeCodeCamp/issues/16250

Cela laisse toujours le fait que, selon la logique actuelle cĂŽtĂ© client, l'implĂ©mentation du blocage uniquement du code non utilisateur doit ĂȘtre implĂ©mentĂ©e.

Je ne sais pas oĂč cela laisse mon offre de mettre en Ɠuvre le nouveau comportement. Je peux essayer d'implĂ©menter le blocage uniquement du code non-utilisateur, mais il semble que ce n'est pas le bon moment? Quelqu'un peut-il clarifier?

Je vais devoir vĂ©rifier comment cela fonctionne pour vous donner des directives trĂšs spĂ©cifiques sur ce qui doit ĂȘtre fait, en attendant, je vais taguer @BerkeleyTrue pour ses entrĂ©es.

J'entends par lĂ  la logique du bouton "Je fais confiance Ă  ce code. DĂ©verrouillez-le." pour pouvoir s'afficher uniquement lorsque le code provient de l'URI, etc. doit encore ĂȘtre implĂ©mentĂ©.

@raisedadead Oui - je suis d'accord avec vous. Cela est important et sauvera des milliers de campeurs leur santé mentale.

J'ai dĂ©placĂ© ceci vers le "chemin critique" sur notre version bĂȘta Kanban: https://github.com/freeCodeCamp/freecodecamp/projects/1?fullscreen=true

Je suis toujours heureux de tenter le coup si quelqu'un peut me diriger vers les parties du code en question. Je suis sĂ»r que je pourrais le trouver moi-mĂȘme, mais si quelqu'un est dĂ©jĂ  familier avec le code, cela fera gagner du temps. Quelqu'un pourrait-il me dire quel en est le statut?

@tchaffee Merci pour votre patience.

@Bouncey Savez-vous oĂč rĂ©side cette logique dans la base de code? Pourriez-vous pointer @tchaffee dans la bonne direction?

@tchaffee

Vous pouvez vérifier l'URI avec le pathnameSelector

Vous l'utilisez en le passant dans la méthode mapStatetoProps du composant SidePanel , vous pouvez ensuite interagir avec le composant ToolPanel partir de là

J'espùre que cela aide 👍

J'ai commencĂ© Ă  y jeter un Ɠil et j'ai une question. Quelqu'un peut-il me donner un exemple de la façon dont il est possible de faire ce qui suit:

Vous pouvez visiter le profil de quelqu'un, cliquer sur le lien Afficher la solution, ou cliquer sur un lien dans le forum, etc. Autrement appelé URI.

Sur le site bĂȘta, je ne vois qu'une fenĂȘtre contextuelle pour les solutions et aucun URI qui charge le code. Apparemment, cela a changĂ© en version bĂȘta? Y a-t-il d'autres endroits oĂč le code pourrait ĂȘtre chargĂ© Ă  partir d'un URI? Quelqu'un peut-il m'indiquer un exemple d'URI?

Merci!

@tchaffee c'est correct, ce cas d'utilisation n'est plus valide:

Vous pouvez visiter le profil de quelqu'un, cliquer sur le lien Afficher la solution, ou cliquer sur un lien dans le forum, etc. Autrement appelé URI.

Il a en effet été remplacé par un modal maintenant, ce qui le rend beaucoup plus sûr que d'avoir à analyser l'URI dans l'éditeur. Je pense donc que le chargement à partir de l'URI n'est plus en image.

Maintenant, cela nous amĂšne au verrouillage / dĂ©verrouillage du code. C'est Ă  ce moment que le bouton doit ĂȘtre affichĂ©.

Voici quelques scénarios auxquels je peux penser:

  1. Les campeurs peuvent revoir un défi à partir de la carte.
  2. Dans un tel cas, le code sera chargé dans l'éditeur à partir du stockage local, si disponible.
  3. Ou, il sera extrait du backend, ajouté au stockage local puis placé dans l'éditeur.

Maintenant, dans un monde idéal, ce sera le cas, que ce code appartient au campeur.

Mais, quelles que soient les possibilitĂ©s, c'est le Code qui est chargĂ© sur l'Ă©diteur, et qui est exĂ©cutĂ©. Cela nous laisse un endroit oĂč le code non sĂ©curisĂ© pourrait ĂȘtre exĂ©cutĂ©? Au moins c'est un vecteur que je peux voir.

Donc, nous devons nous assurer que le campeur est au courant de ce qui doit ĂȘtre exĂ©cutĂ©, et est fait avec son consentement explicite.

Donc, la partie du blocage du code du stockage local ou du backend (code non utilisateur) reste toujours, je suppose. Mais, ayant le bouton pour cela, je pense que ce n'est pas nécessaire.

Il devrait ĂȘtre possible de verrouiller le code non-utilisateur, c'est-Ă -dire de ne pas l'exĂ©cuter, s'il Ă©tait autre que le code de dĂ©part original ou quelque chose qui a Ă©tĂ© tapĂ© par le campeur (code utilisateur).

@Bouncey @BerkeleyTrue Ai-je raison sur ce point de vue?

Oh, oui et juste pour noter que l'analyse d'URI est toujours disponible, et va nulle part parce que l'éditeur de défi est indépendant du fait que nous avons une vue de profil de réaction avec modale pour les solutions.

Je vais essayer de partager un exemple d'URI si j'ai du temps.

Mais, quelles que soient les possibilitĂ©s, c'est le Code qui est chargĂ© sur l'Ă©diteur, et qui est exĂ©cutĂ©. Cela nous laisse un endroit oĂč le code non sĂ©curisĂ© pourrait ĂȘtre exĂ©cutĂ©?

Je dirais que non. Si un campeur copie / colle du code ailleurs, c'est sur lui pour s'assurer qu'il comprend le code et que le code est en sĂ©curitĂ©. Cette approche rĂ©compense Ă©galement l'honnĂȘtetĂ© et punit la triche - si vous ne comprenez pas ce que le code copiĂ© fait, vous ne devriez jamais le coller. Vous n'auriez clairement pas pu l'Ă©crire vous-mĂȘme si vous ne le comprenez pas, donc tout dommage que vous causez est le rĂ©sultat d'une vĂ©ritable tricherie.

Il n'y a que deux façons "honnĂȘtes" de faire entrer le code dans l'Ă©diteur la premiĂšre fois ?

  1. Copiez / collez quelque chose que vous comprenez et que vous auriez pu Ă©crire vous-mĂȘme.
  2. Tapez vous-mĂȘme le code.

À quel moment il est enregistrĂ© dans le stockage local ou le backend?

Tout code provenant du stockage local ou du backend et placĂ© dans l'Ă©diteur, devait d'abord provenir de l'une des mĂ©thodes ci-dessus. Ainsi, le code du stockage local ou du backend peut toujours ĂȘtre traitĂ© comme sĂ»r.

Il devrait ĂȘtre possible de verrouiller le code non-utilisateur, c'est-Ă -dire de ne pas l'exĂ©cuter, s'il Ă©tait autre que le code de dĂ©part original ou quelque chose qui a Ă©tĂ© tapĂ© par le campeur (code utilisateur).

Par ci-dessus, l'OMI ce n'est pas nécessaire.

l'analyse d'URI est toujours disponible, et ne va nulle part car l'éditeur de défi est indépendant du fait que nous avons une vue de profil de réaction avec modal pour les solutions.

C'est le seul vecteur non sûr auquel je puisse penser. Si vous pouvez me donner un exemple, je vais essayer de le détecter et afficher le bouton "Déverrouiller" dans ce cas uniquement.

Bien sûr, si j'ai manqué quelque chose, veuillez me corriger.

Oui, les deux premiers points que vous indiquez sont les scĂ©narios les plus bas pour verrouiller le code, ce que j'accepte. Et mĂȘme si, idĂ©alement, nous devrions le bloquer. C'est une chose coĂ»teuse Ă  faire.

À quel moment il est enregistrĂ© dans le stockage local ou le backend?

Il est sauvegardé dÚs qu'un code est disponible dans l'éditeur. Donc, copier-coller et taper sont comptés.

C'est le seul vecteur non sûr auquel je puisse penser. Si vous pouvez me donner un exemple, je vais essayer de le détecter et afficher le bouton "Déverrouiller" dans ce cas uniquement.

C'est le seul cas à traiter. Et encore une fois, ce n'est pas une priorité pour le moment. Le cas d'utilisation pour cela serait par exemple lorsque nous avons les solutions provenant d'une intégration tierce à notre application Web via un URI.

Donc, le chĂšque en place suffit, et comme vous l'avez bien compris, nous ne devrions intelligemment bloquer que cela.

Je partagerai un exemple d'URI dÚs que possible. (Stuart si vous le pouvez, n'hésitez pas à me battre pour ça)

@raisedadead merci pour la clarification. Je suis d'accord que nous ne devrions verrouiller le bouton que lorsque l'utilisateur charge un défi pour la premiÚre fois et qu'il y a des paramÚtres de code dans l'URL. Dans toutes les autres situations, nous ne devons pas verrouiller le code et simplement l'exécuter lorsque l'utilisateur clique sur le bouton ou appuie sur ctrl + entrée la premiÚre fois.

DĂšs que quelqu'un peut me donner un exemple de code dans l'URL, je peux commencer Ă  travailler dessus.

@tchaffee Nous testons le code dans l'URI ici .

Vous pouvez envoyer une action pour verrouiller le code dans le bloc if comme ceci

return Observable.of(
  makeToast({
    message: 'I found code in the URI. Loading now.'
  }),
  storedCodeFound(challenge, finalFiles),
  // lockTheCodeAction()
);

cela devrait vous permettre de rester productif jusqu'Ă  ce que nous puissions vous obtenir un URI de code avec lequel jouer

@tchaffee Voici un exemple d'URL: http: // localhost : 3000 / challenges / Check% 20for% 20Palindromes? solution = function% 20palindrome (str)% 20% 7B% 0A% 20% 20str% 20% 3D% 20str.toLowerCase (). remplacer (% 2F% 5B% 5CW_% 5D% 2Fg% 2C% 20% 27% 27)% 3B% 0A% 20% 20 pour (var% 20i% 20% 3D% 200% 2C% 20len% 20% 3D % 20str.length% 20-% 201% 3B% 20i% 20% 3C% 20len% 2F2% 3B% 20i% 2B% 2B)% 20% 7B% 0A% 20% 20% 20% 20if (str% 5Bi% 5D % 20!% 3D% 3D% 20str% 5Blen-i% 5D)% 20% 7B% 0A% 20% 20% 20% 20% 20% 20return% 20false% 3B% 0A% 20% 20% 20% 20% 7D % 0A% 20% 20% 7D% 0A% 20% 20 retour% 20 vrai% 3B% 0A% 7D

Cela mĂšnera Ă  l'URL http: // localhost : 3000 / challenges / check-for-palindromes et remplira le code suivant:

function palindrome(str) {
  str = str.toLowerCase().replace(/[\W_]/g, '');
  for(var i = 0, len = str.length - 1; i < len/2; i++) {
    if(str[i] !== str[len-i]) {
      return false;
    }
  }
  return true;
}

@QuincyLarson Merci. J'ai hésité à commencer à travailler là-dessus sans pouvoir tester mon travail. Je peux réserver un peu de temps pour examiner cela bientÎt.

@tchaffee Génial! Heureux d'avoir pu aider. S'il vous plaßt laissez-moi savoir si je peux faire autre chose pour vous garder non bloqué :)

L'URL réelle que j'avais besoin d'utiliser est http: // localhost : 3000 / en / challenges / javascript-algorithms-and-data-structures-projects / palindrome-checker? Solution = function% 20palindrome (str)% 20% 7B% 0A % 20% 20str% 20% 3D% 20str.toLowerCase (). Replace (% 2F% 5B% 5CW_% 5D% 2Fg% 2C% 20% 27% 27)% 3B% 0A% 20% 20 pour (var% 20i% 20 % 3D% 200% 2C% 20len% 20% 3D% 20str.length% 20-% 201% 3B% 20i% 20% 3C% 20len% 2F2% 3B% 20i% 2B% 2B)% 20% 7B% 0A% 20 % 20% 20% 20if (str% 5Bi% 5D% 20!% 3D% 3D% 20str% 5Blen-i% 5D)% 20% 7B% 0A% 20% 20% 20% 20% 20% 20return% 20false% 3B % 0A% 20% 20% 20% 20% 7D% 0A% 20% 20% 7D% 0A% 20% 20retour% 20vrai% 3B% 0A% 7D

Juste mettre ceci ici pour la documentation. Pas besoin de commenter.

@Bouncey pouvez-vous me

Je pense que tout ce verrouillage / déverrouillage n'est pas la meilleure idée en termes de sandboxing hors code. Au lieu de cela, je pense que vous devriez évaluer le code dans une iframe sur une origine différente pour vous assurer qu'il n'y a aucun moyen d'interagir avec la session d'un campeur.

(À part mais lĂ©gĂšrement pertinent): Quelle est la mĂ©thode prĂ©fĂ©rĂ©e pour signaler des problĂšmes de sĂ©curitĂ© potentiels Ă  freeCodeCamp?

@ joker314 n'hĂ©sitez pas Ă  m'envoyer un email [email protected]

Veuillez noter que ce problÚme est bloqué par le numéro 16904

Je ferme ce problÚme comme périmé car il n'a pas été actif ces derniers temps. Si vous pensez que cela est toujours pertinent pour la plate-forme récemment mise à jour, veuillez expliquer pourquoi, puis rouvrez-la.

Cette page vous a été utile?
0 / 5 - 0 notes