この記事では、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";
$query = "SELECT accountNumber, balance FROM accounts WHERE accountId = 102";
$query = "SELECT accountNumber, balance FROM accounts WHERE accountId = 0 OR 1=1";
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 で SQL インジェクションを防ぐ方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。