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

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

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼オリジナル
2019-09-27 16:15:353208ブラウズ

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

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

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