ホームページ >バックエンド開発 >PHPチュートリアル >PHP 入門: SQL インジェクション

PHP 入門: SQL インジェクション

王林
王林オリジナル
2023-05-20 11:30:102241ブラウズ

PHP 入門ガイド: SQL インジェクション

インターネットの急速な発展に伴い、Web アプリケーションの人気はますます高まっており、そのセキュリティが大きな懸念事項となっています。 SQL インジェクションは Web アプリケーションにおける一般的な攻撃手法であり、重大なセキュリティ上の問題を引き起こし、Web アプリケーションの通常の動作に影響を与える可能性があります。 PHP を学習して使用する場合、SQL インジェクションの関連知識を理解し、習得することが非常に重要です。

SQL インジェクションとは、攻撃者が Web アプリケーションに悪意のある SQL ステートメントを入力して、認証をバイパスし、データベース データにアクセスし、不正な操作を実行する攻撃方法を指します。 SQL インジェクション攻撃は、ユーザーが入力したデータに対する Web アプリケーションの信頼性を利用し、攻撃者はユーザーが入力したデータを偽造し、Web アプリケーションがそれらを信頼できるデータとして扱えるようにします。

以下では、簡単なログインフォームを例に、SQL インジェクションの原理と予防策を紹介します。

PHP では、dbms は通常、mysqli と PDO という 2 つの拡張機能を介して接続されます。この記事では、mysqli を例として取り上げます。

まず、ログイン フォームを作成し、ユーザーはユーザー名とパスワードを入力します。

<!DOCTYPE html>
<html>
<head>
    <title>Login form</title>
</head>
<body>

    <form method="post" action="login.php">
        <label for="username">Username:</label>
        <input type="text" name="username" id="username" required>
        <br>
        <label for="password">Password:</label>
        <input type="password" name="password" id="password" required>
        <br>
        <input type="submit" value="Login">
    </form>

</body>
</html>

次に、ユーザーが入力したユーザー名とパスワードをデータベース内のデータと比較します。一致する場合、ログインは成功します。そうでない場合、ログインは失敗します。

<?php
$db_servername = "localhost";
$db_username = "username";
$db_password = "password";
$db_name = "database_name";

// create connection
$conn = mysqli_connect($db_servername, $db_username, $db_password, $db_name);

// check connection
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

// get user input
$user = $_POST["username"];
$pass = $_POST["password"];

// process user input
$sql = "SELECT * FROM users WHERE username='$user' AND password='$pass'";
$result = mysqli_query($conn, $sql);

// check result
if (mysqli_num_rows($result) > 0) {
    echo "Login success.";
} else {
    echo "Login failed.";
}

// close connection
mysqli_close($conn);
?>

上記のコードは素晴らしく見えますが、SQL インジェクション攻撃に対して脆弱であるという重大な問題があります。

攻撃者は、ユーザー名とパスワードの入力ボックスに次の内容を入力できます:

' OR '1'='1

この時点で、生成されるクエリ ステートメントは次のとおりです:

SELECT * FROM users WHERE username='' OR '1'='1' AND password='' OR '1'='1'

この SQL ステートメントは、 return すべてのユーザーの記録。そのため、入力されたユーザー名とパスワードが正しいかどうかに関係なく、ログインは成功します。これが SQL インジェクション攻撃の仕組みです。

SQL インジェクション攻撃を回避するには、ユーザーが入力したデータを扱うときに注意する必要があります。以下にいくつかの注意事項を示します。

  1. mysqli や PDO などのパラメータ化されたクエリを使用し、ユーザーが入力したデータを SQL ステートメントに直接結合しないでください。
  2. すべての入力データに対して厳密な検証とフィルタリング (スペースの削除、特殊文字のフィルタリングなど) を実行します。
  3. SQL インジェクションのリスクを可能な限り軽減するために、ユーザーが入力するデータを制限するなど、プログラムのセキュリティ ポリシーを設定します。
  4. 管理者が root ユーザーとしてログインすることを禁止したり、ネットワーク アクセスを制限したりするなど、データベースのセキュリティを構成します。

つまり、Web アプリケーションを作成するときは、PHP を使用するか他の言語を使用するかにかかわらず、SQL インジェクション攻撃の問題を真剣に受け止める必要があります。 SQL インジェクション攻撃の理解と防止を強化することによってのみ、Web アプリケーションの安全な運用をより適切に保護することができます。

以上がPHP 入門: SQL インジェクションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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