SQL インジェクションの防止_PHP チュートリアル
[転送]SQLインジェクション
SQLインジェクション
多くの Web 開発者は、SQL クエリが改ざんされる可能性があることに気づいていないため、SQL クエリを信頼できるコマンドとして扱っています。彼らは、SQL クエリがアクセス制御をバイパスし、それによって認証と権限のチェックをバイパスできることをほとんど知りませんでした。さらに、SQL クエリを介してホスト オペレーティング システム レベルのコマンドを実行することもできます。
ダイレクト SQL コマンド インジェクションは、攻撃者が一般的に使用する手法で、既存の SQL ステートメントを作成または変更して、隠しデータを取得したり、キー値を上書きしたり、データベース ホスト オペレーティング システム コマンドを実行したりすることもあります。これは、アプリケーションがユーザー入力を取得し、それを静的パラメーターと組み合わせて SQL クエリにすることによって実現されます。いくつかの実例を以下に示します。
入力されたデータの検証が不足しており、新しいユーザーを作成する権限を持つスーパーユーザーまたは他のデータベース アカウントを使用した接続が原因で、攻撃者はデータベースに新しいスーパーユーザーを作成する可能性があります。
例#1 データのページング表示を実装するコードは、スーパーユーザー (PostgreSQL システム) の作成にも使用できます。
PHP コンテンツをクリップボードにコピーします
PHPコード:
$offset = $argv[0]; // 入力検証は行われないことに注意してください。
$query = "商品から ID、名前を選択 名前で注文 LIMIT 20 OFFSET $offset;";
$result = pg_query($conn, $query);
一般に、ユーザーは $offset がビニングされている「前のページ」リンクと「次のページ」リンクをクリックします。元のコードでは、$offset が数値であるとのみ考えられます。ただし、誰かが最初に次のステートメントを urlencode() してから URL に追加しようとした場合:
0;
pg_shadow(usename,usesysid,usesuper,usecatupd,passwd)に挿入
「クラック」、usesysid、「t」、「t」、「クラック」を選択します
pg_shadow から usename='postgres';
--
その後、スーパー ユーザーを作成できます。 0; は、エラーが発生しないように、元のクエリを完成させるための正しいオフセットを提供するだけであることに注意してください。
注: -- は SQL のコメント マークであり、通常、SQL インタープリターに次のステートメントを無視するように指示するために使用されます。
パスワードを取得する考えられる方法は、検索結果を表示するページをターゲットにすることです。攻撃者が行う必要があるのは、どの変数が SQL ステートメントに送信され、それらの変数が誤って処理されたかを特定することだけです。このような変数は通常、WHERE、ORDER BY、LIMIT、OFFSET などの SELECT クエリの条件文で使用されます。データベースが UNION 構造をサポートしている場合、攻撃者は完全な SQL クエリを元のステートメントに追加して、任意のデータ テーブルからパスワードを取得する可能性もあります。したがって、パスワードフィールドを暗号化することが重要です。
例#2 記事といくつかのパスワードを表示します (任意のデータベース システム)
PHP コンテンツをクリップボードにコピーします
PHPコード:
$query = "製品から ID、名前、挿入されたサイズを選択します
WHERE サイズ = '$size'
$order LIMIT で注文 $limit, $offset;";
$result = odbc_exec($conn, $query);
元のクエリに別の SELECT クエリを追加して、パスワードを取得できます:
Union select '1'、concat(uname||'-'||passwd) を名前として、'1971-01-01'、'0' をユーザーテーブルから選択します;
--
上記のステートメント (' と -- を使用) を $query 内の変数に追加すると、問題が発生します。
SQL の UPDATE にも脆弱性があります。このクエリは、上の例のように、別の完全なリクエストに挿入または追加することもできます。しかし、攻撃者は、テーブル内の一部のデータを変更できるように、SET 句をターゲットにすることを好みます。この場合、クエリを正常に変更するには、データベースの構造を知っている必要があります。フォーム上の変数名に基づいてフィールドを推測したり、総当たりでクラックしたりすることができます。ユーザー名とパスワードを保存するフィールドに名前を付ける方法は多くありません。
例#3 パスワードのリセットから…より多くの権限の取得まで (任意のデータベース システム)
PHP コンテンツをクリップボードにコピーします
PHPコード:
$query = "UPDATE ユーザーテーブル SET pwd='$pwd' WHERE uid='$uid';";
しかし、悪意のあるユーザーは、変数の値として ' または '%admin%'; のような uid を $uid に送信するか、$pwd の値を "hehehe", admin='yes' として送信します。 、trusted=100 "(その後にスペースを付ける) と追加の権限を取得します。これを行うと、クエリ ステートメントは実際には次のようになります:
PHP コンテンツをクリップボードにコピーします
PHPコード:
// $uid == ' または '%admin%' のような uid;
$query = "UPDATE usertable SET pwd='...' WHERE uid='' または '%admin%' のような uid; --";
// $pwd == "ふふふ、admin='はい'、trusted=100 "
$query = "UPDATE usertable SET pwd='hehehe'、admin='yes'、trusted=100 WHERE
...;";
次の恐ろしい例は、一部のデータベースでシステム コマンドを実行する方法を示しています。
例#4 データベースが配置されているホストのオペレーティング システム (MSSQL サーバー) を攻撃します
PHP コンテンツをクリップボードにコピーします
PHPコード:
$query = "SELECT * FROM products WHERE ID LIKE '%$prod%'";
$result = mssql_query($query);
攻撃が変数 $prod の値として %' exec master..xp_cmdshell 'net user test testpass /ADD' を送信すると、$query は
になります。
PHP コンテンツをクリップボードにコピーします
PHPコード:
$query = "製品から * を選択
「%a%」のような場所 ID
exec master..xp_cmdshell 'net user test testpass /ADD'--";
$result = mssql_query($query);
MSSQL サーバーは、システムにユーザーを追加するために続くコマンドを含む、この SQL ステートメントを実行します。このプログラムが sa として実行されており、MSSQLSERVER サービスに十分な権限がある場合、攻撃者はホストにアクセスするためのシステム アカウントを取得できます。
注: 上記の例は特定のデータベース システムに関するものですが、他のデータベース システムに対して同様の攻撃を実行できないという意味ではありません。さまざまな方法を使用すると、さまざまなデータベースが影響を受ける可能性があります。
予防措置
攻撃者は上記の攻撃を実行するためにデータベース構造に関する情報を知る必要があると言って自分を慰める人もいるかもしれません。はい、そうです。しかし、攻撃者がこの情報を取得しないとは誰も保証できません。取得したデータベースは漏洩の危険にさらされます。フォーラム プログラムなどのオープン ソース ソフトウェア パッケージを使用してデータベースにアクセスしている場合、攻撃者が関連コードを入手するのは簡単です。コードの設計が不適切な場合、リスクはさらに大きくなります。
これらの攻撃は常に、セキュリティを考慮していないコードの悪用に基づいています。したがって、外部から入力されたデータ、特にクライアントから入力されたデータ (選択ボックス、フォームの隠しフィールド、Cookie など) を決して信頼しないでください。上記の最初の例と同様、通常のクエリでも災害が発生する可能性があります。
データベースへの接続にはスーパーユーザーまたは所有者アカウントを決して使用しないでください。権限が厳しく制限されたアカウントを使用してください。
入力データが予期したデータ形式であるかどうかを確認します。 PHP には、単純な変数関数や文字型関数 (is_numeric()、ctype_digit() など) から、この仕事を実行できる複雑な Perl 互換の正規表現関数まで、入力のチェックに使用できる関数が多数あります。
プログラムが数値の入力を待機している場合は、 is_numeric() を使用して数値をチェックするか、 settype() を直接使用してその型を変換するか、 sprintf() を使用して数値としてフォーマットすることを検討してください。
Example#5 ページングを実装するより安全な方法
PHP コンテンツをクリップボードにコピーします
PHPコード:
settype($offset, 'integer');
$query = "商品から ID、名前を選択 名前で注文 LIMIT 20 OFFSET $offset;";
// フォーマット文字列の %d に注意してください。%s を使用すると意味がありません
$query = sprintf("商品から ID、名前を選択 名前順に注文 LIMIT 20 OFFSET %d;",
$offset);
データベース固有の機密文字エスケープ関数 (mysql_escape_string() や sql_escape_string() など) を使用して、ユーザーが送信した非数値データをエスケープします。データベースに特別な機密文字エスケープ関数がない場合は、代わりに addslashes() と str_replace() を使用してこの作業を完了できます。最初の例を見ると、この例は、クエリの静的部分を引用するだけでは十分ではなく、クエリが簡単に壊れる可能性があることを示しています。
データベース、特にデータベースの構造については、絶対に自信を示さないようにしてください。エラー報告機能とエラー処理機能を参照してください。
ユーザーがデータ テーブルやビューに直接アクセスできないように、データベース ストアド プロシージャや抽象データベース アクセスへの定義済みポインタなどの機能を使用することも選択できます。しかし、このアプローチには別の意味もあります。
これに加えて、可能な場合はコードまたはデータベース システムを使用してクエリ ログを保存することもお勧めします。明らかに、ログは攻撃を防ぐものではありませんが、どのプログラムが攻撃を試みたかを追跡するために使用できます。ログ自体は役に立ちません。ログに含まれる情報を参照する必要があります。結局のところ、情報は無いよりはあった方が良いのです。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











HQL と SQL は Hibernate フレームワークで比較されます。HQL (1. オブジェクト指向構文、2. データベースに依存しないクエリ、3. タイプ セーフティ)、SQL はデータベースを直接操作します (1. データベースに依存しない標準、2. 複雑な実行可能ファイル)。クエリとデータ操作)。

「OracleSQLでの除算演算の使用方法」 OracleSQLでは、除算演算は一般的な数学演算の1つです。データのクエリと処理中に、除算演算はフィールド間の比率を計算したり、特定の値間の論理関係を導出したりするのに役立ちます。この記事では、OracleSQL での除算演算の使用法を紹介し、具体的なコード例を示します。 1. OracleSQL における除算演算の 2 つの方法 OracleSQL では、除算演算を 2 つの異なる方法で実行できます。

Oracle と DB2 は一般的に使用される 2 つのリレーショナル データベース管理システムであり、それぞれに独自の SQL 構文と特性があります。この記事では、Oracle と DB2 の SQL 構文を比較し、相違点を示し、具体的なコード例を示します。データベース接続 Oracle では、次のステートメントを使用してデータベースに接続します: CONNECTusername/password@database DB2 では、データベースに接続するステートメントは次のとおりです: CONNECTTOdataba

12306 チケット予約アプリの最新バージョンをダウンロードします。誰もが非常に満足している旅行チケット購入ソフトウェアです。行きたい場所に行くのに非常に便利です。ソフトウェアには多くのチケット ソースが提供されています。本物のチケットを渡すだけで済みます。 - 氏名認証によるオンラインチケット購入 全ユーザー 旅行券や航空券を簡単に購入でき、さまざまな割引が受けられます。また、チケットを入手するための事前予約も開始できます。ホテルや特別な車の送迎も予約できます。これを使用すると、ワンクリックで行きたい場所に行き、チケットを購入できます。旅行がより簡単で便利になり、すべての人に旅行体験を提供します編集者はオンラインで詳細を説明するようになり、12306 人のユーザーに過去のチケット購入記録を表示する方法が提供されます。 1. Railway 12306 を開き、右下隅の [My] をクリックして、[My Order] をクリックします。 2. 注文ページで [Paid] をクリックします。 3. 有料ページにて

Xuexin.com で私の学歴を確認するにはどうすればよいですか? Xuexin.com で学歴を確認できますが、多くのユーザーは Xuexin.com で学歴を確認する方法を知りません。次に、エディターが Xuexin.com で学歴を確認する方法に関するグラフィック チュートリアルを提供します。興味のあるユーザーはぜひ見に来てください! Xuexin.com の使用方法チュートリアル: Xuexin.com で学歴を確認する方法 1. Xuexin.com の入り口: https://www.chsi.com.cn/ 2. Web サイトのクエリ: ステップ 1: Xuexin.com のアドレスをクリックします。上記をクリックしてホームページに入ります [教育クエリ]をクリックします; ステップ2: 最新のWebページで下図の矢印に示すように[クエリ]をクリックします; ステップ3: 新しいページで[学術単位ファイルにログイン]をクリックします; ステップ4: ログインページで情報を入力し、[ログイン]をクリックします。

MySQL と PL/SQL は 2 つの異なるデータベース管理システムであり、それぞれリレーショナル データベースと手続き型言語の特性を表しています。この記事では、具体的なコード例を示しながら、MySQL と PL/SQL の類似点と相違点を比較します。 MySQL は、構造化照会言語 (SQL) を使用してデータベースを管理および操作する、一般的なリレーショナル データベース管理システムです。 PL/SQL は Oracle データベースに固有の手続き型言語であり、ストアド プロシージャ、トリガー、関数などのデータベース オブジェクトを記述するために使用されます。同じ

Cockpit は、Linux サーバー用の Web ベースのグラフィカル インターフェイスです。これは主に、初心者/熟練ユーザーにとって Linux サーバーの管理を容易にすることを目的としています。この記事では、Cockpit アクセス モードと、CockpitWebUI から Cockpit への管理アクセスを切り替える方法について説明します。コンテンツ トピック: コックピット エントリ モード 現在のコックピット アクセス モードの確認 CockpitWebUI からコックピットへの管理アクセスを有効にする CockpitWebUI からコックピットへの管理アクセスを無効にする まとめ コックピット エントリ モード コックピットには 2 つのアクセス モードがあります。 制限付きアクセス: これは、コックピット アクセス モードのデフォルトです。このアクセス モードでは、コックピットから Web ユーザーにアクセスできません。

MySQL 接続数がデータベースのパフォーマンスに与える影響の分析 インターネット アプリケーションの継続的な開発に伴い、データベースはアプリケーション システムをサポートする重要なデータ ストレージおよび管理ツールになりました。データベース システムにおいて、接続数はデータベース システムのパフォーマンスと安定性に直接関係する重要な概念です。この記事では、MySQL データベースの観点から開始し、データベースのパフォーマンスに対する接続数の影響を調査し、特定のコード例を通じて分析します。 1. 接続数はどれくらいですか?接続数とは、データベース システムが同時にサポートするクライアント接続の数を指し、管理することもできます。
