4

私はここで少し悪い状況にあります。私はコマースサーバーでの作業に行き詰まっています。コマースサーバーは、多くのサニタイズ/パラメーター化を行いません。

SQLインジェクションを防ぐためにクエリを構築しようとしていますが、検索オブジェクトのsearchs / where句などを構築する必要があり、パラメータ化されたインターフェイスがありません。

基本的にパラメータ化することはできませんが、可能であれば同じエンジンを使用してクエリテキストを作成できるようにしたいと考えていました。これを行う方法はありますか?それ以外に、パラメーター化されたクエリほど良くない可能性のある独自のパラメーター化エンジンを作成する方法はありますか?

更新:例

where句は、基本的にSQLクエリのwhere句として作成する必要があります。

CatalogSearch search =  /// Create Search object from commerce server
search.WhereClause = string.Format("[cy_list_price] > {0} AND [Hide] is not NULL AND [DateOfIntroduction] BETWEEN '{1}' AND '{2}'", 12.99m, DateTime.Now.AddDays(-2), DateTime.Now);

*上記の例は、検索を絞り込む方法ですが、いくつかのテストを行ったため、この文字列はサニタイズされていません

これが私の問題です。.Formatの入力はすべてユーザー入力である可能性があり、テキストボックスからの入力を簡単にクリーンアップできますが、エッジケースを見逃してしまいます。これは、物事の性質にすぎません。 。Commerce Serverには、拡張可能なフィールドのセット(スキーマ)の処理方法に非常識な後方ロジックがあり、フリーテキスト検索ワードがどこかにプリコンパイルされているため、ここではパラメーター化されたクエリを使用するオプションがありません。これは、SQLテーブルに直接移動できないことを意味します

私が/love/に見たいのは、次のようなものです。

SqlCommand cmd = new SqlCommand("[cy_list_price] > @MinPrice AND [DateOfIntroduction] BETWEEN @StartDate AND @EndDate");
cmd.Parameters.AddWithValue("@MinPrice", 12.99m);
cmd.Parameters.AddWithValue("@StartDate", DateTime.Now.AddDays(-2));
cmd.Parameters.AddWithValue("@EndDate", DateTime.Now);

CatalogSearch search = /// constructor
search.WhereClause = cmd.ToSqlString();
4

1 に答える 1

1

クエリを作成する前に、古い学校に行って自分でデータを検証する必要があるようです。私は .NET の専門家ではありませんが、CGI の世界では次のような方法で入力をサニタイズします。

$foo =~ s/[^a-zA-Z0-9*%]//g

これにより、考えられる SQL インジェクションが阻止され、ワイルドカードを使用できるようになります。唯一の問題は、正規表現が高価であることです。

于 2010-05-05T18:08:48.180 に答える