あなたのコードは基本的に無実です。唯一の「明らかな」攻撃は、データをサーバーに繰り返しアップロードし、最終的にディスク容量を使い果たすことです。
「消毒」は状況に応じたものです。食べ物に塩をかけるように、コードにふりかけて改善できるものではありません。おそらく、SQL インジェクション攻撃を防ぐために $_POST データをサニタイズしますが、そのデータを HTML コンテキストで使用すると、XSS 攻撃に対して脆弱になります。おそらくそれは画像のアップロードであり、基本的な MIME タイプの決定を行って、それが画像であることを確認します。それはすべて問題なくダンディーですが、誰かが児童ポルノをアップロードすると、「それは画像か」のテストに合格し、さらに大きな問題が発生します。
ユーザーデータを受け入れてファイルに書き出すので、システムを悪用するためにこのコードでできることは何もありません (ディスク容量の問題を除く)。PHP または基盤となる OS がそのデータのディスクへの書き込みを突然停止して実行を開始するようなデータ シーケンスをデータに埋め込むことはできません。データがアップロードされているかどうかは問題ではありません。スクリプトの実行に影響を与えるために使用される可能性のあるコンテキストで使用されることはないためです。Web サーバーからデータを吸い込んで、ディスクに吐き出すだけです。ユーザーがどのファイルに書き込まれるかに影響を与えることを許可していません(ユーザーがサーバーへのシェルレベルのアクセス権を持っていて、たとえば、他のより重要なファイルを指す「log.txt」というシンボリックリンクを作成できる場合を除く)。
本当の問題は後で発生します...このファイルを書き込んだ後、このファイルをどうしますか? 後のコードがばかげたようなことをする場合
include('log.txt');
次に、問題が発生します。ディスク上のファイルにあるこの「無害な」データを取得し、実行可能なコードに変換しました。<?php exec('rm -rf /') ?>
サーバーをゴミ箱に入れるには、そのファイルのどこにでも簡単にアクセスできます。
同様に、PHP のmagic_quotes
. PHP 開発者 ( WRONGLYとSTUPIDLY ) は、外部から送信されたデータは SQL コンテキストでのみ使用されると想定し、最終的な目的に関係なく、すべてのデータに対して SQL エスケープを行いました。さらに悪いことに、彼らは単純に、すべてのデータベースがエスケープ シーケンスにバックスラッシュを使用していると想定していました。MySQL 以外をまったく使用しないのであれば、それで問題ありませんが、たとえば SQL Server を使用している場合はどうでしょうか。Miles O\'Brien
次に、PHP が提供するを に変換する必要がありMiles O''Brien
ます。基本的に、PHP が自動的に行ったことを元に戻す必要があります。
TL;DR: ショットガンの「サニタイズ」メソッドを使用しないでください。ほとんどの場合、役に立たない/無意味であり、前と後の作業が増えるだけです。データを使用しているときに、コンテキスト固有のメソッドを使用するだけです。