2012-01-24 7 views
1

私は、通常のデータベースに対処していない(私は私と私の友人のために書いたWebアプリケーションのためのいくつかの小さなものを管理している)だから、私はすべてが私の質問をする前に、どのように動作するかを理解していることを確認するつもりです。アプリケーションでSQL入力が必要で、SQLで処理されないのはなぜですか?

  1. SQLはデータベースを「処理する」プログラムです。それはすべてのテーブルとスキームとリンクを管理し、受け取るコマンドに応じてほとんどすべてを行います。これらのコマンドを手作業で入力するか、コマンドを記述したスクリプトを作成するか、別のプログラムからSQLにこれらのコマンドを送信させることもできますが、コマンドは実際には変更されていません。 Webアプリケーションは、ユーザから受け取った入力を受け取り、それを最初にクリーンアップせずにSQLに送るときに

  2. SQLインジェクションが発生します。もしエンドユーザが十分に綿密であれば、SQLはそれがどこかのテーブルに格納されていると見なされていたコマンドを見ることになり、その結果、厄介なものになります。

  3. 典型的なSQLインジェクションの防止は、データの代わりに、SQLコマンドが送信されたと思わせるであろう任意の文字を除去、つまり、ユーザーの入力を消毒することを伴います。

、私の質問:

なぜSQLが私たちのためにこれを処理しないのですか?なぜ、各コマンドでSQLが最初と最後を見ず、間にあるものを無視しないのですか(私は "標準のSQLコマンド構文の一部ではないと思います。しかし、もしそうでなければ変更が起こる可能性があります)もちろん、(2番目/ 3番目のコマンドは無視されるので)同時に複数のコマンドを送信することはできませんが、 "私は一度に1つのコマンドを送信します"エンドユーザがプルしようとする可能性のある偽りを無視します。

私は他の誰かがこの考えています確信している、といくつかの理由または別のために働いていないとして、それを却下しました。しかし、私は理由を理解するのに十分ではない、と私はしたいと思います。構造化照会言語:「SQL」はプログラムではありませんので、

+3

「私はデータベースについては何も知らない」と言っていますが、「これは間違っていると思います。 – JNK

+0

SQLは、プログラムではなく、データ(構造化照会言語)を照会するための言語です。あなたは、データベースエンジンやOracle、SQL Server、MySQLなどのRDBMS(リレーショナルデータベース管理システム)を考えています – Lamak

+0

これは、 '' joe 'とlastname =' doe''文を ' WHERE name = 'joe' AND lastname = 'doe''式を1つの演算子として使用しますか? –

答えて

6

「SQL」は私たちのためにそれを処理しません、それは言語です。データベースとのインターフェイスを構築するために構築するアプリケーションは、データベースから情報を取得する手段として言語SQLを使用します。我々が構築

アプリケーションでは、データベースと対話するためにAPIのいくつかの並べ替え(アプリケーションプログラマのインタフェース)を使用し、そのAPIは、データベースにSQLを渡します。 (実際には、RDBMSやリレーショナルデータベース管理システム(MySQL、Oracle、MS SQL Server、PostgreSQLなどと考えられる「プログラム」)へ)

実際には、よりスマートなAPIがありますAPIがプリペアドステートメントまたはストアドプロシージャの実行へのアクセスを提供する場合は、独自のサニタイズを行います。

APIがプリペアドステートメントまたはパラメータ化されたクエリを使用しない場合(またはデベロッパーがそれらを使用しないことを選択した場合)SQLインジェクションの潜在的な問題が発生し、データベースに渡すSQL言語のステートメントを直接作成します。この場合のAPIの仕事は簡単です。アプリケーションから渡された文字列をデータベースに渡すだけです。 SQLステートメント自体は入力を受け付けないので(覚えておいてください)、それは有害な情報が含まれていないことを確認するために開発者次第です。

準備された文またはパラメータ化クエリを提供するAPIががその入力を取得し、SQL文でプレースホルダに入力値を変換し、いずれかのパラメータと準備された文を処理するために、RDBMSにネイティブに情報を渡す、またはエミュレートん

より洗練されましたRDBMSにプレーンなSQL文字列を渡す前に、アプリケーションコード内のアクション。その翻訳の一部は、通常、有害な文字に対して値を消毒することを含む。

3

ここでは、コメントについてよく説明されているので、ここでのSQLの誤解には言及する必要はありません。

ただし、SQL は、では、パラメータ化されたクエリと呼ばれるSQLインジェクションを防止する手段を提供しています。基本的には、あらかじめ作成されたコンテンツ(動詞、句など)とユーザー指定の入力の両方を使用してSQLコマンドを作成する場合は、2つの方法で行うことができます。

  • すべてをまとめて1つの文字列にすることができます。 は1つの文字列を渡すだけなので、データベース全体を解析する必要があります。 これはSQLインジェクションが可能になる場所です。

  • のユーザー指定のデータにプレースホルダを使用し、その中に入るものを指定するパラメータ化された文を使用できます。これは がデータベースに渡されたときに、何がデータであるかを確認し、 は何をコマンドにして適切に処理できるかを確認するため、 はSQLインジェクションの脅威を効果的に緩和します( defense-あなたがこれを行う前に入力を綿密に処理する必要があります; 両方を正しく安全にすることを強くお勧めします)。

+0

あなたは、パラメータ化された文があらゆる点で優れているような音を出しました。それはSQLの一部であるのか、それともAPIの何かが(他の回答/コメントでも言及されているように)それはありますか?また、パラメータ化されたバージョンの使用にはトレードオフがありますか? – Kurisu

+1

@Kurisuパラメータ化はAPIを介して行われます。 ** SQL自体は別の言語です。**これは、Javaがどのように効率的にクエリのための生のテキストを問題なく通すことができるかという考え方に基づいて設計されていませんでした。 – JNK

+0

@Kurisuもちろん、声明はそれほど優れていません。データのほかにも、SQL演算子も扱わなければなりません。準備された文はここでは役に立ちません。 –

関連する問題