1

私は現在、SQL インジェクションに対する強固なセキュリティを必要とするアプリケーションを作成しています。私の質問はこれです。SQL インジェクションを防ぐために、入力パラメーターを準備ステートメントから分離することは絶対的な要件ですか?それとも、SQL インジェクションがないようにステートメントを単純に準備できますか?

つまり、mysqli_prepare を単純なチェックとして使用して、以前に作成したステートメントに SQL が挿入されていないことを確認できますか? それとも、パラメーターをバインドし、サーバーから返された情報を処理するために返された後続のステートメント構造を使用するプロセス全体ですか?

4

4 に答える 4

2

ステートメントの準備は、SQL エンジンによって行われます。事前にサーバーにクエリを送信します。たとえば、次のようにします。

Prepare : SELECT id, x FROM y WHERE id = ?

次に、?データにバインドされます。抽象化レイヤーもこれを強く型付けすることができます (データをフォーマットして入力する前に明示的なキャストを行うことができるため、PDO はこれを行うことができます)。

準備では、データとステートメント (クエリ) は完全に分離されています。クエリはサーバー上で待機しており、呼び出す準備ができています。データ フィールドが存在する場合は、入力を待ちます。

これには、ロジックとデータを完全に分離できるという大きな利点があります。また、クエリがサーバーに保存され、すぐに呼び出されるためです。これは、大量のデータを挿入するクエリを何千回も呼び出す必要がある場合、ほとんどの場合、パフォーマンスのために準備する方がよいことを意味します。

ユーザー入力が既に含まれているステートメントを準備するだけでは安全ではありません。ユーザー入力を追加する前に、データとロジックを分離する必要があります。

于 2013-06-03T14:42:21.253 に答える