0

最近、次の方法で DataView を介してデータテーブルでフィルタリングを行っています。

        public static DataTable FilterDatatable(this DataTable dtable,string @operator, string colName, string colValue)
        {
            if (dtable != null && dtable.Rows.Count > 0)
            {
                DataView dataView = dtable.DefaultView;

                if (@operator.Equals(SqlOperator.Like , StringComparison.InvariantCultureIgnoreCase))
                {
                    dataView.RowFilter = colName + " " + @operator + " '%" + colValue + "%'";
                }
                else
                {
                    dataView.RowFilter = colName + " " + @operator + " " + colValue;
                }

                return dataView.ToTable();
            }
            return dtable;
        }

ここで、インジェクションを防ぐためのメソッドを書くことができますが(私が知っているインジェクション)、実際には、SQLパラメータと同じようにデータテーブルへのインジェクションを防ぐ最善の方法がわかりません。

上記のメソッドは、単一引用符が追加された文字列を ColVal の引数として送信すると例外をスローします....

4

2 に答える 2

1

データベースのクエリ中にインジェクション攻撃を既に防止している場合は、Sql パラメーターを使用して (最善の方法)、インジェクション防止ログインをメモリ オブジェクトに適用する必要はありません。

于 2012-12-23T11:17:56.060 に答える
1

そのインスタンスでは保護は必要ありません-そのDataTable内のメモリ内に保持されているDataRowsにフィルターを適用してDataTable.Select()いますが、実際にはデータベースに接続/実行していません。

アップデート

このメソッドを作成して、一重引用符の単一インスタンスを2倍にするのはどうですか

private string MethodName(string str)
{
    return str.Replace("'", "''");
}

使用するように、

dataView.RowFilter = colName + " " + @operator + " '%" + MethodName(colValue) + "%'";
于 2012-12-23T11:16:25.973 に答える