$_SERVER['PHP_SELF'] を使用して php ファイルの名前を取得するために $_SERVER 変数配列の内容を信頼することで、大きなセキュリティ リスクを負うことになりますか?
4 に答える
すべてではありませんが、多くの $_SERVER 変数が攻撃者によって制御されています。たとえば、asは危険な変数であり、多くの場合 xss のソースである場合$_SERVER['SCRIPT_NAME']
は安全です。$_SEVER['PHP_SELF']
<?php
echo $_SEVER['PHP_SELF'];
?>
概念実証:
http://localhost/self.php/<script>alert(/xss/)</script>
phpinfoを見ると、この脆弱性が動作していることを簡単に確認できます。
この変数を保護するための特別なメカニズムはありません。他の変数と同じように、これに書き込むことができます。そのため、他の変数と同様に改ざんから保護する必要があります (register_globals を無効にする、変数変数を避けるなど)。それなら信用できる。
確実な回避策として、プログラムの早い段階で独自の定数を定義できます。
define('SCRIPT_FILENAME',$_SERVER['SCRIPT_FILENAME']);
利用可能な場合は定義済みの定数を使用します__FILE__
。
php.netマニュアルから:
この配列のエントリは、Web サーバーによって作成されます。すべての Web サーバーがこれらのいずれかを提供するという保証はありません。サーバーは、一部を省略したり、ここにリストされていないものを提供したりする場合があります。
したがって、サーバー構成を変更するためのアクセス権を持つすべてのユーザー (および変数の内容を変更する可能性のあるセッション内のすべてのスクリプト) を認識していれば、$_SERVER
変数のデータを合理的に確信できます。
ユーザーからのデータを使用しない限り、これは実際にはまったく危険ではありません。つまり、次のいずれかを使用します。
echo __FILE__;
// is the same as
echo $_SERVER["SCRIPT_FILENAME"];
echo $_SERVER["SCRIPT_NAME"];
// SCRIPT_NAME contains just the path