7

私が自分のプログラムで最初の SQL ステートメントを書き始めたとき、同僚が教えてくれた非常に簡単な方法で SQL インジェクションから身を守ることに非常に満足していました。すべての一重引用符を 2 つの一重引用符に置き換えました。

たとえば、顧客名を入力して顧客テーブルを検索できる検索フィールドがあります。あなたが入るなら

ピーターの理髪店

SELECT ステートメントは次のようになります。

SELECT *
FROM Customers
WHERE Customername = 'Peter''s Barbershop'

攻撃者がこれを挿入する場合:

';DROP TABLE FOO; --

ステートメントは次のようになります。

SELECT *
FROM Customers
WHERE Customername = ''';DROP TABLE FOO;--'

どのテーブルも削除しませんが、顧客テーブルで顧客名 ';DROP TABLE FOO;-- これはおそらく見つからないでしょう ;-) を検索します。

このメソッドを使用してステートメントを作成し、SQL インジェクションから身を守った後、多くの開発者がパラメーター化されたステートメントを使用していることを読みましたが、「私たちの」メソッドが使用された記事を読んだことはありません。したがって、それには間違いなく正当な理由があります。

パラメータ化されたステートメントはどのシナリオをカバーしますが、私たちの方法はカバーしませんか? 私たちの方法と比較して、パラメータ化されたステートメントの利点は何ですか?

ありがとう
フィリップ

4

5 に答える 5

4

パラメータ化されたクエリには、sql-injectionに対する防御よりも多くのprocがあります。

  1. 日付と時刻のフォーマットと解析に関する問題を解決します。
  2. パラメータ化されたクエリの実行プランを準備できます。
  3. SQLインジェクション保護。

私は今、別のプロのために思い出せません:)。

ただし、「すべての引用符を2倍にする」方法には、文字の長さが制限されているフィールドで問題があります。

例えば:

  • このページには、10文字の「ニックネーム」のボックスがあります。
  • ユーザーは「Don'tcare」を挿入します-正確に10文字です。

ここで、引用符を2倍にすると、値は11文字になり、データベースはそれを「カット」し、ユーザーが入力した値とは別の値をdbに取得します。

だから私はパラメータをお勧めします。

于 2010-04-28T15:36:20.120 に答える
2

大きな欠点の1つは、ソリューションが開発者が文字を追加することを覚えていることに依存していることです。明らかに、コンパイラーは文句を言いません。それは危険です。

次に、Jeffがここで指摘しているように(2005年に!!!)、パラメーター化されたSQLステートメントを使用してパフォーマンスを向上させる必要があります。

于 2010-04-28T15:34:18.260 に答える
1

簡単な答え:
データベースサーバーは、エスケープする必要のある文字を自分よりもよく知っているという理由だけで、パラメーター化されたクエリを使用する必要があります。

長い答え:
'エスケープが必要な特殊文字は必ずしも唯一ではありません。これらの特殊文字は、DBサーバーごとに異なります。たとえば、MySQLは\エスケープ文字としても使用します(sql_mode=NO_BACKSLASH_ESCAPES設定されていない場合)。したがって、同じこと''を意味します。\'

これは、たとえばOracleには当てはまりません。

于 2010-04-28T15:52:17.940 に答える
1

1つの利点は、ドライバー自身が、何をエスケープする必要があるか、何をエスケープする必要がないかを決定することです。次のような入力でメソッドが壊れている可能性があります。

  \'; DROP TABLE foo;--

その結果、

  SELECT *
  FROM Customers
  WHERE Customername = '\'';DROP TABLE FOO;--'

最初の引用符はエスケープされますが、2番目の引用符はエスケープされず、文字列を閉じます。

于 2010-04-28T15:36:07.080 に答える
0

私たちの方法と比較したパラメータ化されたステートメントの利点は何ですか?

利点は、間違いを犯しにくいことです。パラメータ化された方法を実行することはできず、引用符を置き換えることを忘れます。また、引用符の置き換えは、2回行うと脆弱になります。

パラメータ化されたクエリの欠点(および私がそれらを使用しない理由)は複雑さです。RSIを取得する前に、10倍のアドホッククエリを作成できます。

于 2010-04-28T15:34:03.530 に答える