Ist das Überprüfen auf mod_write wirklich notwendig?

7

Kürzlich habe ich festgestellt, dass viele Leute .htaccesshier Dateien posten mit:

<IfModule mod_rewrite.c>

Manchmal erscheint dies sogar mehrmals in der Datei! Es wird offensichtlich geprüft, ob mod_writees tatsächlich aktiviert ist, aber die Anweisungen, die es schützt, sind für diese Websites ohnehin erforderlich. Wenn das IfModulefehlschlägt, ist die Website trotzdem kaputt.

Gibt es einen Vorteil, wenn der <IfModule mod_rewrite.c>Fehler fehlschlägt, anstatt die RewriteRuleAussagen darunter?

mod_writeJetzt ist es so wichtig und allgegenwärtig, dass ich es nicht mehr überprüfe. Könnte dies zu einer Sicherheitslücke führen?

Itai
quelle

Antworten:

6

Nein, meistens ist es nicht erforderlich, nach mod_rewrite zu suchen. Tatsächlich ist es oft vorzuziehen , diese Prüfung zu entfernen.

Wenn die Anweisungen mod_rewrite von Ihrer Site benötigt werden, sollten Sie sie nicht in einen <IfModule mod_rewrite.c>Container einschließen. Denn wenn sie erforderlich sind und mod_rewrite nicht verfügbar ist, schlagen die Anweisungen einfach stillschweigend fehl und Ihre Site bricht weiterhin auf andere Weise ab (Maskierung der zugrunde liegenden Ursache) und legt möglicherweise etwas offen, das Sie nicht erwartet hatten. Ohne den <IfModule>Wrapper würde die Site sofort (und vollständig) mit einem leicht identifizierbaren Fehler brechen und nichts Unerwartetes wird aufgedeckt.

Der <IfModule mod_rewrite.c>Wrapper sollte nur verwendet werden, wenn :

  1. Die Site kann mit oder ohne mod_rewrite verwendet werden. Dies ist bei WordPress der Fall. Ohne mod_rewrite "funktioniert" die Site immer noch, Sie erhalten einfach nicht die "hübschen" URLs.

Oder

  1. Sie haben Anweisungen von einem anderen Modul , die davon abhängen, dass mod_rewrite erfolgreich ausgeführt wurde. In diesem Fall würden Sie diese anderen Anweisungen in einen <IfModule mod_rewrite.c>Wrapper einschließen. Beispiel: Festlegen eines HTTP-Antwortheaders (mit mod_headers) basierend auf einer Eigenschaft der Anforderung, die Sie mithilfe von mod_rewrite ermittelt haben. In diesem Fall können Sie die HeadersDirektive in einen <IfModule mod_rewrite.c>Container einschließen.

Wenn Sie Ihren Server kennen, brauchen Sie die <IfModule mod_rewrite.c>Prüfung meistens nicht , da Sie bereits wissen, ob mod_rewrite aktiviert ist oder nicht. Das einzige Mal, wenn Sie es brauchen, ist, wenn Sie tragbaren Code schreiben, um auf mehreren Servern zu arbeiten, und entweder die oben genannten Bedingungen 1 und / oder 2 erfüllt sind.

Manchmal erscheint dies sogar mehrmals in der Datei!

Und meistens ist dies völlig unnötig. Zur Verteidigung dieses Verhaltens tritt dies jedoch häufig auf, wenn Sie verschiedene Plugins haben, die .htaccessautomatisch und unabhängig voneinander bearbeitet werden. Gleiches gilt für mehrere RewriteEngineund RewriteBaseDirektiven.

Für handgeschriebenen Code sollten Sie dies niemals sehen. Bei handgeschriebenem Code geschieht dies im Allgemeinen durch sinnloses Kopieren / Einfügen (was bei .htaccessDirektiven leider häufig vorkommt ).

Gibt es einen Vorteil, wenn die <IfModule mod_rewrite.c>fehlgeschlagenen RewriteRule-Anweisungen darunter liegen?

Nur im Fall von # 1 oder # 2 oben. Meistens nein.

mod_write ist jetzt so wichtig und allgegenwärtig, dass ich nicht mehr danach suche. Könnte dies zu einer Sicherheitslücke führen?

Wenn es für Ihre Site wichtig ist, müssen Sie nicht danach suchen. Keine Verwundbarkeit.

In der Tat könnte sogar das Gegenteil der Fall sein ... Wenn die Anweisungen mod_rewrite unbedingt erforderlich sind, kann die Überprüfung auf das Vorhandensein von mod_rewrite sogar zu weiteren Problemen führen, wenn mod_rewrite aus irgendeinem Grund plötzlich nicht mehr verfügbar ist. Wie oben erwähnt, würden Ihre mod_rewrite-Direktiven jetzt stillschweigend fehlschlagen (Stress "still" - kein Fehler), aber die Website funktioniert möglicherweise weiterhin, ohne dass ein Serverfehler ausgelöst wird, aber mit einer 200 Unsinn an den Benutzer (und Suchmaschinen-Bots) zurückgegeben wird OK Status. Wenn der <IfModule>Wrapper weggelassen worden wäre, wären Sie sofort über das Problem informiert worden. Wenn dieser Fehler jedoch zum Schweigen gebracht wurde, kann es einige Zeit dauern, bis das Problem entdeckt wird. Zu diesem Zeitpunkt ist möglicherweise bereits ein schwerwiegenderer Schaden entstanden.

Herr weiß
quelle
1

Es wird hauptsächlich von Content Management Systemen wie WordPress verwendet, da diese mit PHP rewrite oder mod_rewrite arbeiten können. Wenn mod_rewrite nicht unterstützt wird und Sie IfModule nicht verwenden, führen einige Websites zu Fehler 500 .

Bei jeder Installation von WordPress wird versucht, .htaccess zu verwenden, und bei größeren Upgrades kann eine Überprüfung ausgelöst werden, um festzustellen, ob dieser Code vorhanden ist:

# 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

Bei mehreren Gelegenheiten habe ich gesehen, wie WordPress den Code WIEDER hinzufügte, wenn sein Code geändert wurde. Aus diesem Grund lassen WordPress-Benutzer diesen Code im Allgemeinen unverändert oder verwenden chmod , um zu verhindern, dass WordPress daran angehängt wird . Aus Sicherheitsgründen ist es eine gute Idee, Ihren .htaccess auf 0444 zu setzen .

Aus diesem Grund habe ich beschlossen, es in Ruhe zu lassen, wenn ich eine meiner Fragen zu WordPress HTTP zu HTTPS beantworte , ohne dass ein abschließender Schrägstrich zu einer doppelten Umleitung führt

Zusammenfassung

Das Verwenden <IfModule mod_rewrite.c>oder Nicht- Verwenden wird keinen messbaren Unterschied in Bezug auf die Leistung der normalen Website bewirken. Wenn Sie es dann entfernen können, macht es auf keinen Fall einen Unterschied, ob Sie es tun oder nicht, rollen Sie einfach mit dem, was funktioniert am besten für Ihr Setup.

Simon Hayter
quelle