freeCodeCamp/curriculum/challenges/italian/09-information-security/information-security-projects/secure-real-time-multiplaye...

5.4 KiB

id title challengeType forumTopicId dashedName
5e601c775ac9d0ecd8b94aff Gioco multiplayer in tempo reale sicuro 4 462375 secure-real-time-multiplayer-game

--description--

Sviluppa un gioco multigiocatore in tempo reale 2D utilizzando l'API HTML Canvas e il Socket.io che è funzionalmente simile a questo: https://secure-real-time-multiplayer-game.freecodecamp.rocks/. Lavorare su questo progetto ti porterà a scrivere il tuo codice utilizzando uno dei seguenti metodi:

Quando hai finito, assicurati che una demo funzionante del tuo progetto sia ospitata in qualche percorso pubblico. Quindi invia l'URL nel campo Solution Link. Facoltativamente, invia anche un link al codice sorgente del tuo progetto nel campo GitHub Link.

--instructions--

Nota: helmet@^3.21.3 è necessario per le user stories. Ciò significa che sarà necessario utilizzare la versione precedente della documentazione di Helmet per avere informazioni su come soddifare le user stories.

--hints--

È necessario fornire il proprio progetto, non l'URL di esempio.

(getUserInput) => {
  assert(
    !/.*\/secure-real-time-multiplayer-game\.freecodecamp\.rocks/.test(
      getUserInput('url')
    )
  );
};

Più giocatori possono connettersi a un server e giocare.


Ogni giocatore ha un avatar.


Ogni giocatore è rappresentato da un oggetto creato dalla classe Player in Player.mjs.


Ogni oggetto giocatore dovrebbe contenere come minimo un id univoco, un punteggio (score), e coordinate x e y che rappresentano la posizione corrente del giocatore.


Il gioco ha almeno un tipo di oggetto da raccogliere. Completa la classe Collectible in Collectible.mjs per implementarlo.


Ogni oggetto da raccogliere creato dalla classe Collectible dovrebbe contenere come minimo un id univoco, un valore value e coordinate x e y che rappresentano la posizione corrente dell'elemento.


I giocatori possono utilizzare i tasti WASD e/o freccia per spostare il loro avatar. Completa il metodo movePlayer in Player.mjs per implementarlo.


Il metodo movePlayer dovrebbe accettare due argomenti: una stringa "up", "down", "left", o "right", e un numero per la quantità di pixel di cui dovrebbe cambiare la posizione del giocatore. movePlayer dovrebbe cambiare le coordinate x e y dell'oggetto giocatore da cui è chiamato.


Il punteggio del giocatore dovrebbe essere usato per calcolare il suo rango tra gli altri giocatori. Completa il metodo calculateRank nella classe Player per implementarlo.


Il metodo calculateRank dovrebbe accettare un array di oggetti che rappresentano tutti i giocatori collegati e restituire la stringa Rank: currentRanking/totalPlayers. Ad esempio, in una partita con due giocatori, se il giocatore A ha un punteggio di 3 e il giocatore B ha un punteggio di 5, calculateRank per il giocatore A dovrebbe restituire Rank: 2/2.


I giocatori possono scontrarsi con un oggetto da collezionare. Completa il metodo collision in Player.mjs per implementarlo.


Il metodo collision dovrebbe accettare l'oggetto di un elemento collezionabile come argomento. Se l'avatar del giocatore si interseca con l'oggetto, il metodo collision dovrebbe restituire true.


Tutti i giocatori sono sincronizzati.


I giocatori possono disconnettersi dal gioco in qualsiasi momento.


Impedisci al client di indovinare / sniffare il tipo MIME.

async (getUserInput) => {
  const data = await fetch(getUserInput('url') + '/_api/app-info');
  const parsed = await data.json();
  assert.equal(parsed.headers['x-content-type-options'], 'nosniff');
};

Impedisci attacchi di script cross-site (XSS).

async (getUserInput) => {
  const data = await fetch(getUserInput('url') + '/_api/app-info');
  const parsed = await data.json();
  assert.equal(parsed.headers['x-xss-protection'], '1; mode=block');
};

Niente di proveniente dal sito è memorizzato nella cache del client.

async (getUserInput) => {
  const data = await fetch(getUserInput('url') + '/_api/app-info');
  const parsed = await data.json();
  assert.equal(parsed.headers['surrogate-control'], 'no-store');
  assert.equal(
    parsed.headers['cache-control'],
    'no-store, no-cache, must-revalidate, proxy-revalidate'
  );
  assert.equal(parsed.headers['pragma'], 'no-cache');
  assert.equal(parsed.headers['expires'], '0');
};

Le intestazioni dicono che il sito è basato su "PHP 7.4.3" anche se non lo è (come misura di sicurezza).

async (getUserInput) => {
  const data = await fetch(getUserInput('url') + '/_api/app-info');
  const parsed = await data.json();
  assert.equal(parsed.headers['x-powered-by'], 'PHP 7.4.3');
};

--solutions--

/**
  Backend challenges don't need solutions,
  because they would need to be tested against a full working project.
  Please check our contributing guidelines to learn more.
*/