ホームページ バックエンド開発 PHPチュートリアル PHP_PHP チュートリアルにおける SQL インジェクション攻撃の包括的な防止の分析概要

PHP_PHP チュートリアルにおける SQL インジェクション攻撃の包括的な防止の分析概要

Jul 21, 2016 pm 03:21 PM
php sql 1つ 包括的な 分析する 強さ 導入 強力な 攻撃 はい 注射 防ぐ

1. はじめに

PHP は強力ですが、習得が比較的簡単なサーバーサイド スクリプト言語であり、経験の浅いプログラマでも、これを使用して複雑で動的な Web サイトを作成できます。しかし、インターネット サービスの機密性とセキュリティを実現するには多くの困難が伴います。この一連の記事では、Web 開発に必要なセキュリティの背景と、PHP 固有の知識とコードを読者に紹介します。これを使用して、独自の Web アプリケーションのセキュリティと一貫性を保護できます。まず、サーバーのセキュリティの問題について簡単に説明します。共有ホスティング環境で個人情報にアクセスする方法、開発者を運用サーバーから遠ざける方法、最新のソフトウェアを維持する方法、暗号化されたチャネルを提供する方法、およびシステムへのアクセスを制御する方法を示します。

次に、PHP スクリプト実装の一般的な脆弱性について説明します。 SQL インジェクションからスクリプトを保護し、クロスサイト スクリプティングとリモート実行を防止し、一時ファイルとセッションの「ハイジャック」を防止する方法について説明します。

前回の記事では、安全なWebアプリケーションを実装します。ユーザーの認証、アプリケーションの使用許可と追跡、データ損失の回避、リスクの高いシステム コマンドの安全な実行、Web サービスの安全な使用方法を学びます。 PHP セキュリティ開発の十分な経験があるかどうかに関係なく、このシリーズの記事は、より安全なオンライン アプリケーションを構築するのに役立つ豊富な情報を提供します。

2. SQL インジェクションとは

特定のデータを決して使用しない予定がある場合、データベースはデータベースへのアクセスと操作を容易にするように設計されているため、データベースに保存する意味はありません。しかし、単にそうするだけでは、潜在的な災害につながる可能性があります。これは主に、あなた自身がデータベース内のすべてを誤って削除してしまう可能性があるためではありません。それは、あなたが何らかの「無害な」タスクを完了しようとしている間に、あなた自身が破壊的なデータを使用してあなたのデータを置き換える可能性があるためです。自分のデータ。この置換を「注入」と呼びます。

実際、データベース クエリを構築するためにユーザーに入力を求めるたびに、そのユーザーがデータベース サーバーにアクセスするコマンドの構築に参加できるようになります。友好的なユーザーはそのような操作を実装することに満足するかもしれませんが、悪意のあるユーザーはコマンドを改変する方法を見つけようとし、その改変されたコマンドによってデータが削除されたり、さらにはより危険な動作を実行したりすることがあります。プログラマーとしてのあなたの仕事は、このような悪意のある攻撃を回避する方法を見つけることです。

3. SQL インジェクションの仕組み

データベース クエリの構築は非常に簡単なプロセスです。通常、これは次の方針に沿って実装されます。問題を説明するために、フィールド「品種」(つまりワインの種類) を持つワインデータベーステーブル「ワイン」があると仮定します。

1. フォームを提供する - ユーザーが検索するものを送信できるようにします。ユーザーがタイプ「ラグレイン」のワインを検索することを選択したと仮定します。

2. ユーザーの検索語を取得して保存します - 次のように変数に割り当てます:

コードスニペットは次のとおりです:

$variety = $_POST['variety']

したがって、 の値は変数 $variety は現在:

lagrein

3. 次に、この変数を使用して WHERE 句でデータベース クエリを構築します:

以下はコード スニペットです:

$query = "SELECT * FROM wines WHEREvarie= '$variety'";

変数 $query の値は次のようになります:

コード スニペットは次のとおりです:

SELECT * FROM wines WHEREvariety='lagrein'

4. クエリをMySQLサーバー。

5. MySQL は wines テーブル内のすべてのレコードを返します - その中で、フィールドの多様性の値は「lagrein」です。

もう、これはおなじみの非常に簡単なプロセスになっているはずです。残念ながら、私たちが慣れ親しんでいるプロセスが、簡単に自己満足につながることがあります。次に、作成したクエリを再分析してみましょう。

1. 作成するクエリの固定部分は一重引用符で終わり、変数値の始まりを説明するために使用します:

コードスニペットは次のとおりです:

$query = " SELECT * FROM wines WHERE variety = ' ";

2. ユーザー送信を含む変数の値で元の不変部分を使用します:

コード スニペットは次のとおりです:

$query .= $variety;

3. 次に、別の値を使用 この結果を連結するために一重引用符が使用されます - 変数値の終わりを説明します:

以下はコード スニペットです:

$ query .= "'"; したがって、$query の値は次のようになります。 :

以下はコード スニペットです:

SELECT * FROM wines WHEREvariation = 'lagrein'

この構造の成功はユーザーの入力に依存します。この例では、単一の単語 (場合によっては単語のグループ) を使用してワインの種類を指定しています。したがって、クエリは問題なく構築され、結果は期待どおり、ワインの種類が「ラグレイン」であるワインのリストになります。ここで、単純なワインの種類「lagrein」を入力する代わりに、ユーザーが次のように入力すると想像してみましょう (2 つの句読点が含まれていることに注意してください):

lagrein' or 1=1; さて、あなたは、以前に修正した部分を使用してクエリを実行します (ここでは、$query 変数の結果値のみを表示します):

SELECT * FROM wines WHEREvariation = '

次に、コンテンツ変数の値がそれに連結されます(ここでは、太字で表示):

SELECT * FROM wines WHEREvariation = 'lagrein' or 1=1;

最後に、上下の引用符を追加します:

SELECT * FROM wines WHEREvariation = 'lagrein' or 1= 1;'

したがって、このクエリの結果は、あなたが期待するものとはかなり異なります。実際、ユーザーが入力した最後のセミコロンによって最初の命令 (レコード選択の実行) が終了し、新しい命令が開始されたため、クエリには 1 つではなく 2 つの命令が含まれています。この場合、2 番目の命令は単純な一重引用符以外の意味はありませんが、最初の命令も実装したいものではありません。ユーザーが入力の途中に一重引用符を入れると、変数の値を期待することになり、別の条件が導入されます。したがって、多様性が「lagrein」であるレコードを取得する代わりに、2 つの基準のいずれかを満たすレコードを取得します (1 つ目はあなたのもの、2 つ目は彼のもの、つまり多様性が「lagrein」または 1 レコードが 1 に等しい)。したがって、1 は常に 1 であるため、すべてのレコードを取得することになります。

ユーザーが送信した変数を記述するのに一重引用符の代わりに二重引用符を使用すればよいのではないかと思われるかもしれません。はい、これにより少なくとも悪意のあるユーザーの攻撃を遅らせることができます。 (前の記事で、ユーザーへのすべてのエラー通知メッセージを無効にする必要があることを思い出させました。ここでエラー メッセージが生成された場合、それは攻撃者にとって役立つ可能性があります。攻撃が失敗した理由についての説明が提供されます。具体的な説明。)

実際には、ユーザーが一部のレコードだけでなくすべてのレコードを参照できるようにするのは、最初は面倒に思えるかもしれませんが、実際には、すべてのレコードを簡単に参照できるようになります。この表は、彼が後でさらに邪悪な目的に使用できる重要な参考資料を提供します。先ほど説明した状況は、データベースに、アルコールに関する一見無害な情報の代わりに、たとえば従業員の年収のリストが含まれている場合に特に当てはまります。

理論的な観点から見ると、この種の攻撃は確かにひどいことです。予期しないコンテンツをクエリに挿入することで、このユーザーはデータベース アクセスを自分の目的に変換することができます。これで、あなたのデータベースはあなたにとっても同様に、彼に対しても開かれることになります。


IV. PHP と MySQL インジェクション

前に説明したように、PHP はその設計上、指示に従う以外に特別なことは何も行いません。したがって、悪意のあるユーザーが使用する場合は、前述したような特別に設計された攻撃を「許可」するだけで済みます。
破壊的な影響を与えるデータベース クエリを意図的に、または偶発的に構築していないことを前提とします。そのため、問題はユーザーからの入力にあると想定します。ここで、ユーザーがスクリプトに情報を提供するさまざまな方法を詳しく見てみましょう。


5. ユーザー入力の種類

最近では、ユーザーがスクリプトの動作に影響を与える方法はますます複雑になっています。
ユーザー入力の最も明白なソースは、もちろんフォーム上のテキスト入力フィールドです。このようなフィールドを使用すると、文字通りユーザーに任意のデータの入力を促すことになります。さらに、ユーザーに広い入力範囲を提供するため、ユーザーが入力できるデータの種類を事前に制限することはできません (ただし、その長さを制限することはできます)。これが、インジェクション攻撃の大部分が無防備なフォームフィールドから発生する理由です。

しかし、攻撃のソースは他にもあり、少し考えてみると、フォームの背後に潜むテクニック、つまり POST メソッドが思い浮かぶでしょう。ブラウザのナビゲーション ツールバーに表示される URI を分析するだけで、優れた観察が可能になります。ユーザーは、スクリプトにどのような情報が渡されるかを簡単に確認できます。このような URI は通常、プログラムによって生成されますが、悪意のあるユーザーが単に不適切な変数値を含む URI をブラウザーに入力することを防ぐ手段はなく、悪用される可能性のあるデータベースを開く可能性があります。

ユーザー入力を制限するための一般的な戦略は、入力ボックスの代わりにフォームに選択ボックスを提供することです。このタイプのコントロールは、ユーザーに事前定義された値のセットから選択を強制することができ、ユーザーが予期しないコンテンツを入力することをある程度防ぐことができます。しかし、攻撃者が URI を「スプーフィング」する (つまり、信頼できるが無効な URI を模倣する URI を作成する) のと同じように、ユーザーのフォームを模倣して独自のバージョンを作成し、その結果、新しいバージョンのオプション ボックスの URI は、事前定義された安全なオプションではなく、不正なオプションを使用します。これを実現するのは非常に簡単です。ソース コードを見て、フォームのソース コードをカット アンド ペーストするだけです。そうすればすべてが開けます。

選択を変更した後、フォームを送信できるようになり、無効なコマンドは元のコマンドであるかのように受け入れられます。したがって、ユーザーはさまざまな方法を使用して、悪意のあるコードをスクリプトに挿入しようとする可能性があります。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/324885.html技術記事 1. はじめに PHP は、強力でありながら習得が容易なサーバーサイド スクリプト言語であり、経験の浅いプログラマーでも複雑で動的な Web サイトを作成するために使用できます。それでは…
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

一致式(PHP 8)とそれがスイッチとどのように異なるかを説明します。 一致式(PHP 8)とそれがスイッチとどのように異なるかを説明します。 Apr 06, 2025 am 12:03 AM

PHP8では、一致式は、式の値に基づいて異なる結果を返す新しい制御構造です。 1)Switchステートメントに似ていますが、実行ステートメントブロックの代わりに値を返します。 2)一致式の式は厳密に比較され、セキュリティが向上します。 3)スイッチステートメントの脱落の可能性を回避し、コードのシンプルさと読みやすさを向上させます。

See all articles