2009-06-11 6 views
2

私はファイルの戦術の多くを選択した場合
私はディレクトリ
トラバーサルのセキュリティの問題があるようになりますか?ファイルの戦術の多くは、ディレクトリトラバーサルのセキュリティ問題がありますか?

私は
とファイルの戦術の多くは

は、IDファイルをたくさん作り、 SCANDIRを使用することを意味します、ログインシステムを記述する必要があります。

ので、ディレクトリが

aaa.txt(内容はaaa_passある)
bbb.txt(内容はbbb_passある)
ccc.txt(内容はccc_passある)

、誰かが彼を入力する必要がありますid、
システムは、ディレクトリscandir
を見つけ、idファイルを見つけます。

ちょっと、彼が何を

"../../important.txt" と入力した場合?

彼は../../important.txtにアクセスできましたか?

答えて

2

一見したところ、ログインシステムを作成するにはちょっと変わったようです。私は、ファイルシステム上のディレクトリにあるプレーンテキストファイルが、他の理由がない場合には賢明な方法であると確信しています。異常であり、より一般的な認証で既に考えられている微妙な要素の多くを見落とす可能性があります。システム。たとえば、パスワードをハッシュ化して塩漬けにしておきたい場合は、そのスキームを実装する方法を考える必要があり、セキュリティ上の問題につながる間違いを犯す可能性があります。しかし、良いPEARライブラリや、Zend FrameworkのZend_Authコンポーネントを使っても、明確かつ十分に文書化された出発点となります。

とにかく、あなたの質問にあなたが説明する手配の理由があるとすれば、basename()関数はあなたがこの場合必要と思われるものです。あなたの質問に記述されているようにディレクトリトラバーサル攻撃を行うことができないように、ファイル名以外のすべてを削除します。

ユーザからの入力があるのであれば:

../../important

あなたは実行することができます。

$cleanUsername = basename($input); 
$filename  = '/path/to/password/files/' . $cleanUsername . '.txt'; 

if (file_exists($filename)) { 
    [...] 
} 

を意味してください?

+0

ah ....消毒する必要がありますか?それはファイル戦術の多くを測定ディレクトリトラバーサルセキュリティの問題を持っていますか? –

+0

ユーザの入力にbasename()を呼び出すと、他のディレクトリからファイルを読み取ることができなくなるので、消毒の度合いが必要です。ユーザー名がオペレーティングシステムのファイル名で安全な文字のサブセットに適合することを保証している限り、アルファベットは安全な賭けになります(必要に応じてアンダースコアを含む可能性があります)。入力を受け取り、basename()を渡してから、ファイルを繰り返して、一致するファイルが存在するかどうかを確認します。 –

1

あなたはパスの一部としてそれを使用する前に、ユーザー名の一部の検証を行うことができ - 例えばあなたが正規表現使用して、このような何かを行うことができる唯一の許可文字と数字に:

​​

別の方法をあなたはそれを行うことができ、あなたがそれを読み書きする前に、たとえば、ユーザ名をハッシュすることです:

$hash = sha1($username); 

この方法で、ユーザーは自分のユーザー名に何かを持つことができますし、あなたの行動を操作し、それらの危険は存在しませんファイル検索。ユーザー名が"../../important.txt"の場合は、"48fc9e70df592ccde3a0dc969ba159415c62658d"のハッシュ値が得られますが、ソース文字列が厄介であっても安全です。

+0

ああ、ハッシュ戦術は良いと思う! –

1

このファイル - パスワードシステムを使用する以外の選択肢がない場合(ある理由がある場合など)、難読化されたファイル名を作成するだけでなく、同じファイルを作成することもできます念のため、サーバーサイドの言語として拡張 - あなたがPHPを使用している場合たとえば、あなたのファイル名は(「ジョン」または難読化)john.phpだろう、と内容は次のようなものかもしれません:

<?php 
    exit; // or maybe even a header redirect -- 
    /*password goes here*/ 
?> 

もちろん、ファイル読み込みルーチンは、コメントブロック内のフレーズを解析する必要があります。

誰かが何らかの理由でそのファイルに到達した場合、この方法ではレンダリングされません。

関連する問題