2

私が現在取り組んでいるアプリケーションは、多くの SQL インライン クエリを生成します。生成されたすべての SQL は、データベース実行クラスに渡されます。次のようなクエリを受け取るデータ実行クラスの解析サービスを書きたいと思います。

SELECT field1, field2, field3 FROM tablename WHERE foo=1 AND bar="baz"

そしてそれを次のように変えます:

SELECT field1, field2, field3 FROM tablename WHERE foo=@p1 AND bar=@p2 blah blah blah

C#またはvb.netでこれを達成するためにすでに書かれているものはありますか? これは、このプロジェクトの DAL をリファクタリングする前の一時的なギャップとして意図されています。

更新:私は、Classic ASP から文字通り数千行のインライン SQL を持つ ASP.NET に移植された巨大なアプリケーションを持っています。唯一の救いは、生成されたすべての SQL がデータ実行クラスに渡されることです。実行前にSQLをキャプチャし、アプリ全体を書き直すための一時的なギャップとして、それらをその場でパラメータ化したいと考えています。

4

6 に答える 6

3

これをしないでください。これはあまりにも多くの作業です。さらに、このアプローチには多くのセキュリティ リスクがあります。

少なくとも Command オブジェクトとパラメーター化されたクエリを調べてください。

ここに小さなチュートリアルがあります。

于 2008-10-04T19:11:15.243 に答える
2

今すぐリファクタリングします。

この1つの抽象化レイヤーがより速く、より簡単に入ることができると思うなら、あなたは自分をだましているでしょう。深く掘り下げてみると、プロジェクトのリスクと不確実性が高まることはわかっていますが、SQLインジェクションの問題や魔法の弾丸で戦っている問題をすべて解決したいと考えています。

この新しい解析サブシステムの作成とシステムの回帰テストにかかる時間は、おそらくすべてのインラインコードを、DB上でコードによって生成およびテストされた比較的少数のSPへの呼び出しに置き換えることができます。さらに、1つずつ行うことができます。

デバッグが難しく、最終的なアーキテクチャの外観と実際には一致しない、使い捨てのコードの重要な部分を構築するのはなぜですか?

于 2008-10-06T01:16:58.623 に答える
0

オンザフライでクエリをパラメーター化することで得られる利点は 1 つだけだと思います。それは、SQL インジェクション攻撃に対するアプリケーションの現在の脆弱性を軽減することです。他のすべての点で、期待できる最善の方法は、この仮想的なオンザフライ パーサー/インタープリターが何も壊さないことです。

そのようなことを自分で書く必要がなかったとしても (そしてきっとそうしているに違いありません)、特にアプリをリファクタリングするときに破棄される応急処置であるため、それを実稼働システムに導入することはかなり重大なリスクです。SQL インジェクション攻撃のリスクは、それを正当化するほど高いのでしょうか?

于 2008-10-04T21:36:39.317 に答える
0

Command パラメーターを使用して、必要なことを行うという提案を 2 番目に使用します。あらゆる種類の SQL クエリ文字列の解析は、誰かに SQL インジェクション ゲームをプレイしてほしいと頼んでいるだけです。サンプルコードを以下に示します。Parameters コレクションは、通常の方法で簡単に操作できます。

command.CommandText = "SELECT * FROM table WHERE key_field='?'"
command.Parameters.Append command.CreateParameter(, 8, , , "value") '8 is adBSTR value
set rsTemp = command.Execute
于 2008-10-04T19:56:12.140 に答える
0

あなたの仕事は正直すぎると思います...非常に堅牢なパーサーを作成する必要があります...アプリケーションの書き直しを開始し、クエリが生成されるポイントを見つけてコードをリファクタリングする方が良いと思います。

グッドルック!

于 2008-10-04T20:23:15.143 に答える
0

古いコードで置換正規表現を実行することを検討しましたか? 現在のクエリから値を抽出し、それらをパラメーターに置き換え、クエリ行の後に Command.Parameters.AddWithValue(paramName, paramValue) 呼び出しを追加するものは、現在のインライン SQL がすべて同じ値に従う場合 (またはほとんど残りはお気に入りのエディターで修正できます)。

于 2008-10-04T21:49:35.220 に答える