この記事では、PHP での SQL インジェクションと、PHP-MySQLi および PHP-PDO ドライバーを使用して SQL インジェクションを防止する方法を紹介します。以下、具体的な内容を見ていきましょう。
#簡単な SQL インジェクションの例
たとえば、A は銀行の Web サイトを持っています。銀行顧客が口座番号と残高を確認できるように、Web インターフェイスが提供されています。銀行の Web サイトでは、http://example.com/get_account_details.PHP で SQL インジェクションを防ぐ方法?account_id=102 のような URL を使用してデータベースから詳細を取得します。 たとえば、get_account_details.PHP で SQL インジェクションを防ぐ方法 のコードは次のとおりです。$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 と残高の詳細を取得し、顧客に提供します。 賢明な顧客が 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 インジェクションを回避するには、prepare ステートメントを使用します。 上記の 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 中国語 Web サイトの他の関連コラムに注目してください。チュートリアル! ! !
以上がPHP で SQL インジェクションを防ぐ方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。