1

私は次の機能を持っています:

public DataTable GetRecordSet(String query, string[] parameters)

通常、次のように使用されます。

DataTable dt = GetRecordSet( "select * from objects where ob_id = @obid and ac_id = @acid", new[] { objectId, accountId });

GetRecordSet メソッドは、クエリ パラメーターを解析して @ で始まる単語を検索し、SqlCommand オブジェクトに渡される適切な SqlParameter オブジェクトを作成します。この場合、2 つのパラメーターが作成されます。

クエリ パラメーターは常に私が提供します。パラメーター配列にはユーザーからのデータが含まれる場合があります。

文字列からパラメーター名を生成しているため、SQL インジェクション対策をうっかり回避してしまうのではないかと心配しています。この方法は安全ですか?

更新: GetRecordSet は次のように選択コマンドを取得します。

SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = GetSqlCommand(query, parameters);

GetSqlCommand メソッド:

private SqlCommand GetSqlCommand(string query, string[] parameters)
{
    SqlCommand sq = new SqlCommand(query, myConnection);

    // enum parameters
    // get name of parameter from the query string and add it to the SqlCommand
    SqlParameter p;
    string[] paramNames = query.Split('@');
    string name;

    int paramCounter = 0;
    if (parameters != null)
    {
        foreach (string param in parameters)
        {
            paramCounter += 1;
            if (param != "")
            {
                try
                {
                    if (paramNames.Length > paramCounter)
                    {
                        name = paramNames[paramCounter].Split(' ')[0];

                        p = new SqlParameter(name, param);
                        sq.Parameters.Add(p);
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error: {0}", ex);
                }
            }
        }
    }
    return sq;
}
4

2 に答える 2

1

上記のコードは SQL インジェクションから安全です -パラメータ名を悪用する方法がありますが、このコードはその特定の問題から安全です。

もちろん、100%確実というわけではありませんが、これで十分です。

于 2012-07-29T18:44:14.440 に答える
0

いいえ。外部からパラメーターを渡す唯一の方法は、明示的に識別されているか、適切に引用されている場合です。テキストの任意のブロックをクエリに挿入するだけでは安全ではありません。

于 2012-07-29T19:05:35.027 に答える