PHP+MYSQL Web サイト SQL インジェクションの攻撃と防御
プログラマは、コードを記述するときに TDD (テスト駆動開発) に注意します。関数を実装する前に、まずテスト ケースを作成し、次にそれを実行するコードを作成します。実際、ハッカーが SQL インジェクションを実行するときも、TDD プロセスです。ハッカーはまずプログラムにエラーを報告させようとし、次にプログラムが再度正常に実行されると、インジェクションは成功します。 。
攻撃:
プログラムに次のようなスクリプトがあるとします。
$sql = "SELECT ID、タイトル、コンテンツ FROM 記事 WHERE id = {$_GET['id']}";
通常アクセス時のURLは以下の通りです。
/articles.php?id=123
ハッカーは SQL インジェクションの脆弱性があるかどうかを判断する場合、最も一般的な方法は整数 ID の後に一重引用符を追加することです:
/articles.php?id=123'
$_GET[ 'id'] パラメーターをフィルターしなかったため、次のような情報のようなエラーが必然的に報告されます:
指定された引数は...
この情報はスクリプトを説明するのに十分です。抜け穴があります。いくつかのトリックを使用できます:
/articles.php?id=0 Union select 1,2,3
1,2,3 が選択される理由は、結合要件のためです。 両側のフィールドの数は同じです。前に id、title、content の 3 つのフィールドがあり、1、2、3 つのフィールドがあります。また、id=0 を設定した場合、存在しないレコードの場合、結果は 1、2、3 になります。Web ページに反映されると、1 になります。本来のidが表示される場所には が表示され、タイトルが表示される場所には 2 が表示され、コンテンツが表示される場所には 3 が表示されます。
引き続き使用する方法については、magic_quotes_gpc:
magic_quotes_gpc がオフの場合:
/articles の設定にも依存します。 php?id=0 Union select 1,2,load_file('/etc/passwd')
このようにして、/etc/passwd ファイルの内容が、元に表示されていた場所に表示されます。
magic_quotes_gpc がオンの場合:
この時点で直接load_file('/etc/passwd')を使用すると、一重引用符がエスケープされるため無効になります。しかし、まだ方法はあります:
/articles.php?id=0 Union select 1,2,load_file(char(47,101,116,99,47,112,97,115,115,119,100))
その数字は/etc /passwd string ASCII: 文字列の各文字が周期的に出力されます ord(...)
これに加えて、文字列の 16 進数も使用できます: 文字列の各文字が周期的に出力されますdechex( ord(...))
/articles.php?id=0 Union select 1,2,load_file(0x2f6574632f706173737764)
ここでは、数値パラメーターに対する攻撃方法をいくつか紹介します。文字列パラメータなどの攻撃手法については、以下のリンク先のドキュメントを参照してください。
防御:
SQL インジェクション ファイアウォールに似たソフトウェアがインターネット上で利用可能です (GreenSQL など)。Web サイトが SQL インジェクション攻撃を受け始めている場合は、このショートカット ツールを使用すると、多くの場合、命が救われます。ただし、このようなソフトウェアは、そのアーキテクチャでプロキシの役割を果たし、Web サイトの同時パフォーマンスに影響を与える可能性があるため、選択するときは客観的な条件に基づいて慎重に決定することが最善です。それを選ぶかどうか。多くの場合、専門的なソフトウェアは必要なく、軽量なソリューションが多数あります。ここでは、awk を使用して潜在的な脆弱性を検出する方法を示します。
次の内容を含む detect_sql_injection.awk スクリプトを作成します (内容をコピーする場合は、行番号を含めないでください):
01 #!/bin/gawk - f02
03 /$_(GETPOSTCOOKIEREQUEST)s*[/ {
04 IGNORECASE = 1
05 if (match($0, /$.*(sqlquery)/)) {
06 IGNORECASE = 0
07 出力()
08 次
09 }
10 }
11
12 関数出力()
13 {
14 $1 = $1
15 print "CRUD: " $0 "nFILE: " FILENAME "nLINE: " FNR "n"
16 }
このスクリプトは、次のような問題コードに一致します。マッチング モードを拡張したい場合は、それも可能です。猫の例に従って if match ステートメントを書くだけです。簡単です。
1: $sql = "SELECT * FROM ユーザー WHERE username = '{$_POST['username']}'";2: $res = mysql_query("SELECT * FROM users WHERE username = '{$_POST['username']}'");
使用する前に chmod +x detect_sql_injection.awk を忘れずに行ってください。呼び出し方法は 2 つあります:
1: ./detect_sql_injection.awk /path/to/php/script/file2: find /path/to/php/script/directory -name "*.php" xargs ./detect_sql_injection .awk
は、次のように問題のあるコード情報を表示します:
CRUD: $sql = "SELECT * FROM users WHERE username = '{$_POST[' username ']}'";FILE: /path/to/file.php
LINE: 123
このスクリプトを実際の環境に適用するには、次のような方法があります。 CRON プログラムのソース ファイルを定期的にスキャンするか、SVN の送信時にフック メソッドを通じて自動的にソース ファイルを照合します。
専門的なツールを使用する場合でも、スクリプトを検出する場合でも、問題の根本は常にプログラマが必要なセキュリティ意識を持っているかどうかに依存します。
1: intval や floatval などのメソッドを使用して、数値パラメーターを強制的にフィルターします。
2: mysql_real_escape_string などのメソッドを使用して、単純なアッドスラッシュの代わりに文字列パラメーターを強制的にフィルターします。
3: mysql_query などのスプライシング SQL クエリ方式を放棄し、可能な限り PDO のバインディング準備メソッドを使用するのが最善です。
4: 書き換えテクノロジーを使用して実際のスクリプトとパラメーターの情報を隠し、通常の書き換えルールを通じて疑わしいパラメーターをフィルターします。
5: エラー プロンプトをオフにし、攻撃者に機密情報を提供しません: display_errors=off。
6: エラー情報をログ形式で記録します: log_errors=on および error_log=filename Web ログも定期的に確認することをお勧めします。
7: MySQL への接続に FILE 権限を持つアカウント (root など) を使用しないでください。これにより、load_file などの危険な関数がブロックされます。
8:...
Web サイトのセキュリティは実際には複雑ではありません。入力をフィルターし、出力をエスケープするという一文に要約できます。 このうち、これまで議論してきた SQL インジェクションの問題は、入力のフィルタリングの問題に属し、出力のエスケープの問題としては、クロスサイト スクリプティングが代表的ですが、この記事の範囲には含まれません。 , なのでこれ以上は言いません。
ドキュメント:
addslashes() と mysql_real_escape_string()
MySQL による SQL インジェクション
MySQL による高度な SQL インジェクション
MySQL インジェクションのフィールドのエクスポートコンテンツリサーチ - インジェクションによる WebShell のエクスポート

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

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

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

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

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

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

ホットトピック











ログイン画面に「組織から PIN の変更を求められています」というメッセージが表示されます。これは、個人のデバイスを制御できる組織ベースのアカウント設定を使用しているコンピューターで PIN の有効期限の制限に達した場合に発生します。ただし、個人アカウントを使用して Windows をセットアップした場合、エラー メッセージは表示されないのが理想的です。常にそうとは限りませんが。エラーが発生したほとんどのユーザーは、個人アカウントを使用して報告します。私の組織が Windows 11 で PIN を変更するように要求するのはなぜですか?アカウントが組織に関連付けられている可能性があるため、主なアプローチはこれを確認することです。ドメイン管理者に問い合わせると解決できます。さらに、ローカル ポリシー設定が間違っていたり、レジストリ キーが間違っていたりすると、エラーが発生する可能性があります。今すぐ

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

画面の明るさは、最新のコンピューティング デバイスを使用する上で不可欠な部分であり、特に長時間画面を見る場合には重要です。目の疲れを軽減し、可読性を向上させ、コンテンツを簡単かつ効率的に表示するのに役立ちます。ただし、設定によっては、特に新しい UI が変更された Windows 11 では、明るさの管理が難しい場合があります。明るさの調整に問題がある場合は、Windows 11 で明るさを管理するすべての方法を次に示します。 Windows 11で明るさを変更する方法【10の方法を解説】 シングルモニターユーザーは、次の方法でWindows 11の明るさを調整できます。これには、ラップトップだけでなく、単一のモニターを使用するデスクトップ システムも含まれます。はじめましょう。方法 1: アクション センターを使用する アクション センターにアクセスできる

iOS 17 では、Apple はモバイル オペレーティング システムにいくつかの新しいプライバシーおよびセキュリティ機能を導入しました。その 1 つは、Safari のプライベート ブラウジング タブに対して 2 段階認証を要求する機能です。その仕組みとオフにする方法は次のとおりです。 iOS 17 または iPadOS 17 を実行している iPhone または iPad では、Safari でプライベート ブラウズ タブを開いていて、再度アクセスするためにセッションまたはアプリを終了する場合、Apple のブラウザでは Face ID/Touch ID 認証またはパスコードが必要になります。言い換えれば、ロックが解除されている iPhone または iPad を誰かが手に入れても、パスコードを知らなければプライバシーを閲覧することはできません。

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

有名なアクティベーション スクリプト MAS2.2 バージョンでは、デジタル アクティベーションが再びサポートされています。このメソッドは @asdcorp とそのチームが考案したもので、MAS 作成者はそれを HWID2 と呼んでいます。 https://github.com/massgravel/Microsoft-Activation-Scripts から Gatherosstate.exe (オリジナルではなく、変更されたもの) をダウンロードし、パラメータを指定して実行し、AuthenticTicket.xml を生成します。まず元のメソッド: Gatherosstate.exePfn=xxxxxxx;DownlevelOriginalState=1 を確認し、次に最新のメソッド: Gatheros と比較します。

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

SQL における Identity とは何ですか? 具体的なコード例が必要です。SQL では、Identity は自動インクリメント数値の生成に使用される特別なデータ型です。多くの場合、テーブル内のデータの各行を一意に識別するために使用されます。 Identity 列は、各レコードが一意の識別子を持つようにするために、主キー列と組み合わせてよく使用されます。この記事では、Identity の使用方法といくつかの実用的なコード例について詳しく説明します。 Identity の基本的な使用方法は、テーブルを作成するときに Identity を使用することです。
