ホームページ >バックエンド開発 >PHPチュートリアル >PHP 言語開発におけるコマンド インジェクションのセキュリティ リスクを回避する方法

PHP 言語開発におけるコマンド インジェクションのセキュリティ リスクを回避する方法

WBOY
WBOYオリジナル
2023-06-09 18:32:451300ブラウズ

インターネット技術の急速な発展に伴い、Web アプリケーションは私たちの日常生活においてますます重要な役割を果たしています。 PHP は広く使用されている Web プログラミング言語として、サイバー攻撃活動の焦点にもなっています。中でもコマンドインジェクションのセキュリティリスクはPHPが直面する重要な脅威であり、本記事ではPHP開発におけるセキュリティリスクを回避する方法をいくつか紹介します。

1. コマンド インジェクション攻撃とは何ですか?

コマンド インジェクション攻撃とは、ハッカーが Web アプリケーションの入力パラメータを通じて悪意のあるシステム コマンドを Web アプリケーションに挿入し、それを実行することを指します。 Web アプリケーションのサーバー。コマンド インジェクション攻撃は、ハッカーが制限なく Web アプリケーションのサーバーを直接制御し、サーバーを完全に制御できる非常に危険な攻撃方法です。

2. コマンド インジェクション攻撃の 2 つの形態

コマンド インジェクション攻撃は、実際の攻撃では 2 つの形態に分類できます。 1 つは Web アプリケーションの入力パラメータを直接使用して攻撃する方法、もう 1 つは他の手段でシステムの権限を取得して攻撃する方法です。

  1. Web アプリケーションの入力パラメータを直接使用して攻撃する

ユーザーが POST または GET を通じて Web アプリケーションにデータを送信すると、ハッカーは一部のデータを Web アプリケーションに挿入することができます。データ。システム コマンドを含む文字列。これにより、Web アプリケーションが実行時にこれらの悪意のあるコマンドを実行できるようになります。たとえば、一般的なコマンド インジェクション攻撃のサンプル コードは次のようになります。

mysql_query("SELECT * FROM user WHERE name = '".$_POST['name']."' AND password = '".$_POST['password']."'");

ユーザーがフォーム経由でログインするためにユーザー名とパスワードを入力すると、ハッカーは悪意のあるシステム コマンドを含む文字をインジェクトする可能性があります。以下に示すように、文字列形式で指定します。

a' OR 1=1; DROP TABLE user;#

このコマンドにより、Web アプリケーションは SQL クエリの実行時に「OR」演算を実行し、「user」という名前のテーブルを削除します。

  1. 他の手段でシステム権限を取得して攻撃する

ハッカーは、Web アプリケーションの他の脆弱性を悪用したり、サーバーのパスワードを直接解読したりするなど、他の手段でシステム権限を取得できます。 。ハッカーがシステム権限を取得すると、コマンド インジェクション攻撃を通じてサーバーを直接制御できるようになります。たとえば、ハッカーは次のコマンドを通じて単純なコマンド インジェクション攻撃を実行できます。

system(“rm -rf /”);

このコマンドはサーバー上のすべてのファイルとディレクトリを削除し、非常に重大な損失を引き起こします。

3. コマンド インジェクション攻撃を回避する方法

コマンド インジェクション攻撃の基本知識を習得した後は、次の方法でこのセキュリティ リスクを回避できます:

    #プリペアド ステートメントを使用する
プリペアド ステートメントは SQL をクエリするための安全な方法であり、SQL インジェクション攻撃やコマンド インジェクション攻撃を回避し、アプリケーションのパフォーマンスを向上させることができます。プリペアド ステートメントは、PDO や MySQLi などの拡張ライブラリを使用して実装できます。

たとえば、以下は PDO プリペアド ステートメントを使用して SQL クエリを実行するサンプル コードです。

$pdo = new PDO(‘mysql:host=hostname;dbname=database_name;’, ‘username’, ‘password’);
$stmt = $pdo->prepare(‘SELECT name FROM user WHERE email = :email’);
$stmt->execute(array(‘email’ => $email));

    入力データのフィルタリングと検証
Inプログラムの実装 ロジックの前に、処理されたデータをフィルタリングして検証する必要があります。

intval()floatval()trim() などの PHP の組み込み関数やその他の関数を使用して、データのフィルタリングや検証を行うことができます。

たとえば、次のサンプル コードは、

filter_input() 関数を使用して入力データをフィルタリングおよび検証する方法を示しています。

$name = filter_input(INPUT_POST, ‘name’, FILTER_SANITIZE_STRING);
$email = filter_input(INPUT_POST, ‘email’, FILTER_VALIDATE_EMAIL);
$password = filter_input(INPUT_POST, ‘password’, FILTER_SANITIZE_SPECIAL_CHARS);

    厳密な入力検証を実行します。システムコマンドとフィルタリング
システムコマンドを実行する前に、入力されたコマンドを厳密に検証してフィルタリングする必要があります。信頼できるコマンド ライン パラメーターを使用して入力を制限できます。

たとえば、次のサンプル コードは、

escapeshellcmd() 関数を使用してコマンド ライン引数をフィルタリングする方法を示しています。

$command = escapeshellcmd($_POST['command']);
$output = shell_exec($command);

    安全なファイル システム アクセス制御を使用するファイルのアップロードの処理方法
Web アプリケーションでは、ユーザーはファイルをアップロードできますが、これには特別な注意が必要です。なぜならハッカーはファイルをアップロードすることでCSSやコマンドインジェクション攻撃を実行できるからです。したがって、ファイルのアップロード処理中にファイルの種類とサイズを検証する必要があり、アップロードされたファイルを Web サーバーの外部の独立したファイル システムに保存する必要があります。

たとえば、次のサンプル コードは、アップロードされたファイルを検証してフィルタリングする方法を示しています:

$allowed_types = array('png', 'jpg', 'gif');
$file_type = substr(strrchr($_FILES['file']['name'], '.'), 1);
if(!in_array($file_type, $allowed_types)) {
    die("Invalid file type.");
}
if ($_FILES['file']['size'] > 1000000) {
    die("File size too large.");
}

上記は、PHP 開発におけるコマンド インジェクション攻撃を回避するためのいくつかの方法です。開発者は注意して使用する必要があります。これらの方法により、Web アプリケーションのセキュリティが大幅に向上します。

以上がPHP 言語開発におけるコマンド インジェクションのセキュリティ リスクを回避する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。