PHP を使用した安全なプログラミング: SQL インジェクションと防御
現在、インターネットは活況を呈しており、Web サイトやアプリケーションの人気はますます高まっています。これに伴い、セキュリティ上の脅威も増大しています。最も一般的な攻撃手法の 1 つは SQL インジェクションです。 SQL インジェクション攻撃は、入力データを使用して SQL コマンドを変更または改ざんし、バックエンド データベースの内容にアクセス、変更、削除します。この記事では、SQL インジェクション攻撃の原理と防御策、および PHP で安全なプログラミングを実装する方法を紹介します。
SQL インジェクション攻撃の原理:
SQL インジェクション攻撃の原理は非常に単純です。攻撃者は元のデータを悪意のある悪意のあるデータで上書きし、それによってデータ処理プロセスを妨害し、破壊します。 SQL クエリは通常、ユーザーが入力したデータに基づいてプログラムによって構築されるため、攻撃者は入力に特殊文字を追加して、攻撃者が望む結果にクエリを変更する可能性があります。
以下は簡単なサンプル コードです:
$user = $_POST['user']; $password = $_POST['password']; //查询用户是否存在 $sql = "SELECT * FROM users WHERE username='$user' AND password='$password'"; $result = mysqli_query($conn, $sql);
攻撃者が次のコードを入力した場合:
' OR '1'='1
、構築される SQL クエリ ステートメントは次のようになります:
SELECT * FROM users WHERE username='' OR '1'='1' AND password=''
これにより、クエリ ステートメントは常に true 値を返すようになり、攻撃者が認証をバイパスしてデータベースの内容にアクセス、変更、または削除できるようになります。
防御手段:
SQL インジェクション攻撃を防御するにはさまざまな方法があります。一般的に使用される手段の一部を次に示します:
準備されたステートメントは、SQL インジェクション攻撃を防ぐ効果的な方法です。プリペアド ステートメントは、プレースホルダーを使用してクエリ ステートメント内の変数を置き換えます。これらのプレースホルダーはプログラムによって自動的にエスケープされ、データがチェックされます。
次は、プリペアド ステートメントを使用したサンプル コードです:
$user = $_POST['user']; $password = $_POST['password']; //使用预处理语句查询用户是否存在 $stmt = $conn->prepare("SELECT * FROM users WHERE username=? AND password=?"); $stmt->bind_param("ss", $user, $password); $stmt->execute(); $result = $stmt->get_result();
ユーザー入力データを読み取って操作する前に、次のことを行う必要があります。フィルタリングされ、検証されました。 htmlspecialchars() や mysqli_real_escape_string() などの PHP の組み込み関数を使用して、ユーザー入力をフィルタリングできます。
以下は、mysqli_real_escape_string() 関数を使用してユーザー入力をフィルターするサンプル コードです。
$user = mysqli_real_escape_string($conn, $_POST['user']); $password = mysqli_real_escape_string($conn, $_POST['password']); //查询用户是否存在 $sql = "SELECT * FROM users WHERE username='$user' AND password='$password'"; $result = mysqli_query($conn, $sql);
ユーザーがデータを入力する必要があるため、SQL インジェクション攻撃のリスクを軽減できます。フォームのデフォルト値、ドロップダウン メニュー、ラジオ ボタンなどを使用してユーザー入力を減らし、ユーザーの入力長を制限することもできます。
実際のアプリケーションでは、ユーザー入力データのフィルタリングや検証にデータベース関連の関数を使用しないことをお勧めします。これらの機能はデータベースのロックやその他の問題により失敗し、セキュリティの脆弱性につながる可能性があるためです。
結論:
SQL インジェクション攻撃は、短期間に重大な結果を引き起こす可能性がある一般的なネットワーク攻撃手法です。ただし、SQL インジェクション攻撃は、プリペアド ステートメントを使用し、ユーザー入力をフィルタリングし、ユーザー入力を最小限に抑えることで効果的に防御できます。常に警戒し、常に知識を更新することで、オンラインの安全を保ちます。
以上がPHP は安全なプログラミングを実装します: SQL インジェクションと防御の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。