1

問題が発生しています。これを機能させたいのですが、機能しません:

SqlDataSource.SelectCommand = "SELECT blah1, blah2 FROM myTable WHERE @ColumnName = @Value";

SqlDataSource.SelectParameters.Add("ColumnName", System.Data.DbType.String, "one");
SqlDataSource.SelectParameters.Add("Value", System.Data.DbType.String, "two");

最初のパラメーター "ColumnName" は置き換えられません。そのパラメーターを削除して、列名を次のように配置すると、機能します。

SqlDataSource.SelectCommand = "SELECT blah1, blah2 FROM myTable WHERE one = @Value";

SqlDataSource.SelectParameters.Add("Value", System.Data.DbType.String, "two");

ユーザーが検索する DB 列名を選択できる UI があります。あらゆる種類のインジェクション攻撃から身を守りたい。これを機能させる方法はありますか?

私が読んだアイデアの 1 つは、ルックアップ テーブルを使用して からインデックスを取得し、DropDownListそのように列名を取得するというものでした。私はそれを機能させることができましたが、可能であればパラメータ化を機能させたいと思っています。

あなたが提供できる助けを前もって感謝します。

4

3 に答える 3

2

クエリ パラメータは、SQL が解析されて実行計画が生成された後に解決されるため、パラメータを使用して実際に動的に SQL を構築することはできません。もちろん、安全な方法で SQL 文字列自体を作成することをお勧めします。おそらく最初にenum、有効な列名の を作成します。

enum DbColumns { One, Two, Three };

次に、次のように SQL 文字列を作成します。

DbColumns colName = (DbColumns)Enum.Parse(typeof(DbColumns), "One");
SqlDataSource.SelectCommand = String.Format("SELECT blah1, blah1 FROM myTable WHERE {0} = @Value", colName);

別のアイデアは、正規表現を使用して列名を検証することです。おそらく[a-z].

于 2013-03-14T21:25:08.043 に答える
1

私はあなたがそれをすることができないのではないかと思います、あなたが代わりにできることはちょっとしたトリックです:

SELECT blah1, blah1 FROM myTable 
WHERE (@blah1 is null or blah1 = @blah1)
   or (@blah2 is null or blah2 = @blah2)

すべてのパラメータ@blah1、@ blah2を指定しますが、必要なものだけを割り当てます。

Mike Christensenが提供するNBソリューションは、基本的に適切な条件でストリングを構築することです。これは、最も単純なケースでは次のようになります。

public bool BuildQueryWithCondition(string fieldName, string fieldValue) {
   var queryTemplate = "SELECT blah1, blah1 FROM myTable WHERE {0} = @Value"
     , query = string.Format(queryTemplate, fieldName)
   SqlDataSource.SelectCommand = query;
   SqlDataSource.SelectParameters.Add("Value", System.Data.DbType.String, fieldValue);
}
于 2013-03-14T21:11:10.653 に答える
0

パラメータ化された列名の回避策を含める方法を見つけました。私は同じ問題を抱えていましたが、別の方法を思いつきました。列名を使用しているのは私だけなので、これはまだ安全な賭けだと思います。

            String sqlcomm = "SELECT * FROM Asset WHERE " + assetColName + " = ";
            command.CommandText = sqlcomm + "$assetColValue";

            //command.CommandText = @"SELECT * FROM Asset WHERE $assetColName = '$assetColValue'";
            //command.Parameters.AddWithValue("$assetColName", assetColName);

            command.Parameters.AddWithValue("$assetColValue", assetColValue);

上記のコードからわかるように。私はあなたがしたことをほとんど試しましたが、コメントアウトしなければなりませんでした。次に、文字列を連結し、パラメータ化された列名と値を使用して、値を安全に追加することができました。ただし、列名は保護されていませんが、これは私だけが使用する方法であるため、ある程度安全です。より安全にしたい場合は正規表現を追加できますが、修正のアイデアは得られます。

于 2013-09-25T15:14:27.763 に答える