7

ポイントを説明するための非常に簡単な例:

$message = $_POST['message'];

$fp = fopen("log.txt", "a");
fwrite($fp, $message);

fclose($fp);

$_POST['message']変数のユーザー入力をサニタイズする必要がありますか?

準備されたステートメント (データベースのサニタイズ用) とhtmlentities(ある時点でメッセージを画面に出力していた場合) は理解しPOSTていますが、この場合、入力は単純にログ ファイルに保存され、小さな PHP スクリプトによって読み取られます ( via fopen())

答えは読み方次第ですか?たとえば、fopen() を介してログ ファイルを開く場合、ログ ファイルhtmlentitiesをダウンロードして Excel で読み取る (フィルタリングの目的で) 場合、何もする必要はありません。

4

6 に答える 6

7

あなたのコードは基本的に無実です。唯一の「明らかな」攻撃は、データをサーバーに繰り返しアップロードし、最終的にディスク容量を使い果たすことです。

「消毒」は状況に応じたものです。食べ物に塩をかけるように、コードにふりかけて改善できるものではありません。おそらく、SQL インジェクション攻撃を防ぐために $_POST データをサニタイズしますが、そのデータを HTML コンテキストで使用すると、XSS 攻撃に対して脆弱になります。おそらくそれは画像のアップロードであり、基本的な MIME タイプの決定を行って、それが画像であることを確認します。それはすべて問題なくダンディーですが、誰かが児童ポルノをアップロードすると、「それは画像か」のテストに合格し、さらに大きな問題が発生します。

ユーザーデータを受け入れてファイルに書き出すので、システムを悪用するためにこのコードでできることは何もありません (ディスク容量の問題を除く)。PHP または基盤となる OS がそのデータのディスクへの書き込みを突然停止して実行を開始するようなデータ シーケンスをデータに埋め込むことはできません。データがアップロードされているかどうかは問題ではありません。スクリプトの実行に影響を与えるために使用される可能性のあるコンテキストで使用されることはないためです。Web サーバーからデータを吸い込んで、ディスクに吐き出すだけです。ユーザーがどのファイルに書き込まれるかに影響を与えることを許可していません(ユーザーがサーバーへのシェルレベルのアクセス権を持っていて、たとえば、他のより重要なファイルを指す「log.txt」というシンボリックリンクを作成できる場合を除く)。

本当の問題は後で発生します...このファイルを書き込んだ後、このファイルをどうしますか? 後のコードがばかげたようなことをする場合

include('log.txt');

次に、問題が発生します。ディスク上のファイルにあるこの「無害な」データを取得し、実行可能なコードに変換しました。<?php exec('rm -rf /') ?>サーバーをゴミ箱に入れるには、そのファイルのどこにでも簡単にアクセスできます。

同様に、PHP のmagic_quotes. PHP 開発者 ( WRONGLYSTUPIDLY ) は、外部から送信されたデータは SQL コンテキストでのみ使用されると想定し、最終的な目的に関係なく、すべてのデータに対して SQL エスケープを行いました。さらに悪いことに、彼らは単純に、すべてのデータベースがエスケープ シーケンスにバックスラッシュを使用していると想定していました。MySQL 以外をまったく使用しないのであれば、それで問題ありませんが、たとえば SQL Server を使用している場合はどうでしょうか。Miles O\'Brien次に、PHP が提供するを に変換する必要がありMiles O''Brienます。基本的に、PHP が自動的に行ったことを元に戻す必要があります。

TL;DR: ショットガンの「サニタイズ」メソッドを使用しないでください。ほとんどの場合、役に立たない/無意味であり、前と後の作業が増えるだけです。データを使用しているときに、コンテキスト固有のメソッドを使用するだけです。

于 2013-08-27T14:29:14.987 に答える
3

ユーザー入力をサニタイズする必要がありますが、どのように入力が何のためにあるかに完全に依存しています。「サニタイズ」とは、特定の用途に対して入力が安全または正常であることを確認するという考えを指します。ユースケースを決定するまで、この用語をより具体的にすることはできません。

fopen()のようなPHPの読み取り/書き込み関数について心配する必要はありません。入力を実際に解析または分析するステップに注意してください。いくつかの可能な例:

  • ファイルが基本的なログリーダーに表示される場合は、各入力が特定の長さに制限され、改行や選択したフィールド区切り文字が含まれておらず、各行の先頭が有効な時間であることを確認する必要があります。スタンプ。
  • ファイルがWebブラウザーに表示される場合は、入力にスクリプトや他のリソース(IMGタグなど)へのリンクが含まれていないことを確認する必要がある場合があります。
  • Excelファイルには、行の長さ、タイムスタンプ、および区切り文字に関して同様の懸念があります。Excelがファイルをテキストとして解析する限り、実行可能コードを含む誰かについて心配する必要はありません。(また、最新のExcelバージョンでは、マクロを実行する前に、含まれているマクロに関する警告が表示されます。)
于 2013-01-28T18:12:07.513 に答える
0

PHP の fwrite() 関数に関しては、サニタイズする必要はありません。fwrite() は、渡されたファイルにそれを書き込むだけです。

ログファイルに関しては、サニタイズすることをお勧めします。理由は次のとおりです。

攻撃者が複数行の値をメッセージとして投稿したとします。ログが投稿の前にあった場合

line 1
line 2

それからそれは投稿の後です

line 1 
line 2
line 3
remainder of line 3
very remainder of line 3

攻撃者がこれを投稿したため:

line 3\nremainder of line 3\nvery remainder of line 3

注: 1 回の投稿と 3 行の追加。

つまり、投稿されたデータをどのようにサニタイズする必要があるかは、アプリケーションによって完全に異なります。

于 2013-08-31T01:36:30.910 に答える
0

私はそれを消毒します。ログに関しては、予約済みのスペースに入れるようにしてください。たとえば、ログが 1 行に 1 レコードの場合、ユーザーの入力から新しい行やその他のものを取り除いて、だまされないようにします。

ログ インジェクションという名前の攻撃を見てみましょう

また、ログ ファイルを表示する際にも十分に注意してください。出力が読者に害を及ぼす可能性がないことを確認してください。

于 2013-08-27T16:22:48.183 に答える
0
  • 現在のディレクトリのファイルに追加します-これはブラウザ経由でダウンロードできるように見えるため、セキュリティホールを作成しています. ファイルをドキュメント ルートの外に配置するか (最適)、.htaccess で保護します。
  • すべてのユーザー入力をサニタイズする必要があります。いつも。これが何を意味するかは、このデータをどのように使用するかによって異なります。テキストログファイルに書き込むように見えるので、印刷可能で空白クラスの文字のみを通過させたいと思うでしょう。防御的にサニタイズします。悪い文字コードを指定して他のすべてを通過させないでください。ただし、「良い」文字のリスト/クラスを定義し、これらの良い文字だけを通過させます。
  • ユース ケースによっては、ログ ファイルを flock() して、複数の並列リクエストがファイル内で混同されるのを防ぐことができます。

    $logtext = sanitizeLog($_POST[Message']); $fd = fopen( "/path/to/log.txt", "a"); if(群れ($fd, LOCK_EX)) { fseek($fd, 0, SEEK_END); fwrite($fd, $logtext); 群れ($fd, LOCK_UN); } fclose($fd);

fopen() の結果のチェックを省略しました...

于 2013-08-30T11:49:11.353 に答える