準備されたステートメントとも呼ばれるパラメーター化されたクエリは、SQL注入攻撃を防ぐための効果的な方法です。これらを使用する方法は次のとおりです。
ステートメントを作成します。SQLコマンドにユーザー入力を直接埋め込む代わりに、パラメーターのプレースホルダーとのステートメントを準備します。たとえば、ユーザー名でユーザーを選択するSQLクエリで、ユーザー名を直接挿入する代わりにプレースホルダー( ?
)を使用します。
<code class="sql">SELECT * FROM users WHERE username = ?</code>
バインドパラメーター:ステートメントを準備した後、実際のパラメーター値をプレースホルダーにバインドします。このステップは、SQLステートメント自体とは別に行われ、入力がSQLコマンドの一部としてではなくデータとして扱われるようにします。
たとえば、JDBCを搭載したJavaのようなプログラミング言語では、次のようにする場合があります。
<code class="java">PreparedStatement pstmt = connection.prepareStatement("SELECT * FROM users WHERE username = ?"); pstmt.setString(1, userInput); // Binding the user's input to the placeholder ResultSet resultSet = pstmt.executeQuery();</code>
パラメーター化されたクエリを使用することにより、データベースはコードとデータを区別し、ユーザー入力がSQLコマンドの一部として解釈されることはないため、SQLインジェクションのリスクを大幅に削減できます。
パラメーター化されたクエリを実装するには、さまざまなSQLデータベースでいくつかのニュアンスを理解する必要があります。
MySQL :PHPのPDO
やPythonのmysql-connector-python
など、プログラミング言語のデータベースドライバーが提供するパラメーター化されたクエリPREPARE
とEXECUTE
使用を使用します。
<code class="sql">PREPARE stmt FROM 'SELECT * FROM users WHERE username = ?'; SET @username = 'user_input'; EXECUTE stmt USING @username;</code>
PostgreSQL :MySQLと同様に、パラメーター化されたクエリのコマンドPREPARE
およびEXECUTE
するか、データベースドライバーのサポートを使用します。
<code class="sql">PREPARE stmt(text) AS SELECT * FROM users WHERE username = $1; EXECUTE stmt('user_input');</code>
Microsoft SQL Server :アドホッククエリにsp_executesql
を使用するか、プログラミング言語のドライバーを介してパラメーター化されたクエリを使用します。
<code class="sql">EXEC sp_executesql N'SELECT * FROM users WHERE username = @username', N'@username nvarchar(50)', @username = 'user_input';</code>
Oracle :Oracleは、PL/SQLのバインド変数をサポートしています。これは、他のデータベースの作成されたステートメントと同様に使用できます。
<code class="sql">SELECT * FROM users WHERE username = :username</code>
ベストプラクティスには次のものがあります。
パラメーター化されたクエリは、ほとんどの一般的なタイプのSQL注入攻撃に対して非常に効果的です。ユーザー入力が実行可能なコードではなくデータとして扱われるようにすることにより、悪意のあるSQLがクエリに注入されないようにします。しかし、それらはすべての潜在的な脆弱性に対して絶対確実ではありません。
セキュリティを最大化するには、パラメーター化されたクエリを入力検証、出力エンコード、セキュアコーディング標準などの他のセキュリティプラクティスと組み合わせます。
SQLアプリケーションでパラメーター化されたクエリの有効性をテストすることは、SQL注入から保護するために重要です。考慮すべきいくつかの手順と方法は次のとおりです。
'; DROP TABLE users; --
ユーザー名フィールド。アプリケーションがパラメーター化されたクエリを適切に使用する場合、データベースはこれをコマンドとして実行しないでください。自動セキュリティテストツール:OWASP ZAP、SQLMAP、またはバープスイートなどのツールを利用して、SQLインジェクションテストを自動化します。これらのツールは、さまざまな種類の注入を体系的に試みて、パラメーター化されたクエリをバイパスできるかどうかを確認できます。
sqlmapの例:
<code class="bash">sqlmap -u "http://example.com/vulnerable_page.php?user=user_input" --level=5 --risk=3</code>
これらのテスト方法を組み合わせることにより、パラメーター化されたクエリを使用することでSQLインジェクション攻撃を効果的に防止し、アプリケーションの全体的なセキュリティに貢献できるようにします。
以上がSQL注入を防ぐために、SQLでパラメーター化されたクエリを使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。