ホームページ  >  記事  >  バックエンド開発  >  Web 上の脆弱性、原理分析、防止方法についての簡単な説明_PHP チュートリアル

Web 上の脆弱性、原理分析、防止方法についての簡単な説明_PHP チュートリアル

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

1. ファイルの種類を検出し、ユーザーのファイル名で保存します

コードは以下のように表示されます。 if(isset($_FILES['img'])) { $file = save_file($_FILES['img']); if($file===false) exit('保存に失敗しました!'); ​ echo "保存に成功しました!",$file; } 関数チェックファイル($img) { ///ファイルを読み込む if($img['error']>0) false を返します。 ​ $tmpfile = $img['tmp_name']; $ファイル名 = $img['名前']; ​ ​ ///ファイル拡張子を読み取る $len=strrpos($ファイル名,"."); if($len===false) は false を返します。 ​ //拡張子を取得 $ext = strto lower(substr($filename,$len+1)); if(!in_array($ext,array('jpg','jpeg','png'))) false を返します。 true を返します。 } 関数保存ファイル($img) { if(!check_file($img)) は false を返します。 ​ //フォーマット検出OK、データ移動の準備 $ファイル名 = $img['名前']; $newfile = "アップロード/" .$ファイル名; if(!move_uploaded_file($img["tmp_name"],$newfile)) false を返します。 ​ $newfile を返します。 } ?> ​ 上記のコードは入力の種類も決定しており、読み取っても問題ありません。しかし、問題はまさに、取得したユーザー名変数の検出に現れます。受信したユーザー名を直接取得し、ファイルとして保存します。 友人の中には、「これらのファイル名はすべて私のコンピュータに存在しており、ファイル名の形式はオペレーティング システムのファイル名定義によって制限されている」と言う人もいます。 ただし、$_FILES で取得される変数は http リクエストから直接取得されることに注意してください。他の get 変数や post 変数を取得する場合と同じです。 したがって、下心のある人がブラウザを自分でシミュレートし、特別なファイル名をサーバーに送信することがよくあります。その後、ファイルを保存するときに、通常どおり独自の形式で保存できます。 ​ 数年前までは、文字列に「」を含めてファイルとして保存すると、以下の内容が自動的に切り詰められてしまいました。 例: $filename は「a.php.jpg」という構造になっています。考えてみましょう。どうなるでしょうか? $newfile = “upload/a.php.jpg” 拡張子検証のため、右端の「.」に続く文字は許容される画像形式である jpg であるためです。 ただし、一度そのファイル名で保存します。 ディスクはアップロード ディレクトリの下に .php を生成し、後続の文字はすべて自動的に切り詰められることがわかります。 ​ この脆弱性は大流行しました。当時、ほとんどのホスティング Web サイトには抜け穴がありました。しばらくの間、多くのプラットフォームが預金を閉鎖しました。実はこれが根本的な理由なのです。ファイル名を取得し、それを最終的に生成されたファイル名として保存しました。 良い方法は、ファイル名をランダムに生成し、拡張子を自分で読み取ることです。これにより、ファイルの保存時に破棄または切り捨てられる特殊文字の入力を防ぐことができます。 ​ この脆弱性は php4 時代に悪用される可能性があり、php5 時代では、生成される変数ファイル名の値から「」が自動的に除外されるため、ユーザーがどのような特別なユーザー名を作成しても切り詰められます。 ただし、現在、この種の脆弱性は asp、jsp、およびその他のサイトに存在します。今でも頻繁に登場します。古いバージョンの PHP サイトも頻繁に表示されます。 ​

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/372244.html技術記事 1. 次のようにファイル タイプを検出し、ユーザーが保存したファイル名でファイル名を保存します。 if(isset($_FILES['img'])){$file = save_file($_FILES['img']);if( $file= ==false) exit('アップロードに失敗しました!');ech...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。