1. はじめに 問題の存在
コード レベル、つまりアプリケーション レベルで (つまり、基礎となる言語自体の脆弱性を考慮せずに) コード セキュリティを考慮すると、スクリプトのセキュリティの問題は関数と変数に関するものになります。変数は、直接的または間接的にユーザーから安全でない入力を受け取ります。PHP 自体の特性により、この種の変数の混乱は PHP で発生しやすくなります (多くの PHP プログラムは、変数の定義、初期化、受け取りに使用されますが、これらの変数は変数の定義、初期化、受け取りに使用されます)。 $id などの変数の初期化は PHP の設定によって完全に完了します。注意しないと変数が混乱して攻撃につながる可能性があります。
変数が安全でない入力を受け取り、適切なフィルタリングなしでさまざまな場所で使用されると、さまざまな害を引き起こす可能性があります。データベースに直接入力してユーザーに表示すると、クロスサイト スクリプティング攻撃につながる可能性があります。SQL ステートメントで使用すると、SQL インジェクション攻撃につながる可能性があります。さまざまなスクリプト言語がすべて存在する可能性があります。 PHP 変数は非常に柔軟であるため、これらの有害な変数が一部の論理ステートメントで使用されると、認証失敗などの重要なコードのスキップや一部の変数の初期化のスキップが発生し、プログラム ロジックの混乱やその他の脆弱性が発生します。この変数が include などの危険な関数で使用された場合、fopen 関数で使用された場合はファイル インクルードの脆弱性が発生し、mysql_query 関数で使用された場合はファイル書き込みの脆弱性が発生する可能性があります。 SQL インジェクションの脆弱性、eval および preg_replace はコードの実行につながる可能性があり、htmlspecia 関数に出現するとエラーが発生する可能性があり、絶対パス リーク変数が出現する環境によってその可能性のある害が決まります。
問題の存在を考えると、この種の脆弱性をコードレベルから確認するにはどうすればよいでしょうか?もちろん、PHP 言語に慣れることが最も基本的なことです。また、危険な関数に変数がある場合は、その変数のソース、正しく初期化されているか、機密文字が使用できるかどうかを把握する必要があります。初期化後にこれらの機密文字が関数に入る前に完全に消去されているかどうか。コードレビュー作業の難しさは、変数のソースを特定することにある可能性があります。これには、PHP の機能とレビューしているコードに精通している必要がありますが、変数のすべてのソースが明確に表示されるわけではなく、一部の初期化コードは、実行したときほど明確ではない場合があります。想像力を働かせて実行してください。変数内の一部は、取得したくない場所から取得されている可能性があります。また、一部の変数は、データベースまたはシステム構成ファイルから取得されている可能性がありますが、データベースと構成ファイルには、または、これらの変数は後で安全に操作されず、信頼できません。次にスクリプトコードの安全性を変数と関数の考え方に従って考えていきます。
2 変数はどこから来たのでしょうか?
1 表示される入力
変数の由来を呼び出すということは、実際に脅威がどこから来るかを意味します。Web からだけ考えると、どのような Web サイトが最も安全でしょうか。明らかに、静的な HTML ページのみを提供する Web サイトが最も安全です。そのような Web サイトは、密閉された銀行を強盗するようなものですが、大規模なフォーラムやスクリプトの場合は実現が困難です。ログインするときは、ユーザー名やパスワードなどの変数をサーバーに渡す必要があります。これは、サーバーとの対話をキャプチャするプロセスによってもたらされます。投稿を投稿すると、プログラムによってキャプチャされます。送信されたフォームやアドレス バーのパラメータなど、ブラウザとサーバー間のデータ送信が表示される可能性がありますが、表示できないものは次のとおりです。 Cookie と HTTP ヘッダーは送信されたデータ、つまり変数です。これらの場所は、サーバーがデータを処理するための本来の入り口でもあります。では、PHP プログラムはどのようにして変数を受け入れるのでしょうか?送信されたすべての変数は、
$_GET
$_POST
$_COOKIE
$_FILES
$_SERVER を含む、php によっていくつかの配列に保存されます
初期の利便性と柔軟性のために、php 設定にそのようなオプションがあります
register_globals
このオプションがオンの場合, 上記で出てくる変数は$GLOBALSのメンバーとなり、スクリプト内で取得しなくても直接利用できるようになり、
variables_order
の順に上書きされます。多くのプログラムは register_globals がオフであるとみなしているため、プログラムの初期化時に次のコードを使用します。
@extract(daddslashes($_GET)); これらのコードは register_globals の役割を果たします。 POSTやGETの内容をグローバル変数として解放する機能ですが、後述するように危険性の方が大きい可能性があります。
現在のページ 1/3 123次のページ
上記は、マーク バイ マーク ジェイコブス公式ウェブサイト_PHP+MYSQL ページ 1/3 のスクリプト セキュリティの本質を紹介しています。マーク バイ マーク ジェイコブス公式ウェブサイトの内容も含めて、PHP チュートリアルに興味のある友人の参考になれば幸いです。