私は、ユーザが自分自身のSQL文を入力することを許可していますが、それはSELECT文の場合に限ります。 SQL文がこれ以外のもの、つまりALTER、INSERT、DROPなどであるかどうかを検出する方法はありますか?私は、テーブルをロックするクエリなどの他の懸念について心配しますが、これは今すぐ概念の証明です。私は、アプリケーションを実行しているサーバー上のサービスアカウントをdbに対して読み取り専用権限に制限することができますが、アプリで処理されていることに興味があります。非SELECT SQL文の防止
これは私のアプローチでは、クエリの最初の単語を検出することによって、これは脆弱です。この検出を行うためのよりクリーンな方法がありますか?
public void ExecuteQuery(string connectionString, int id)
{
//The SQL statement will be user input
var sql = "SELECT ColumnA, ColumnB, ColumnC FROM MyTable where MyTableId = @Id";
var split = sql.Split(' ');
if (split[0].ToUpper() != "SELECT") Console.WriteLine("Only use a SELECT statement.");
else
{
using (var connection = new SqlConnection(connectionString))
using (var cmd = new SqlCommand(sql, connection))
{
cmd.Parameters.AddWithValue("@Id", SqlDbType.Int);
cmd.Parameters["@Id"].Value = id;
connection.Open();
var reader = cmd.ExecuteReader();
try
{
while (reader.Read())
{
Console.WriteLine($"{reader["ColumnA"]}, {reader["ColumnB"]},
{reader["ColumnC"]}");
}
}
finally
{
reader.Close();
}
cmd.ExecuteNonQuery();
}
}
}
「TransactionScope」にすべてのものをラップし、決してコミットしないようにすることで、どんなDMLでもロールバックされます。 – Crowcoder
SQL Serverのユーザー権限を管理できますか?どのアカウントでもSQLを実行しているため、SELECT権限のみを付与する必要があります。私はこれが、あなたの提案されたソリューションまたは "コード"ベースのソリューションに対する推奨ソリューションだと思います。 – SimonGates
なぜユーザーは自分のSQL文を作成できるのですか?これは本当に悪い考えです。 sys.columns、sys.columns、sys.columnsから*を選択すると、システム全体が何時間も不自由な状態になります。私にとっては、概念の証明は、SQLデータベースの近くのどこでもこのタイプのアプリケーションを許可しない理由です。 –