簡単な SQL インジェクションの例
たとえば、A は銀行の Web サイトを持っています。銀行顧客が口座番号と残高を確認できるように、Web インターフェイスが提供されています。銀行の Web サイトでは、http://example.com/get_account_details.php?account_id=102 のような URL を使用してデータベースから詳細を取得します。
たとえば、get_account_details.php のコードは次のようになります。
$accountId = $_GET['account_id']; $query = "SELECT accountNumber, balance FROM accounts WHERE accountId = $accountId";
顧客の accountId は、クエリ文字列を通じて account_id として渡されます。ユーザーのアカウント ID が 102 で、それがクエリ文字列で渡される場合は、上記の URL と同じです。 Php スクリプトは以下に示すクエリを作成します。
$query = "SELECT accountNumber, balance FROM accounts WHERE accountId = 102";
accountId 102 accountNumber と残高の詳細を取得し、顧客に提供します。
関連する推奨事項: "php チュートリアル"
賢明な顧客が 0 OR 1=1 クエリ文字列と同様に、account_id を渡した別のシナリオを想定してみましょう。今、何が起きた? PHP スクリプトは、以下に示すクエリを作成し、データベース上で実行します。
$query = "SELECT accountNumber, balance FROM accounts WHERE accountId = 0 OR 1=1";
スクリプトによって作成されたクエリとデータベースから返された結果を表示します。このクエリにより、すべての口座と利用可能な残高が返されることがわかります。
これは SQL インジェクションと呼ばれます。これは簡単な方法ですが、SQL インジェクションを実行するにはさまざまな方法があります。 PHP MySQLi ドライバーと PHP PDO ドライバーを使用して SQL インジェクションを防ぐ方法を見てみましょう。
PHP-MySQLi ドライバーの使用
PHP-MySQLi ドライバーの準備済みステートメントを使用すると、この種の SQL インジェクションを回避できます。
SQL インジェクションを防ぐための PHP コードは次のとおりです:
$accountId = $_GET['account_id']; if ($stmt = $mysqli->prepare('SELECT accountNumber, balance FROM accounts WHERE accountId = ?')) { $stmt->bind_param("s", $accountId); $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { // do something here } $stmt->close(); }
PHP-PDO ドライバーを使用する
PHP-PDO ドライバーの準備ステートメントを使用できます。これらのタイプの SQL インジェクションを回避するには。
上記の SQL インジェクションの問題を解決するための PHP のコードは次のとおりです:
$accountId = $_GET['account_id']; if ($stmt = $pdo->prepare('SELECT accountNumber, balance FROM accounts WHERE accountId = :accountId')) { $stmt->execute(array('name' => $name)); foreach ($stmt as $row) { // do something here } $stmt->close(); }
以上がPHPでのSQLインジェクションを防ぐ方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。