Web 開発を行う場合、コードレビューを行うことが多く、抜け穴が頻繁に現れるいくつかのコア機能やロジックをランダムにチェックします。技術チームが成長するにつれて、チームメンバーのスキルはますます成熟していきます。 一般的な愚者型 SQL インジェクションの脆弱性と XSS の脆弱性。今後もその数はどんどん減っていきますが、時折現れる新たな隠れた脆弱性も見つかるでしょう。これらの脆弱性のほとんどは、開発者の機能または共通モジュール機能の設計が不十分なために発生し、問題が残されたままになります。以前は、いくつかの機能モジュールを完了することができましたが、現在では、安全かつ正しい方法でモジュールを完了することが要件となります。 次に、設計上の理由により脆弱性を引き起こす一般的な機能モジュールをいくつか紹介します。次に、まずファイル読み取り機能の脆弱性を見てみましょう。
まず、ユーザーを使用して異なるディレクトリを入力し、異なるファイルを含める次のコード部分を見てみましょう
リーリー
このコードは、多くの友人が作成したプログラムで遭遇したことがあるかもしれませんが、初心者にとっては、そのような問題が発生しやすいことを覚えておいてください、私がウォークスルー中にこのコードに遭遇したとき、私は、のセキュリティの観点から何ができるかを尋ねました。このコードは?
回答: 1. 「..」ディレクトリが置き換えられるため、ユーザーによって渡されたモジュール名内のすべての .. ディレクトリが置き換えられます。
拼 2. ステッチのファイル名を構築すると、前のディレクトリに制限があり、拡張名にも制限があり、ファイルも含めてディレクトリに制限されます
$mod 入力 ?mod=…%2F…%2F…%2F…%2Fetc%2Fpasswd%00 を構築すると、結果は次のようになります:
実際には include("/etc/passwd") ファイルです。
まず第一に: ユーザー入力を制限するためにパラメータ フィルタリング タイプを使用するのは良い方法ではありません: テストできる場合は、置き換えないでください テストに失敗する限り、直接渡してください!これは私たちの原則の 1 つです。フィルタリングの失敗は無数にあります。実際のプロセスを見てみましょう。
1.「…/…/…/」を「..」に置き換えて入力します2. 結果は「../../../」となり、こうなります
友達の中には、スペースに置き換えた方が良いのではないかと尋ねる人もいます。確かにこれで代用可能です。ただし、将来的にすべてをスペースに置き換えることができるという意味ではありません。別の例を見てみましょう。例: 誰かが文字列内の JavaScript を置き換えました。コードは次のとおりです:
……
$msg = str_replace("javascript","",$msg);
JavaScriptが表示されなくなるようですが、置換するために jjavascriptavascript と入力すると、真ん中が空になったときに置換してくれます。先頭の「j」と次の「j」は新しい JavaScript を形成します。
2 番目: その背後にある .php の制限を回避する方法を見てみましょう。ユーザーが入力したパラメータは「etc/passwd」です。この文字は非常に特殊です。変数を出力すると、ファイル名は「...etc/passwd.php」になります。 。ただし、ファイルの読み書き操作メソッドにセクションを挿入した場合、後で自動的に切り詰められます。オペレーティング システムは etc/passwd ファイルのみを読み取ります。 「」は、すべてのファイル システムの読み取りおよび書き込みファイル変数に表示されます。も同様に扱われます。この C 言語は、文字列としての完全なマークアップに関連しています。
上記の分析を通じて、ファイルタイプの操作を行う場合、注意しないと大きな抜け穴が発生することが誰でもわかりました。そして、この脆弱性は一連のセキュリティ問題を引き起こす可能性があります。
変数にホワイトリスト制限を作成します。
例:
$mod = isset($_GET['m'])?trim($_GET['m']):'index'; ///モジュール名を読み取った後
mod 変数の値の範囲 (列挙型の場合):
if(!in_array($mod,array('user','index','add','edit'))) exit('err!!!');
$mod は完全に制限されており、この配列内にのみ存在できます。それは残酷です! ! ! !
今の例を通して、それが列挙型の場合は値をリストに直接入力するだけであることがわかりました。ただし、これは十分に便利ではない場合があります。ホワイトリストによる別の制限方法もあります。 文字範囲を制限するだけです
例:
$mod = isset($_GET['m'])?trim($_GET['m']):'index'; ///モジュール名を読み取った後
$mod がディレクトリ名であることだけはわかります。一般的なサイトの場合、それは文字と数字とアンダースコアです。
if(!preg_match(“/^w+$/”,$mod)) exit(‘err!!!’);
使用できる文字は [A-Za-z0-9_] のみです。 冷酷すぎる! ! !
概要: ホワイトリスト制限方法は実際には非常に簡単に実行できることがわかりましたか?その場所で何が必要かがわかっている場合は、入力が必要なものを確認するだけです。さらに、未知の文字を置き換えるよりも、すでに知っている文字を検出する方がはるかに簡単です。 問題を解決する正しい方法により、ファイルがよりシンプルかつ安全になります。 !コミュニケーションへようこそ!