web-dev-qa-db-fra.com

La vérification de mod_write est-elle vraiment nécessaire?

Récemment, j'ai remarqué que beaucoup de gens postent des fichiers .htaccess ici avec:

<IfModule mod_rewrite.c>

Parfois, cela apparaît même plusieurs fois dans le fichier! Il vérifie évidemment si mod_write est activé, mais les déclarations qu'il protège sont néanmoins nécessaires pour ces sites. Donc, si la IfModule échoue, le site Web est de toute façon brisé.

Existe-t-il un avantage à ce que le <IfModule mod_rewrite.c> échoue plutôt que le RewriteRule énoncé en dessous?

mod_write est maintenant si essentiel et omniprésent que je ne le vérifie plus. Est-ce que cela pourrait causer une vulnérabilité?

7
Itai

Non, la plupart du temps, la vérification de mod_rewrite n'est pas nécessaire. En fait, il est souvent préférable de supprimer cette vérification.

Si les directives mod_rewrite sont obligatoire de votre site, vous ne devez pas les envelopper dans un conteneur <IfModule mod_rewrite.c>. Parce que s'ils sont requis et que mod_rewrite n'est pas disponible, les directives échouent simplement en silence et votre site continue de se rompre d'une autre manière (masquant la cause sous-jacente) et exposant éventuellement quelque chose. vous ne vous attendiez pas. Sans le wrapper <IfModule>, le site se briserait instantanément (et complètement) avec une erreur facilement identifiable et aucun imprévu ne serait exposé.

Le seul moment où le wrapper <IfModule mod_rewrite.c> doit être utilisé est:

  1. Le site est conçu pour fonctionner avec ou sans mod_rewrite. C'est le cas avec WordPress. Sans mod_rewrite, le site fonctionne toujours, mais vous n'obtenez pas les "jolies" URL.

Ou

  1. Vous avez des directives de n autre module qui dépendent du succès de mod_rewrite. Donc, dans ce cas, vous devriez envelopper ces directives other dans un wrapper <IfModule mod_rewrite.c>. Par exemple, vous définissez un en-tête de réponse HTTP (avec mod_headers) basé sur une propriété de la demande que vous avez déterminée à l'aide de mod_rewrite. Dans ce cas, vous pouvez envelopper la directive Headers dans un conteneur <IfModule mod_rewrite.c>.

La plupart du temps, si vous connaissez votre serveur, vous n'avez pas besoin de la vérification <IfModule mod_rewrite.c>, car vous savez déjà si mod_rewrite est activé ou non. La seule fois où vous en avez réellement besoin est si vous écrivez du code portable pour fonctionner sur plusieurs serveurs et que la condition n ° 1 et/ou n ° 2 ci-dessus est remplie.

Parfois, cela apparaît même plusieurs fois dans le fichier!

Et la plupart du temps, c'est complètement inutile. Cependant, pour défendre ce comportement, cela se produit souvent lorsque vous avez différents plugins qui modifient .htaccess automatiquement et indépendamment. Il en va de même pour plusieurs directives RewriteEngine et RewriteBase.

Pour le code écrit à la main, vous ne devriez jamais voir cela. Pour le code écrit à la main, cela se produit généralement par le biais de mindless copier/coller (ce qui semble malheureusement arriver souvent avec les directives .htaccess.).

Existe-t-il un avantage à ce que le <IfModule mod_rewrite.c> échoue plutôt que les instructions RewriteRule situées en dessous?

Seulement dans le cas de # 1 ou # 2 ci-dessus. La plupart du temps, non.

mod_write est maintenant tellement essentiel et omniprésent que je ne le vérifie plus. Est-ce que cela pourrait causer une vulnérabilité?

Si c'est essentiel pour votre site, il n'est pas nécessaire de le vérifier. Aucune vulnérabilité.

En fait, le contraire pourrait même être vrai ... si les directives mod_rewrite sont essentiel, alors vérifier la présence de mod_rewrite pourrait même vous causer plus de problèmes si mod_rewrite devenait subitement indisponible, quelle qu'en soit la raison. Comme mentionné ci-dessus, vos directives mod_rewrite vont maintenant en silence échouer (stress "en silence" - pas d'erreur), mais le site Web peut toujours continuer à fonctionner sans qu'un erreur du serveur soit déclenché, mais renvoyer un non-sens à l'utilisateur (et aux robots des moteurs de recherche) avec un statut 200 OK. Si l'encapsuleur <IfModule> avait été omis, vous auriez été immédiatement averti du problème. Toutefois, si cette erreur a été réduite au silence, il peut s'écouler un certain temps avant que le problème ne soit découvert. Vous avez peut-être déjà subi des dommages plus graves.

5
MrWhite

Il est principalement utilisé par les systèmes de gestion de contenu tels que WordPress, car ils peuvent fonctionner avec PHP rewrite ou mod_rewrite , si le mod_rewrite n'est pas pris en charge et que vous n'utilisez pas SiModule alors certains sites donneront erreur 5 .

Chaque installation de WordPress tentera d'utiliser . Htaccess et lors de mises à niveau majeures, un contrôle sera effectué pour voir si ce code est présent:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

À plusieurs reprises, j’ai assisté à WordPress en ajoutant le code À NOUVEAU si leur code avait été modifié. C’est pourquoi les utilisateurs de WordPress laisseront généralement ce code inchangé ou utiliser chmod pour empêcher WordPress de s’ajouter, c’est en fait une bonne idée du point de vue de la sécurité. pour définir votre .htaccess à 444 .

C'est pourquoi j'ai décidé de le laisser seul quand répondant à l'une de mes questions concernant WordPress HTTP à HTTPS sans traîner les résultats de slash en double redirection

Résumé

Utiliser <IfModule mod_rewrite.c> ou non ne fera aucune différence quantifiable en termes de performances pour un site Web normal. Si vous pouvez le supprimer, faites-le absolument, cela ne changera rien si vous le faites ou non, roulez simplement avec ce qui fonctionne le mieux pour votre configuration.

1
Simon Hayter