PHP Manual
/
セキュリティ

PHPやファイル添付にセキュリティを盛り込む

22. 08. 2019

Obsah článku

ディスクに保存してあるファイルをページに添付することはよくあります。もし、その正確な名前を直接アタッチ関数に入力すれば、何も心配することはない。

ファイルの安全な添付

include 'menu.html';

前回の書き込みは、いつも同じファイルをマウントしているので、全く問題ありません。この場合、セキュリティエラーは起こりえません。唯一起こりうる問題は、menu.htmlファイルがない場合、警告メッセージが表示されますが(どうせ表示されないでしょう)、通常、存在がほぼ確実なファイルを添付するので、この状況は稀なことです。

パターンに従ってファイルを添付する

しかし、例えば、このようなシンプルなコンテンツサイトに記事を添付したい場合はどうでしょうか。このサイトでは、記事をHTML形式で保存した物理フォルダを用意して、ソースコードに直接添付しています。

しかし、単につながるだけでは不十分です初心者はこのように個別の記事を呼び出すことができます。

include '記事/' . $_GET['記事'] . '.html';

しかし、これは非常に危険なことです。攻撃者は記事名として ../ などを使って別のディレクトリへのリンクを渡すことができ、最後にヌルバイトを渡すことで末尾を消すことができることもあります。少なくとも basename() 関数は使うべきですが、ホワイトリストの値だけを許可するのがベターです。

関連性のないファイルを読み込むのはいかがなものか。

多くの場合、不正な(予期しない)ファイルを読み込むことは気にしません。実際に望んでいないページを要求するのはユーザーの責任ですが、それが問題になる状況もあるかもしれません。特に。

  • 一般人がアクセスできない、サーバーだけがアクセスできるファイルをユーザーが読み込む。
  • 他のPHPスクリプトを読み込むと、予期せぬ動作やエラーメッセージが発生し、サイトの動作に関するヒントが得られ、さらなる攻撃の手助けになるかもしれません。
  • 他のファイルを読み込むと、ドキュメントに追加されるだけでなく、実行されることもあります。

ホワイトリストと入力バリデーション

もし、何らかの安全な方法(例えばホワイトリストから)で入力を検証する能力がないのなら、ユーザーの正直さに頼らず、少なくともPHPレベルではとにかくスクリプトを防御すべきです。

まず重要なことは、読み込むファイルをすべて同じフォルダ(ディレクトリ)に置くことと、いくつかの危険な文字、特にスラッシュとドットを無効にすることです。これにより、潜在的な脆弱性を持つファイルを含む他のフォルダにアクセスすることができなくなります。また、危険な文字を入力文字列から削除することでも無効化することができる。

$load = '.../index'; // この入力は潜在的に危険である可能性がある
$load = strtr($load, './', ''); // 文字列からすべてのドットとスラッシュを削除します。
include $load .'.html';

ファイルを実行する?

注意すべきは、include 構造は、接続時にファイルをPHPコードと同じように実行するため、この可能性を許容することです。

しかし、多くの場合、その後に実行する必要のないファイルを添付し、文字列の形で保存されたテキスト(内容)だけに興味を持つことになる。したがって、ファイルを変数にロードして、文字列として扱うことができ、かなり安全です。

$load = '.../index'; // この入力は潜在的に危険である可能性がある
$load = strtr($load, './', ''); // 文字列からすべてのドットとスラッシュを削除します。
$file = file_get_contents($load . '.html'); // コンテンツを変数に読み込む
echo $file; // ファイルの内容をダンプする

このソリューションは、一見すると面白そうだし、安全そうだ--。ユーザーが何とかしてPHPファイルを呼び出したとしても、決して実行されることはありません。しかし、それを表示する可能性があり(そのソースコードを意味する)、その点には注意が必要である。

スクリプトから目的のファイルを認識する

これには決定的なガイドがあるわけではなく、誰もが脚本の必要性に応じて自分でやらなければならない。例えば、H1サイズの見出しがあることで、他のファイルから記事を判別しています。 ですから、見出しのないファイルを読み込んだ場合は、何も表示せず、エラーメッセージでページを終了させます。他のファイルにはない、欲しいファイルだけが持っている独自の特徴を見つけることが常に重要で、そこから出発することができるのです。

結論

ファイルの検証や読み込みは比較的簡単ですが、それでも多くの初心者が間違いを犯しますし、これからも犯し続けるでしょう。一番大事なのは、読み込む意味を正しく理解することと、欲しいコンテンツをどう見分けるかです。そして最も重要なことは、コンテンツを文字列として扱い、決してページに直接読み込まないことです。

Jan Barášek   Více o autorovi

Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.

Rád vám pomůžu:

Související články

1.
Status:
All systems normal.
2024