Un jeu web parfaitement codé peut être vulnérable s’il n’est pas sécurisé au niveau du réseau, c’est à dire dans les échanges entre le serveur et les navigateurs. HTTPS, CSP, Cookies flag, et d’autres vous aideront à assurer cette , pour le bien de vos joueurs.

HTTPS

Quand on parle de “sécurité réseau” sur internet, on pense d’abord à HTTPS. Et c’est normal: ce protocole est le premier rempart contre les failles de sécurité entre votre serveur et vos joueurs. Sans HTTPS, un pirate pourrait écouter tout ce que vos joueurs échangent avec votre serveur, et ainsi faire des actions en leur nom, leur voler leur compte, ou même connaître leur mot de passe.

Comme indiqué dans un topic de JeuWeb, HTTPS va rapidement devenir nécessaire pour tous les sites web. Google pénalise les sites non-HTTPS, et Mozilla affiche une alerte sur les sites HTTP demandant un mot de passe (Chrome fait de même).

HTTPS que pour le login?

D’après le tweet précédent, on pourrait se dire que HTTPS n’est nécessaire que sur la page de login ou d’inscription. Mais d’autres failles peuvent survenir sur n’importe quelle autre page du jeu (les cookies de sessions transiteraient en clair par exemple) et, de manière synthétique, vous devrez gérer un site à cheval entre et HTTPS, donc entre deux Origin différentes: vous allez en chier! Le plus simple est donc de tout passer en HTTPS.

Mise en place

Générer le certificat HTTPS

Là, je ne pourrai pas vous aider: chez OVH, cela se fait via leur manager spécifique. Il suffit d’éditer chaque domaine et de cocher “HTTPS”, d’attendre un peu (2 heures) puis de cliquer sur “Générer le cerficat HTTPS”. Il sera opérationnel dans les 2 heures qui suivent (donc, 4H au total).

Rediriger le traffic HTTP → HTTPS

Vous avez activé HTTPS (en vous reportant à la doc de votre hébergeur). Maintenant, comment basculer les liens HTTP vers HTTPS, histoire de ne pas perdre en référencement? Pour cela, un simple htaccess suffit:

RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

La redirection HTTP 301 est définitive! Je vous conseille donc d’utiliser d’abord le code 302 (remplacez le 301 du code ci-dessus par 302), de vérifier que votre jeu marche bien, puis de basculer en 301 le lendemain.

Forcer HTTPS

HSTS permet de dire au navigateur “tu t’es connecté en HTTPS sur ce site, à partir de maintenant, tous les liens HTTP tu les transformes tout seul en HTTPS”. Cela évite de laisser fuiter des cookies par mégarde (entre autre):

# HSTS forces the use of HTTPS by the browser even if a link was HTTP
# It works only on HTTPS, and only with no certificat error
# The duration is 1 year
# https://raymii.org/s/tutorials/HTTP_Strict_Transport_Security_for_Apache_NGINX_and_Lighttpd.html
Header always set Strict-Transport-Security "max-age=31536000"

Cookies

Vous pouvez aussi basculer tous les cookies en SecureOnly (ils ne seront alors jamais envoyés en clair sur le réseau) et en HttpOnly (ils ne seront pas accessibles par Javascript):

# Cookies config: No "Secure" on non-HTTPS domains, but always HttpOnly
Header edit Set-Cookie ^(.*)$ $1;Secure env=!SKIP_HTTPS
Header edit Set-Cookie ^(.*)$ $1;HttpOnly

En plus d’HTTPS, il existe d’autres astuces pour sécuriser votre jeu web en ne modifiant que les codes d’Apache (le .htaccess). Elles vous sont données ci-après.

CSP: Content Security Policy

La Content Secutiry Policy permet de dire au navigateur “voilà les ressources (CSS, JS, images, etc) que mon site a le droit de charger, si mon site contient autre chose [na: à cause d’une faille XSS], alors ne le charge pas”. Cela mitige donc les attaques XSS.

# CSP see https://www.w3.org/TR/CSP/
Header always set Content-Security-Policy "default-src *.twitter.com 'self'; style-src 'self' 'unsafe-inline'; script-src *.twitter.com 'self' 'unsafe-inline'"
# These got deprecated by CSP but are still recommended as of 2016
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-XSS-Protection "1; mode=block"

Pour HTTP->HTTPS, HSTS, et les cookies, vous n’avez qu’à copier/coller les codes précédents. Pour la CSP, il faudra vous creuser un peu plus la tête, car chaque site a ses propres besoin et ses propres règles (ie: vous n’avez peut-être pas besoin de twitter sur votre site).