紅穆ノート
レコメンド 落とし穴のまとめ Nginxでセンシティブディレクトリをブロックし、セキュリティ保護を実施します。
落とし穴のまとめ

Nginxでセンシティブディレクトリをブロックし、セキュリティ保護を実施します。

Nginxでセンシティブディレクトリをブロックし、セキュリティ保護を実施します。

発端

先日、ブログに管理コンソール機能を追加し、新たなSQLiteデータベースディレクトリを追加しました。 Mdata キャッシュディレクトリ Mcache機能が正常に動作した後、突然、ある考えが頭に浮かんだ:

直接アクセスする場合 https://域名/Mdata/content.dbどうなるでしょうか?

試してみたところ、ブラウザでファイルのダウンロード処理が開始された――そのデータベースファイルが完全に暴露された。このファイルには、すべての記事内容、ユーザーのパスワードのハッシュ値、翻訳用キャッシュなどが含まれていた。このファイルがクローラーや傍観者によってダウンロードされれば、このサイト全体はまるで透明なガラスケースのように晒されることになる。

本記事では、トラブルシューティングおよび修復のプロセスを記録し、後続の開発者や管理者に参考情報として提供することを目的としています。

1. まず、暴風雨が実際に発生しているかを確認してください。

直感ではなく、まず測定してください。 curl または、ブラウザを個別に実行する:

curl -I https://你的域名/Mdata/content.db
curl -I https://你的域名/Mcache/_config.php
curl -I https://你的域名/Mdata/views.log
curl -I https://你的域名/Mdata/content.db-wal

返されたHTTPステータスコードを確認してください:

戻りコードの意味 200 OK 危険ファイルが公開ダウンロードされました。 403 Forbidden 拒否されたが、その結果、パスの存在が明らかになった。 404 Not Found 理想的な結果は、まるで存在しないかのように。 200この件は早急に処理する必要があります。

二、なぜ宝塔はデフォルトで防ぎ切れないのか?

宝塔パネルのデフォルトNginx設定におけるPHP処理ルールは以下の通りです:

location ~ \.php$ {
    fastcgi_pass unix:/tmp/php-cgi-74.sock;
    include fastcgi.conf;
}

単に管理するだけです。 .php ファイル、その他の拡張子(.db.log.lock)は静的ファイルの処理ルールに従って、Nginxによって通常のファイルとしてユーザーに提供されます。したがって content.db そうして、裸で走り出した。

「それなら……」と誰かが考えたかもしれません。 .db PHPルールに追加すればいいのだろうか? いや、そうすると Nginx が PHP を用いてバイナリファイルを解析しようとし、その結果として文字化けや 500 エラーメッセージが発生する。

正しい方法は以下の通りです。独立したプレフィックスマッチルールを用いて、すべてのディレクトリを除外する。

三、核心構成

「宝塔パネル」を開く → 「ウェブサイト」 → 「サイト」をクリックする 設定ファイル,が見つかりました server {} ブロックに以下の内容を追加してください:

# 屏蔽数据与缓存目录
location ^~ /Mdata/ {
    return 404;
}
location ^~ /Mcache/ {
    return 404;
}

保存すると、Nginxが自動的にリロードされます。その後、前述の4つのURLを再度テストしてください。すべて正常に返されるはずです。 404

これら2点で問題は解決しました。

四、補強:全ステーションに適用

2つのディレクトリを設定するだけでは不十分です。ここにいくつかの汎用ルールを追加することで、より多様なシナリオに対応できます:

# ============ 安全加固 ============

# 屏蔽隐藏文件(放行 .well-known 给证书验证用)
location ~ /\.(?!well-known) {
    return 404;
}

# 屏蔽数据与缓存目录
location ^~ /Mdata/ {
    return 404;
}
location ^~ /Mcache/ {
    return 404;
}

# 屏蔽后台密钥 / 会话文件
location ~ ^/admin/_(key_.*|auth)\.php$ {
    return 404;
}

# 兜底:禁止访问任何数据库文件
location ~* \.(db|sqlite|sqlite3|db-wal|db-shm)$ {
    return 404;
}

# 禁止访问日志 / 锁文件
location ~* \.(log|lock)$ {
    return 404;
}

# 禁止访问备份 / 临时 / 配置文件
location ~* \.(bak|old|orig|save|swp|swo|tmp|inc|ini|conf)$ {
    return 404;
}

項目ごとの解説:

  1. 隠しファイルルール:遮断 .git.env.htaccess この種の文書。(?!well-known) 負の先行断言を用いることで、誤った影響を回避できます。 .well-known(Let's Encryptによる証明書発行用)。
  2. 目次非表示Mdata / Mcache —— 2つの主要なディレクトリ。
  3. バックエンドファイルブロック機能Madmin/_key_*.php ログインキーが保存されています。_auth.php 会話トークンが保存されています。コンテンツがコメントで囲まれているため漏洩しないものの、それでも追加の保護層は存在します。
  4. 拡張子(最終手段)もしも、いつかあなたが…… Mdata 名前を変更する Dataまたは、他の目次にも含まれている可能性があります。 .dbこのルールも依然として防ぎ得ます。
  5. ログ/ロックファイルviews.logviews.lockphp_error.log このようなファイルでは、IPアドレス、ブラウザ情報(UA)、エラースタックなどが含まれている可能性があります。
  6. バックアップ/一時ファイルエディタ(vim / VSCode / PHPStorm)で生成されます。 .swp~.orig このようなケースでは、開発者がコードを編集する際に削除を忘れると、ソースコードが暴露される可能性があります。

六、について 403404 哲学

「セキュリティ・リング」には、こんな古い言葉があります:

攻撃者に自分が何を間違えたかを明かすのを避けてください。

1個 403 Forbidden この応答は、「こちらに何かがあるが、今はあなたに渡していない」というスキャナーへのブロードキャストに相当します。攻撃者の次の行動としては、防御を回避する、パスを推測する、あるいは脆弱性を発見するといった措置が考えられます。

404 Not Found 沈黙――――「あなたが見ていることと、私が見ていることにはほとんど違いはありません」。

自用の小型サーバーの場合、攻撃者による攻撃は「精密攻撃」というわけではなく、多くの場合、自動スキャンによるものである。404エラーが返された場合、スキャナーは通常、そのリクエストを無視する。

微信赞赏

WeChat

支付宝赞赏

Alipay

✍️ クリエイター: 紅穆

ウェブサイト管理者 · ご覧いただきありがとうございます!さらに多くの魅力的なコンテンツをお楽しみいただけますよう、引き続きご支援をお願いいたします。

著者プロフィール プロフィールを見る →

関連記事

ブラウザのキャッシュ利用により、お客様のウェブサイトへの再アクセス速度が向上します。

ブラウザのキャッシュ利用により、お客様のウェブサイトへの再アクセス速度が向上します。 落とし穴のまとめ

ブラウザキャッシュの活用:ユーザーが同サイトを複数回アクセスする場合、静的リソースのブラウザキャッシュを活用することで、ユーザーの時間の節約が可能になります。キャッシュヘッダーは、画像などの一部の静的リソースに限定せず、すべてのキャッシュ可能な静的リソースに適用されるべきです。キャッシュ可能なリソースには、JSファイルやCSSファイル、画像ファイル、その他のバイナリ形式のファイル(メディアファイルやPDFファイルなど)が含まれます。通常、HTML自体は…
👁 207
よく使用される正規表現

よく使用される正規表現 落とし穴のまとめ

正規表現によるURL:[a-zA-z]+://[^\s]*IPアドレス(IP Address)((2[0-4]\d|25[0-5]|[01]?\d\d?)\。){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)電子メール(Email)\w+([-+。]\w+)*@\w+([-。]\w+)*…
👁 249
`file_get_contents` ページで表示内容が乱れている場合の解決方法

`file_get_contents` ページで表示内容が乱れている場合の解決方法 落とし穴のまとめ

私のページでは UTF-8を使用していますが、`file_get_contents`で取得したページデータはGB2312です。この場合、中文字が乱コードとして表示されます。解決方法は以下の通りです:以下のコードをコピーしてください:`<?php header("Content-Type: text/html; charset=utf-8"); $keyworld = "煤层"; …`
👁 204

おすすめ読書

Apple CMS メッセージボードタグ

Apple CMS メッセージボードタグ プログラムノート Apple CMS

メッセージボード用タグ|適用範囲:全サイト内の任意の場所で使用可能|タグの用途:ユーザーによるメッセージの投稿およびメッセージ記録の取得に使用する。1. メッセージ投稿フォーム <form action="{pboot:msgaction}" method="post"> 連絡先:<input type="…"…
👁 459
PHPによる遠隔ダウンロードで圧縮されたPHPファイルを一時的に参照し、スクリプト実行終了後、該当ファイルを自動的に削除します。

PHPによる遠隔ダウンロードで圧縮されたPHPファイルを一時的に参照し、スクリプト実行終了後、該当ファイルを自動的に削除します。 言語ノート PHP

PHPの `tempnam()` 関数を使用して一時ファイル名を生成し、そのファイル名を返すことができます。その後、リモートからダウンロードした圧縮形式のPHPファイルを、このファイル名で指定されたファイルに解凍します。解凍後は、`require_once` または `include_once` 関数を用いて、自身のスクリプト内でこの一時ファイルを参照できます。また、スクリプト終了後には `unlink()` 関数を用いてこの一時ファイルを削除してください。以下に例を示します…
👁 202
実用ツール:Nginxウェブサイトログ分析

実用ツール:Nginxウェブサイトログ分析 実用収集 実用ツール

名前の通り、このツールはシンプルなログ分析機能を備えており、あなたのウェブサイトのログから具体的な情報を抽出できます! 1. ログファイルとツールを同一ディレクトリに配置:本プログラムのディレクトリ内に「Log」(Nginxウェブサイトログ)という名前のログファイルを配置するか、またはプログラムをコピー・移動して、ログファイルの保存先ディレクトリに移動してください。 2. ログファイル名を変更:ウェブサイトのログファイル名を「rizhi.log」に変更してください。そうでない場合、プログラムは直ちに…
👁 188
PHPを使用して、指定されたディレクトリ内にある特定のファイル拡張子を持つファイルを削除します。

PHPを使用して、指定されたディレクトリ内にある特定のファイル拡張子を持つファイルを削除します。 言語ノート PHP

PHPの`glob()`関数を使用して指定されたディレクトリ内のファイル名を検索し、`unlink()`関数を使用してそれらを削除することができます。具体的な操作手順は以下の通りです:`glob()`関数を用いて指定されたディレクトリ内のファイル名を検索し、その結果を配列に保存します。例:`$files = glob('/path/to/dir/*.txt');`。ここで、`/path/to/dir`は操作対象のディレクトリを指します。
👁 245