-2

asp.netアプリで問題が発生しました。このアプリでは、WHERE句を使用してSQLクエリを動的に構築し、入力されたフィールドに応じてORを追加しています。これがシナリオです。

私は4つのテキストボックスを持っています。2つのうちの1つはDateTimeです。

1つのテキストボックスに値があるかどうかをデータベースで検索し、GridViewにバインドされた結果を返したいと思います。ここで、複数のテキストボックス値がある場合は、それも追加して、where句にORを作成する必要があります。テキストボックスのいずれにも値がない場合は、すべての結果を返す必要があります。しかし、値またはnullがあるかどうかを確認するために、if elseループを実行する必要があるため、クエリの作成に問題があります。これが私のコードです。

          StringBuilder selectQuery = new StringBuilder();
          disCode = SearchTextCouponCode.Text;
          disName = SearchTextCouponName.Text;

          if(StartDate.SelectedDate != null)
                 startDate = StartDate.SelectedDate.ToString("yyyy-MM-dd");

          if(EndDate.SelectedDate != null)     
                 endDate = EndDate.SelectedDate.ToString("yyyy-MM-dd");


          // here is the main thing where i am getting the error
          if (!string.IsNullOrEmpty(disCode))
          {
                 selectQuery.Append("DISCOUNTCode = '" + disCode + "'");

          }

          if (!string.IsNullOrEmpty(disName))
          {
                 selectQuery.Append(" OR DISCOUNTName = '" + disName + "'");

          }

          if (startDate != "0001-01-01")
          {
                 selectQuery.Append(" OR StartDate = '" + startDate + "'");

          }

          if(endDate != "0001-01-01")
                 selectQuery.Append(" OR EndDate = '" + endDate + "'");


          // I am using Object Data Source and the method i am passing is taking care of the SQL injection     
          DataSourceDis.SelectParameters["sqlCriteria"].DefaultValue = selectQuery.ToString();
          GridDis.DataBind();

ここで、アプリを実行し、disCodeテキストボックスを空のままにすると、クエリはORで始まり、構文が正しくないというエラーが表示されます。

助けてください。

////////////////////////////////////////////////// ///////

SQLインジェクションを処理するこのクエリを作成した後、別のメソッドを呼び出しています

////////////////////////////////////////////////// ///////

4

6 に答える 6

3

あなたができる最も簡単なことは次のように変更WHEREすることです:

WHERE 1=0

そして、すべてのWHERE条件がで始まることを確認しますOR


ただし、Richardが指摘しているように、これはベストプラクティスではないため、ストアドプロシージャまたはLINQを使用することをお勧めします。ストアドプロシージャを使用すると、これらすべてのパラメータをプロシージャに渡して、次のようにすることができます。

AND (@disName IS NULL OR DiscountName=@disName)
于 2012-07-16T12:20:14.270 に答える
1

私は一般的にこのようにします。

var conds = new List<string> ();

     // here is the main thing where i am getting the error
      if (!string.IsNullOrEmpty(disCode))
      {
             conds.Add("DISCOUNTCode = '" + disCode + "'");
      }

      if (!string.IsNullOrEmpty(disName))
      {
             conds.Add("DISCOUNTName = '" + disName + "'");
      }

      if (startDate != "0001-01-01")
      {
             conds.Add("StartDate = '" + startDate + "'");
      }

      if(endDate != "0001-01-01")
             conds.Add("EndDate = '" + endDate + "'");

     selectQuery.Append(String.Join(" OR ",conds));

このようなクエリの構築は少し恐ろしいものです。プリペアドステートメント、LINQ、または独自のクエリ構築クラスを使用することをお勧めします。

于 2012-07-16T12:18:09.517 に答える
1

次のように、すべての行を" OR "(開始ではなく)最後に設定できます...

selectQuery.Append("DISCOUNTCode = '" + disCode + "' OR ");

そして、持っている前に.ToString()...

if(selectQuery.Length > 0)
{
  selectQuery.Length -= 4;
}
于 2012-07-16T12:21:51.820 に答える
1

このソリューションを使用すると、WHERE 1=0 ORパフォーマンスに影響を与える可能性があります。

接続詞をマークする変数を作成し、条件を追加するときにそれを変更することをお勧めします

string conjuction = " ";
if (!string.IsNullOrEmpty(disCode)) 
{ 
             selectQuery.Append(conjunction);
             selectQuery.Append("DISCOUNTCode = '" + disCode + "'"); 
             conjuction = " OR ";              
} 

if (!string.IsNullOrEmpty(disName)) 
{ 
             selectQuery.Append(conjunction);
             selectQuery.Append("DISCOUNTName = '" + disName + "'"); 
              conjuction = " OR ";
} 

入力がどこから来ているのかわかりませんが、現在のコードでSQLインジェクション攻撃が発生する可能性があることに注意してください。

于 2012-07-16T12:23:44.550 に答える
0

有効なSQLクエリe.g. SELECT * FROM EMPLOYEE WHERE Name = 'Hat' OR SURNAME = 'SOFT'

クエリがORで始まる場合のように見えます SELECT * FROM EMPLOYEE WHERE OR SURNAME = 'SOFT'。StringBuilderはこのようにクエリを追加しますが、WHEREの直後にOR KEYWORDがあるため、その無効です。

于 2012-07-16T12:17:50.480 に答える
0

disCodeテキストボックスが空の場合、条件は「OR DISCOUNTName」になります。これは間違っており、その後は「OR」を使用できません。

     if (!string.IsNullOrEmpty(disCode))
      {
             selectQuery.Append("DISCOUNTCode = '" + disCode + "'");

      }

      if (!string.IsNullOrEmpty(disName))
      {
             selectQuery.Append(" OR DISCOUNTName = '" + disName + "'");

      }
于 2012-07-16T12:26:40.797 に答える