web-dev-qa-db-ja.com

_wwwユーザーアカウントに書き込み権限を付与しても安全ですか?

PHPを使用してファイルの一部を変更したいのですが、他の誰かがこのアカウントを使用して、確認なしにファイルを変更できますか?

5
user65872

通常、wwwまたはApacheに書き込みアクセスを許可することは賢明ではありませんが、これは単一のディレクトリへのアクセスを制限し、そのディレクトリ内の実行可能ファイルを許可しないことで安全に実行できます。

たとえば、phpベースのサイトのdocrootは/var/www/example.comです。php実行可能アクセスポイントのみが/var/www/example.com/index.phpと唯一のディレクトリになるようにWebサーバーをセットアップします。 Webサーバーが書き込むことができるのは/var/www/example.com/filesです。これは多くの場合、PHP Webアプリケーションが画像操作を処理する方法です。

また、/ filesディレクトリ内からphpファイルを実行できないようにWebサーバーを設定することもできます。

また、これらのファイルを別のソースに渡すこともできます。 phpはファイルを書き込むシェルスクリプトを実行しますが、これは安全に行うには非常に複雑になる可能性があり、攻撃の別のベクトルを追加する可能性があります。常に覚えておいてください。プロセスが複雑になるほど、失敗する可能性のあるものが増えます。

ウェブサーバーまたは他の何かを介してコンテンツのアップロードを許可することについて話しているのですか?

関係なく、PHPコードがonly指定された場所(ディレクトリ)に書き込みできるように、アクセス許可が既に設定されていることを確認する必要がありますウェブサイトのコンテンツとは別のもの。これは、安価な共有ホスティングでは困難な場合があります。

コンテンツのアップロード

フランクの答えはほとんど正しいですが、詳細が欠けており、少し誤解を招きます。

サーバーにアップロードされたものがサーバーによって実行されないようにする必要があります。そして、これを防ぐために複数の手段を提供する必要があります。

コンテンツに関して提供された情報は疑いを持って扱わなければなりません。ファイルパスが悪用される可能性があります( path traversal )。ユーザーが指定したMIMEタイプは本質的に無意味です。ファイル拡張子とMIMEタイプを同じ事実を表すものとして扱うというマイクロソフトの習慣に惑わされないでください。

ファイル名でさえ信頼すべきではありません。コンテンツを検証したら、生成したパス、ファイル名、拡張子を使用してファイルを保存します。

実行を防ぐための最も簡単な解決策は、アップロードされたコンテンツがドキュメントルートの外部に保存され、すべてのアクセスがサイトによって管理されるようにすることです。これにより、ブラウザにURLを入力するだけで、ファイルをリモートで呼び出すことができなくなります。 ローカルファイルの包含 の脆弱性に対する保護はありません。

しかし、安価なホスティングパッケージをお持ちの場合、これはオプションではないかもしれません。別の方法は、ファイルをドキュメントルート内に格納することですが、変換された形式(暗号化など)で仲介アクセス(リモート呼び出しおよびLFIから保護)します。 php_flag engine off を使用して、Apacheのメイン設定または.htaccessでPHP処理(つまり、リモート呼び出し)を無効にできます。繰り返しますが、これはLFIを妨げません。

コンテンツを簡単に検証するには、finfo_file()を使用し、mimetypeがホワイトリストに一致することを確認します。ただし、これはファイルの最初の数バイトをチェックするだけで、回避することができます。保護を強化するには、堅牢なツールを使用してファイルタイプを変更します(例:jpegからwebp、gifからpng、MSWordからHTML ....)。

他の何か

それは本当にあなたが変えようとしているものの詳細に依存します。

実行可能コード、特にPHPまたはネイティブバイナリを作成しないでください。 JavacriptとCSSのリスクはわずかです(テンプレートシステムを使用します)。画像、PDF、およびオーディオ/ビデオは比較的安全である必要がありますが、PHPランタイムに許可している許可に注意して、ローカルバイナリを実行して操作を実行します。

2
symcbean