ホームページ >バックエンド開発 >PHPチュートリアル >Web ファイル操作の解析における一般的なセキュリティの脆弱性 (ディレクトリおよびファイル名の検出の脆弱性)_PHP チュートリアル
Web 開発を行うとき、抜け穴が頻繁に現れるいくつかのコア機能やロジックをランダムにチェックすることがよくあります。技術チームが成長するにつれて、チームメンバーのスキルはますます成熟していきます。 一般的な愚者型 SQL インジェクションの脆弱性と XSS の脆弱性。今後もその数はどんどん減っていきますが、時折現れる新たな隠れた脆弱性も見つかるでしょう。これらの脆弱性のほとんどは、開発者の機能または共通モジュール機能の設計が不十分なために発生し、問題が残されたままになります。以前は、いくつかの機能モジュールを完了することができましたが、現在では、安全かつ正しい方法でモジュールを完了することが要件となります。 次に、設計上の理由により脆弱性を引き起こす一般的な機能モジュールをいくつか紹介します。次に、まずファイル読み取り機能の脆弱性を見てみましょう。
まず次のコードを見てみましょう。これには、ユーザーが入力したさまざまなディレクトリにさまざまなファイルが含まれています
$mod 入力 ?mod=…%2F…%2F…%2F…%2Fetc%2Fpasswd%00 を構築すると、結果は次のようになります:
実際には include("/etc/passwd") ファイルです。
どうやって私のパラメータ制限を回避しましたか?
まず第一に: ユーザー入力を制限するためにパラメーター フィルター タイプを使用するのは良い方法ではありません。テストできる場合は、テストに失敗する限り、置き換えないでください。それ!これは私たちの原則の 1 つです。フィルタリングの失敗は無数にあります。実際のプロセスを見てみましょう。
1.「..」を「.」に置き換えて「…/…/…/」と入力します
2.結果は「../../../」になります
はい、友達が尋ねます、直接スペースに置き換えた方が良いでしょうか?確かにこれで代用可能です。ただし、将来的にすべてをスペースに置き換えることができるという意味ではありません。別の例を見てみましょう。例: 誰かが文字列内の JavaScript を置き換えました。コードは次のとおりです:
コードは次のとおりです:
例:
$mod = isset($_GET['m'])?trim($_GET['m']):'index'; ///モジュール名を読み取った後、
mod 変数の値の範囲 ifこれは列挙型の場合:
if(!in_array($mod,array('user','index','add','edit'))) exit('err!!!');
完全修飾$ mod はこの配列にしか入れられないので、とても残酷です。 ! ! !
2. ホワイトリスト制限を実装する方法
先ほどの例を通して、列挙型の場合は値をリストに直接入力するだけであることがわかりました。ホワイトリストによる別の制限方法もあります。文字範囲を制限するためです