1. はじめに
PHP は強力ですが、習得が比較的簡単なサーバーサイド スクリプト言語であり、経験の少ないプログラマでも、これを使用して複雑な動的 Web サイトを作成できます。しかし、インターネット サービスの機密性とセキュリティを実現するには多くの困難が伴います。この一連の記事では、Web 開発に必要なセキュリティの背景と、独自の Web アプリケーションを安全で一貫したセックスに保つための PHP 特有の知識とコード - を読者に紹介します。まず、サーバーのセキュリティ問題について簡単に説明します-では、共有ホスティング環境で個人情報にアクセスする方法、開発者を運用サーバーから遠ざける方法、最新のソフトウェアを維持する方法、暗号化されたチャネルを提供する方法、およびシステム アクセスへのアクセスを制御する方法を示します。
次に、PHPスクリプトの実装に蔓延する脆弱性について説明します。スクリプトをSQLインジェクションから保護し、クロスサイトスクリプティングとリモート実行を防止し、一時ファイルやセッションの「ハイジャック」を防止する方法について説明します。
前回の記事では、安全な Web アプリケーションを実装します。ユーザーの認証、アプリケーションの使用許可と追跡、データ損失の回避、リスクの高いシステム コマンドの安全な実行、web サービスの安全な使用方法を学びます。十分な PHPセキュリティ開発経験があるかどうかに関係なく、この一連の記事は、より安全なオンライン アプリケーションを構築するのに役立つ豊富な情報を提供します。
2. SQLインジェクションとは何ですか
データベースは利便性を目的として設計されているため、データベース内のデータにアクセスして操作するため、特定のデータをデータベースに保存する必要はありません。 。しかし、単にそうするだけでは、潜在的な災害につながる可能性があります。これは主に、あなた自身がデータベース内のすべてを誤って削除してしまう可能性があるためではありません。「無実」タスクを完了しようとしている間に、誰かによって「。ハイジャック」される可能性があるからです。 あなた自身のデータを彼自身の破壊的なデータに置き換えます。この置換を「注入」と呼びます。
実際、データベース クエリを構築するためにユーザーに入力を求めるたびに、そのユーザーがデータベース サーバーにアクセスするコマンドの構築に参加できるようになります。友好的なユーザーはそのような操作を実行できて満足するかもしれませんが、悪意のあるユーザーはコマンドを改変する方法を見つけようとし、その改変されたコマンドによってデータが削除されたり、さらにはより危険な動作を実行したりすることがあります。プログラマーとしてのあなたの仕事は、このような悪意のある攻撃を回避する方法を見つけることです。
3. SQLインジェクションの仕組み
データベースクエリの構築は非常に簡単なプロセスです。通常、これは次の方針に沿って実装されます。問題を説明するために、フィールド「variety」(つまりワインの種類)を持つワインデータベーステーブル「wines」があると仮定します:
1.フォームを提供します - ユーザーが特定のコンテンツを送信して検索できるようにします。ユーザーが検索タイプ「ラグレイン」でワインを選択したとします。
2.ユーザーの検索語を取得し、次のように変数に代入して-保存します:
$variety = $_POST['variety']; |
したがって、変数 $variety の値は次のようになります:
ラグレイン |
3.次に、この変数を使用して、WHERE句でデータベースクエリを作成します:
$query = "SELECT * FROM WHERE ワインの種類= ' $variety'"; |
したがって、変数 $query の値は次のようになります:
SELECT * FROM wines WHERE= 「ラグレイン」 |
4.クエリをMySQLサーバーに送信します。
5.MySQLは、フィールドvarietyの値が「lagrein」であるwinesテーブル内のすべてのレコード-を返します。
今では、これはおなじみの非常に簡単なプロセスになっているはずです。残念ながら、私たちが慣れ親しんでいるプロセスが、簡単に自己満足につながることがあります。次に、作成したクエリを再分析してみましょう。
1.作成するこのクエリの固定部分は、変数値の始まりを説明するために使用する一重引用符で終わります:
$query = " SELECT * FROM wines WHEREvariation = '"; |
2.ユーザー送信を含む変数の値を持つ元の固定部分を使用します:
$query .= $variety; |
3.次に、別の一重引用符を使用してこの結果 - を連結し、変数値の終わりを記述します:
$ query = "' ";
|
の値は次のとおりです:
SELECT * FROM wines WHEREvariation = 'lagrein'
|
lagrein' または1=1; |
ここで、以前に修正した部分を使用してクエリの構築を続けます(ここでは、$query変数、の結果の値のみを示します):
SELECT * FROM wines WHEREvariation = ' |
次に、ユーザー入力 (ここでは太字) を含む変数の値を使用してそれに接続します。 :
SELECT * FROM wines WHEREvariation = 'lagrein' or 1=1; |
最後に、次の引用符を追加します:
選択 * FROM ワイン WHERE 品種 = 'ラグレイン' または 1=1;' |
1