2017-10-04 2 views
8

J'essaie de réparer mes en-têtes. Je vois deux erreurs lors de la vérification des demandes de réseau que je visite ma page:X-FRAME-OPTIONS est affiché deux fois et X-XSS-PROTECTION est affiché incorrect

1) X-FRAME-OPTIONS: SAMEORIGIN est présenté deux fois:

Cache-Control:no-cache 
Connection:Keep-Alive 
Content-Encoding:gzip 
Content-Type:text/html; charset=UTF-8 
Date:Wed, 04 Oct 2017 12:58:30 GMT 
Keep-Alive:timeout=3, max=1000 
Server:Apache 
Set-Cookie:laravel_session=eifQ%3D%3D; expires=Wed, 04-Oct-2017 14:58:30 GMT; Max-Age=7200; path=/; secure; httponly 
Set-Cookie:XSRF-TOKEN=n0%3D; expires=Wed, 04-Oct-2017 14:58:30 GMT; Max-Age=7200; path=/ 
Transfer-Encoding:chunked 
X-CDN:Incapsula 
X-Frame-Options:SAMEORIGIN * <-------------- HERE 
X-Frame-Options:SAMEORIGIN * <-------------- HERE 
X-Iinfo:7-6626704-6651371 NNNN CT(0 0 0) RT(1507121414380 495318) q(0 1 1 -1) r(2 2) U16 
X-XSS-Protection:%E2%80%9C1;mode=block%E2%80%9D <-------- Strange Encoding here... 

2) Je peux voir l'erreur suivante sur la console pour X-XSS-PROTECTION:

Erreur lors de l'analyse de l'en-tête X-XSS-Protection: â1; mode = blockâ: attendu 0 ou 1 à la position 0. Les protections par défaut seront appliquées.

J'utilise Laravel 5.0. Le middleware FrameGuard.php n'est pas actif par défaut depuis Laravel 4.2, mais vous avez la possibilité de l'activer si nécessaire. Quand il est désactivé, je vois les erreurs ci-dessus et je ne peux vraiment pas comprendre pourquoi, alors mon premier était de remplacer ces en-têtes en utilisant réellement ce middleware.

Quand j'ajoute le middleware Illuminate\Http\Middleware\FrameGuard.php, qui contient le code ci-dessous, rien ne semble changer:

public function handle($request, Closure $next) 
{ 
    $response = $next($request); 

    $response->headers->set('X-XSS-Protection', '1; mode=block'); 
    $response->headers->set('Content-Type','text/html; charset=UTF-8'); 
    $response->headers->set('X-Frame-Options', 'SAMEORIGIN', true); 

    return $response; 
} 

J'utilise aussi Mondain qui fournit une authentification Facebook. Y at-il une chance qu'il modifie les en-têtes?

+1

Avez-vous défini la priorité du middleware, de sorte que votre middleware soit appelé le dernier? Et vous pouvez probablement déboguer si les en-têtes corrompus sont déjà là quand vous obtenez la réponse dans votre middleware. Aussi, si j'utilise 'decodeURIComponent ("% E2% 80% 9C1 ") =" "1" '. Cela signifie que l'erreur a probablement été introduite par vous seulement quelque part en utilisant une citation intelligente au lieu d'une citation normale. Avez-vous copié du code sur Internet ou un document Word? Aussi, vous pouvez détecter quel fichier a la citation intelligente en utilisant 'grep -r" "" .' –

+0

Une mise à jour à ce sujet? –

Répondre

4

Le serveur Web peut ajouter des en-têtes aux réponses en plus de celles envoyées par PHP. Nous pouvons vérifier les en-têtes du serveur Web ajoute en créant un fichier HTML vide dans le répertoire publique, comme public/dummy.html

Ensuite, visitez cette page dans le navigateur, http://example.com/dummy.html et vérifiez les en-têtes de la réponse comprend. Sinon, nous pouvons utiliser la commande curl pour afficher les en-têtes de réponse:

$ curl -I 'http://example.com/dummy.html' 

HTTP/2 200 
date: Mon, 16 Oct 2017 20:34:24 GMT 
... 
x-xss-protection: 1; mode=block 
x-frame-options: SAMEORIGIN 

L'option -Ddépotoirs les en-têtes dans un fichier. Dans ce cas, nous spécifions - comme fichier pour envoyer la sortie via STDOUT au terminal. Si nous voyons les en-têtes x-xss-protection ou x-frame-options dans cette sortie, cela signifie que le serveur Web envoie ces en-têtes. Il peut y avoir une valeur corrompue pour x-xss-protection dans la configuration du serveur Web (il semble que quelqu'un a collé des guillemets doubles stylisés (“…”) au lieu de guillemets droits ("…") que le serveur interprète comme faisant partie de la valeur de l'en-tête).

Pour nginx, recherchez les directives add_header ... dans les fichiers de configuration. Si vous utilisez Apache httpd, vérifiez les directives Header set ... dans la configuration du serveur ou le fichier .htaccess.

Il semble également que le site utilise le CDN Incapsula, qui peut également injecter les en-têtes, mais je n'ai trouvé aucune information dans la documentation Incapsula suggérant que ce soit le cas. Laravel Socialite n'ajoute pas ces en-têtes aux réponses.

+0

Juste une petite remarque - pourquoi ne pas simplement faire curl -v au lieu de tous les drapeaux proposés? –

+0

@Denis - Bon point! Certainement moins de frappe. J'ai choisi la commande curl ci-dessus pour la pertinence parce qu'elle produit * seulement * les en-têtes de réponse. Pour le débogage occasionnel, l'un ou l'autre devrait fonctionner. –