ホームページ >バックエンド開発 >PHPチュートリアル >Web上の脆弱性とその原理分析と防止方法(ファイル名検出の脆弱性)_PHPチュートリアル

Web上の脆弱性とその原理分析と防止方法(ファイル名検出の脆弱性)_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-20 11:16:47884ブラウズ

前回の記事: から、バックエンドがサーバー変数を取得し、その多くはクライアントから渡されることがわかりました。通常の get および post と変わりません。一般的な脆弱なコードを見てみましょう。
1. ファイルの種類を検出し、ユーザーのファイル名で保存します

コードをコピー コードは次のとおりです。
if(isset($_FILES['img']))
{
$file = save_file($_FILES['img']);
if($file===false) exit('保存に失敗しました!');

echo "正常に保存されました!",$file;
}
関数 check_file($img)
{
///ファイルを読み込みます
if($img['error']>0) return false;

$tmpfile = $img['tmp_name'];
$filename = $img['name'];


///ファイル拡張子を読み取る
$len=strrpos($filename,".");
if($len===false) false を返します;

// 拡張機能を取得
$ext = strto lower(substr($filename,$len+1));
if(!in_array($ext,array('jpg','jpeg','png'))) return false;
true を返します;
}
関数 save_file($img)
{
if(!check_file($img)) false を返します;

//フォーマット検出OK、データ移動の準備
$filename = $img['name'];
$newfile = "アップロード/" .$ファイル名;
if(!move_uploaded_file($img["tmp_name"],$newfile)) return false;

$newfile を返します;
}
?>


上記のコードでは入力の種類も判定されており問題ありません。しかし、問題はまさに、取得したユーザー名変数の検出に現れます。受信したユーザー名を直接取得し、ファイルとして保存します。 友人の中には、「これらのファイル名はすべて私のコンピュータに存在しており、ファイル名の形式はオペレーティング システムのファイル名定義によって制限されている」と言う人もいます。 ただし、$_FILES で取得される変数は http リクエストから直接取得されることに注意してください。他の get 変数や post 変数を取得する場合と同じです。 したがって、下心のある人がブラウザを自分でシミュレートし、特別なファイル名をサーバーに送信することがよくあります。その後、ファイルを保存するときに、通常どおり独自の形式で保存できます。

数年前までは、文字列に「」を含めてファイルとして保存すると、以下の内容が自動的に切り詰められてしまいました。 例: $filename は「a.php.jpg」という構造になっています。考えてみましょう。どうなるでしょうか?
$newfile = “upload/a.php.jpg” 拡張子検証のため、右端の「.」に続く文字は許容される画像形式である jpg であるためです。 ただし、そのファイル名で保存するとすぐに。 ディスクはアップロード ディレクトリの下に .php を生成し、後続の文字はすべて自動的に切り詰められることがわかります。

この脆弱性は大流行しました。当時、ほとんどのホスティング Web サイトには抜け穴がありました。しばらくの間、多くのプラットフォームが預金を閉鎖しました。実はこれが根本的な理由なのです。ファイル名を取得し、それを最終的に生成されたファイル名として保存しました。 良い方法は、ファイル名をランダムに生成し、拡張子を自分で読み取ることです。これにより、ファイルの保存時に破棄または切り捨てられる特殊文字の入力を防ぐことができます。

この脆弱性は php4 時代に悪用される可能性があり、php5 時代では、生成される変数ファイル名の値から「」が自動的に除外されるため、ユーザーがどのような特別なユーザー名を作成しても切り詰められます。 ただし、現在、この種の脆弱性は asp、jsp、およびその他のサイトに存在します。今でも頻繁に登場します。古いバージョンの PHP サイトも頻繁に表示されます。
さて、今日はここで終わりにしましょう。他にも 2 つの一般的な方法がありますが、それについては後ほど説明します。コミュニケーションへようこそ!

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/372330.html技術記事前回の記事: Web 上の脆弱性、その原理の分析、および防止方法 (安全なファイルを保存する方法) から、バックエンドがサーバー変数を取得し、その多くがクライアントから渡されることがすでにわかっています。いつもと同じ...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。