ホームページ  >  記事  >  バックエンド開発  >  PHP で SQL インジェクションを防ぐ方法

PHP で SQL インジェクションを防ぐ方法

不言
不言オリジナル
2019-02-21 09:50:266030ブラウズ

この記事では、PHP での SQL インジェクションと、PHP-MySQLi および PHP-PDO ドライバーを使用して SQL インジェクションを防止する方法を紹介します。以下、具体的な内容を見ていきましょう。

PHP で 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 サイトの他の関連記事を参照してください。

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