私は Asp.net が初めてで、クラスを使い始めたばかりです。最近、すべてのファイルに対して新しい接続を繰り返し作成する必要がないように、ほとんどの SQL クエリを処理するクラスを作成しました。
私が作成したメソッドの 1 つは、SQL クエリをパラメーターとして受け取り、結果を返します。SQL インジェクションを避けるために、パラメーター化されたクエリを使用する必要があることはわかっています。私の質問は、クエリを文字列パラメーターとして渡すときにこれを行うにはどうすればよいですか?
たとえば、次のメソッドを呼び出します。
public static DataTable SqlDataTable(string sql)
{
using (SqlConnection conn = new SqlConnection(DatabaseConnectionString))
{
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Connection.Open();
DataTable TempTable = new DataTable();
TempTable.Load(cmd.ExecuteReader());
return TempTable;
}
}
したがって、別のファイルから、このメソッドを次のように使用したいと思います。
DataTable dt = new DataTable();
dt = SqlComm.SqlDataTable("SELECT * FROM Users WHERE UserName='" + login.Text + "' and Password='" + password.Text + "'");
if (dt.Rows.Count > 0)
{
// do something if the query returns rows
}
これは機能しますが、それでもインジェクションに対して脆弱でしょうか? 変数をパラメーターとして文字列に渡す方法はありますか? クエリ用に新しい SQLCommand オブジェクトを作成し、Parameters.AddWithValue を使用すれば、これを実行できることはわかっていますが、すべての SQL コマンドを別のクラスに配置したかったのです。