ホームページ >バックエンド開発 >PHPチュートリアル >PHP を使用してコマンド インジェクション攻撃を回避する方法
インターネットの発展に伴い、ネットワークのセキュリティ問題はますます注目を集めており、特に Web サイト開発者にとっては、セキュリティ問題に一層の注意を払う必要があります。コマンドインジェクション攻撃は、近年流行している攻撃手法の一つであり、データ漏洩や情報改ざんなどのセキュリティ問題を引き起こす可能性があります。 PHP 開発ではコマンドインジェクション攻撃をいかに回避するかが大きな問題となりますが、コマンドインジェクション攻撃を回避するための PHP の使い方を見てみましょう。
1. コマンド インジェクション攻撃を理解する
まず、コマンド インジェクション攻撃とは何かを理解することが非常に重要です。コマンドインジェクション攻撃とは、攻撃者が悪意のあるコードを送信し、システムやアプリケーション全体を特定の悪意のある操作を意図的に実行する実行者に変え、その悪意のあるコードを使用して任意のコマンドや操作を実行し、システムやアプリケーションを制御することを意味します。
一般的なコマンド インジェクション攻撃には、SQL インジェクション、オペレーティング システム コマンド インジェクション、LDAP インジェクションなどが含まれます。 PHP 開発では、一般にオペレーティング システムのコマンド インジェクションが発生します。次に、オペレーティング システムのコマンド インジェクション攻撃を防ぐ方法に焦点を当てます。
2. コマンドの直接の結合を避ける
PHP プログラミングでは、ファイルのアップロードやシステム コマンドの呼び出しなど、システム コマンドを実行する必要がある状況が数多くあります。コマンドの結合は攻撃者に脆弱性を悪用されやすいため、コマンドを直接結合しないことが最も基本的な予防策です。
次の例は、システム コマンドを呼び出すときにコマンドを直接結合することを避ける必要があることを示しています。
<?php // 获取传入参数 $user_input = $_POST['name']; // 定义命令 $command = 'ls -l '.$user_input; // 执行命令 exec($command, $result); // 输出结果 var_dump($result); ?>
上記のコードでは、$user_input
は ## を通じて取得されます。 #$_POST パラメーターは
$command 変数に直接結合されており、攻撃者によって簡単に悪用される可能性があります。
$user_input をフィルタリングして特定の文字をチェックし、それを
$command に結合することです。具体的には、PHP の
escapeshellarg()、
escapeshellcmd()、
addslashes() などの関数をフィルタリングに使用できます。
<?php // 获取传入参数 $user_input = $_POST['name']; // 过滤参数 $user_input = escapeshellarg($user_input); // 定义命令 $command = 'ls -l '.$user_input; // 执行命令 exec($command, $result); // 输出结果 var_dump($result); ?>上記のコードでは、
escapeshellarg() 関数を使用して
$user_input をフィルタリングし、それを
$command に結合します。これにより、コマンド インジェクション攻撃が回避されます。
<?php // 连接数据库 $dsn = 'mysql:host=localhost;dbname=test'; $username = 'root'; $password = 'root'; $dbh = new PDO($dsn,$username,$password); // 获取传入参数 $user_input = $_POST['password']; // 定义命令 $command = "SELECT * FROM user WHERE password = :password"; // 准备查询 $stmt = $dbh->prepare($command); // 绑定参数 $stmt->bindParam(':password', $user_input); // 执行查询 $stmt->execute(); // 获取结果 $result = $stmt->fetchAll(); // 输出结果 var_dump($result); ?>上記のコードでは、
bindParam() メソッドを使用してパラメータ
$user_input をバインドし、直接スプライシングする方法を回避しています。 SQL ステートメント: これにより、SQL インジェクション攻撃が回避されます。
以上がPHP を使用してコマンド インジェクション攻撃を回避する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。