web-dev-qa-db-ja.com

mod_writeのチェックは本当に必要ですか?

最近、多くの人が.htaccessファイルをここに投稿していることに気付きました:

<IfModule mod_rewrite.c>

時々、これはファイルに何度も現れます!明らかにmod_writeが実際に有効になっているかどうかを確認しますが、保護するステートメントはとにかくこれらのサイトに必要です。したがって、IfModuleが失敗した場合、Webサイトはとにかく壊れます。

その下のRewriteRuleステートメントではなく、<IfModule mod_rewrite.c>を失敗させることに利点はありますか?

mod_writeは非常に重要であり、ユビキタスであるため、もうチェックしません。これにより、何らかの脆弱性が発生する可能性がありますか?

7
Itai

いいえ、ほとんどの場合、mod_rewriteを確認する必要はありません。実際、多くの場合、このチェックを削除するのはpreferableです。

Mod_rewriteディレクティブがサイトで必須である場合は、<IfModule mod_rewrite.c>コンテナでラップしないでください。それらが必須でmod_rewriteが利用できない場合、ディレクティブは単純に失敗しますsilentlyそしてあなたのサイトは他の方法で壊れ続け(根本的な原因を隠して)おそらく何かを公開しますあなたは期待していなかった。 <IfModule>ラッパーがなければ、サイトはすぐに(そして完全に)簡単に識別可能なエラーで破損し、予期しないものは一切公開されません。

<IfModule mod_rewrite.c>ラッパーを使用する必要があるのは、次のいずれかのみです。

  1. このサイトは、mod_rewriteの有無にかかわらず動作するように設計されています。これはWordPressの場合です。 mod_rewriteを使用しなくても、サイトは「機能」しますが、「きれいな」URLを取得できません。

または

  1. 別のモジュールからのディレクティブがあり、mod_rewriteが正常に実行されたことに依存しています。したがって、この場合、これらのotherディレクティブを<IfModule mod_rewrite.c>ラッパーでラップします。たとえば、mod_rewriteを使用して決定した要求のプロパティに基づいて、HTTP応答ヘッダーを(mod_headersを使用して)設定します。この場合、Headersディレクティブを<IfModule mod_rewrite.c>コンテナでラップすることができます。

ほとんどの場合、サーバーを知っていれば、<IfModule mod_rewrite.c>チェックは必要ありません-mod_rewriteが有効になっているかどうかは既にわかっているためです。必要なのは、複数のサーバーで動作する移植可能なコードを作成していて、上記の条件1または2、あるいはその両方が満たされている場合だけです。

時々、これはファイルに何度も現れます!

ほとんどの場合、これは完全に不要です。ただし、この動作を防ぐために、.htaccessを自動的かつ独立して編集するさまざまなプラグインがある場合に、これがよく発生します。複数のRewriteEngineおよびRewriteBaseディレクティブにも同じことが当てはまります。

手書きコードの場合、これは表示されません。手書きコードの場合、これは一般的にmindless copy/paste(残念ながら.htaccessディレクティブで多く発生するようです)を介して発生します。

その下のRewriteRuleステートメントではなく<IfModule mod_rewrite.c>を失敗させることには利点がありますか?

上記の#1または#2の場合のみ。ほとんどの場合、いいえ。

mod_writeは非常に重要であり、ユビキタスであるため、もうチェックしません。これにより、何らかの脆弱性が発生する可能性がありますか?

サイトで必須の場合、チェックする必要はありません。脆弱性なし。

実際、mod_rewriteディレクティブがessentialである場合、逆のことが当てはまる場合もあります。mod_rewriteが何らかの理由で突然使用できなくなった場合、mod_rewriteの存在を確認することでさらに問題が発生する可能性があります。上記のように、mod_rewriteディレクティブはsilently失敗(ストレス「サイレント」-エラーなし)になりますが、Webサイトはserver errorがトリガーされることなく機能し続けますが、 200 OKステータスでユーザー(および検索エンジンボット)にナンセンスを返します。 <IfModule>ラッパーが省略されていた場合、問題はすぐに通知されます。ただし、このエラーが沈黙している場合は、問題が発見されるまでに時間がかかる可能性があります。その時点までに、より深刻な損害がすでに発生している可能性があります。

5
MrWhite

Mod_rewriteがサポートされていない場合にPHP rewriteまたは mod_rewrite で動作できるため、主にWordPressなどのコンテンツ管理システムで使用されます。 IfModule を使用すると、一部のサイトは error 500 になります。

WordPressをインストールするたびに 。htaccess を使用しようとし、メジャーアップグレード中にこのコードが存在するかどうかを確認するためのチェックをトリガーできます。

# 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

何度か、コードが変更された場合にWordPressがコードを追加することを再度確認しました。これがWordPressユーザーが一般にそのコードを変更せずに残すか、 chmod を使用してWordPressの追加を防ぐ理由です。実際には良い考えですセキュリティの観点から、.htaccessを 0444 に設定します。

これが、 末尾のスラッシュなしのWordPress HTTPからHTTPSへの質問 のいずれかに答えるときに そのままにしておくことを決めた理由です

概要

<IfModule mod_rewrite.c>を使用してもしなくても、通常のウェブサイトのパフォーマンスの点で測定可能な差はありません。削除できる場合は必ず削除しても、変更しても変更しなくても違いはありません。セットアップに最適なものを選択してください。

1
Simon Hayter