ホームページ  >  記事  >  php教程  >  MySQL インジェクションや HTML フォームの悪用を防ぐ PHP プログラム

MySQL インジェクションや HTML フォームの悪用を防ぐ PHP プログラム

WBOY
WBOYオリジナル
2016-06-13 12:25:061163ブラウズ

MySQL インジェクションの目的は、Web サイトのデータベースを乗っ取り、情報を盗むことです。 MySQL などの一般的なオープン ソース データベースは、パスワード、個人情報、管理情報などの重要な情報を保存するために、多くの Web サイト開発者によって使用されてきました。
MySQL は、最も人気のあるサーバーサイド スクリプト言語である PHP とともに使用されるため、人気があります。さらに、PHP は、インターネットを支配する Linux-Apache サーバーの主要言語です。したがって、これはハッカーが Windows スパイウェアと同じように PHP を簡単に悪用できることを意味します。
ハッカーは、セキュリティで保護されていない Web フォームに大量の悪意のあるコードを入力します (ドロップダウン メニュー、検索ボックス、問い合わせフォーム、クエリ フォーム、チェックボックス経由)。
悪意のあるコードは MySQL データベースに送信され、「注入」されます。このプロセスを確認するには、まず次の基本的な MySQL SELECT クエリ ステートメントを検討します。
SELECT * FROM xmen WHERE username = 'wolverine'
このクエリは、「xmen」テーブルを持つデータベースに、特定のユーザー名を返すように要求します。 「wolverine」の MySQL データ。
Web フォームにユーザーが wolverine と入力すると、このデータが MySQL クエリに渡されます。
入力が無効な場合、ユーザー名を設定するなど、ハッカーがデータベースを制御する別の方法があります:
' OR ''=''
次のコマンドを実行しても安全だと思われるかもしれません。通常の PHP および MySQL 構文を使用して入力する必要があります。誰かが悪意のあるコードを入力すると、必ず「無効なクエリ」メッセージが表示されますが、そうではありません。ハッカーは賢いので、データベースのクリーンアップや管理者権限のリセットが必要となるため、セキュリティ ホールを修正するのは簡単ではありません。
MySQL インジェクション攻撃に関する 2 つのよくある誤解は次のとおりです。
1. ネットワーク管理者は、悪意のあるインジェクションはウイルス対策ソフトウェアまたはスパイウェア対策ソフトウェアでクリーンアップできると信じています。実際、この種の感染は MySQL データベースの弱点を悪用します。これは、スパイウェア対策プログラムやウイルス対策プログラムによって簡単に削除することはできません。
2. MySQL インジェクションは、感染したファイルを別のサーバーまたは外部ソースからコピーすることによって発生します。これは事実ではありません。このタイプの感染は、誰かが Web サイト上の保護されていないフォームに悪意のあるコードを入力し、データベースにアクセスすると発生します。 MySQL インジェクションは、ウイルス対策プログラムを使用するのではなく、悪意のあるスクリプトを削除することでクリーンアップできます。
ユーザー入力検証プロセス
クリーンなデータベースをバックアップし、サーバーの外部に配置します。 MySQL テーブルのセットをエクスポートし、デスクトップに保存します。
次にサーバーにアクセスし、フォーム入力を一時的にオフにします。これは、フォームがデータを処理できず、Web サイトがシャットダウンされることを意味します。
その後、クリーニングプロセスを開始します。まず、サーバー上で、残っている乱雑な MySQL インジェクションをクリーンアップします。すべてのデータベース、FTP、Web サイトのパスワードを変更します。
最悪の場合、クリーンアップが遅れた場合は、サーバー上で隠れたプログラムが実行されていないか再確認してください。これらの隠されたプログラムは、ハッカーによってインストールされたトロイの木馬です。完全に削除し、すべての FTP アクセス許可を変更します。すべてのトロイの木馬とマルウェアについてサーバーをスキャンします。
PHP スクリプト プログラムを変更すると、フォーム データが処理されます。 MySQL インジェクションを防ぐ良い方法は、ユーザー データさえも信頼しないことです。ユーザー入力の検証は、MySQL インジェクションを防ぐために非常に重要です。
ユーザー入力を除外するフィルターを設計します。 以下にいくつかのヒントを示します。
1. フォームへの入力は数値です。それが 0.001 以上であるかどうかをテストすることで、それが数値であることを確認できます (ゼロは受け入れられないと仮定します)。
2. メールアドレスの場合。 「@」、A ~ Z、a ~ z、またはいくつかの数字など、許可された文字の組み合わせで構成されていることを確認します。
3. 個人名またはユーザー名の場合。 SQL インジェクションに使用される可能性のある不正な文字 (and や * など) が含まれているかどうかによって検証できます。
数値入力の検証
次のスクリプトは、0.001 から無限までの有効な数値が入力されているかどうかを検証します。 PHP プログラムでは、特定の範囲内の数値の使用を許可することもできることに注意してください。この検証スクリプトを使用して、フォームに数値のみが入力されていることを確認します。
プログラム内に 3 つの数値変数があるとします。それらを検証する必要があるとします。これらに num1、num2、および num3 という名前を付けます。

コードをコピー


//数値入力を検証
if($_POST['num1'] >= 0.001 && $_POST['num2'] >= 0.001 && $_POST['num3 '] >= 0.001)
{
}
else
{
}
?>


そして、条件は次のように拡張できます。 3桁以上。したがって、10 個ある場合は、AND ステートメントを拡張するだけで済みます。
これは、契約数量、ライセンス番号、電話番号などの数字のみを受け入れるフォームを検証するために使用できます。
テキストと電子メール アドレスの入力を検証します
ユーザー名、名、電子メール アドレスなどのフォーム入力を検証するには、次のコマンドを使用できます:

コードをコピー コードは次のとおりです:


//テキスト入力を検証します
if (! preg_match('/^[-a-z.-@,'s]*$/i',$ _POST['name ']))
{
}
else
if ($empty==0)
{
}
else
{
}
?>


この検証スクリプトの利点の 1 つは、空の入力を受け入れないことです。悪意のあるユーザーの中には、空の入力を介してデータベースを操作する人もいます。上記のスクリプトを使用して、1 つのリテラル変数「$name」のみを検証します。つまり、テキスト変数が 3 つある場合、各変数の検証スクリプトを設定して、データベースに入力する前に各変数がレビューに合格することを確認できます。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。