Microsoft SQL Server 2005 データベースを使用して ASP2.0 Web サイトを開発しています。Web サイトがクエリの結果セットを含むページを表示するように、ユーザーが選択クエリを作成できるようにする機能を実装する必要があります (それほど複雑ではありません)。私の質問は、クエリをサニタイズして、挿入/更新/削除/ドロップまたはその他の悪質な注入がないことを確認するにはどうすればよいかということです。
また、結果セットに ID 列を追加できるように、"with" 句でクエリをカプセル化する必要があります。(ページに結果を正しく表示するために必要です)
クエリをフォーマットするための私の CSharp コードは次のようになります (少し単純化されています)。
string query = txtQuery.Text;
query = query.ToLower();
query = query.Trim();
int orderByIndex = query.LastIndexOf("order by");
string orderBy = "";
if (orderByIndex != -1)
{
orderBy = query.Substring(orderByIndex);
query = query.Replace(orderBy, "");
}
query = "with query as (" + query + ") select row_number() over(order by (select 0)) as rowID, * from query " + orderBy;
クエリを実行するストアド プロシージャを作成したいと考えています。私は次のようなことを考えていました:
CREATE PROCEDURE usp_execute_query
@sql nvarchar(max)
with execute as 'RestrictedUser'
as
begin
exec sp_executesql @sql
end
RestrictedUser は次のようになります。
CREATE USER RestrictedUser WITHOUT LOGIN
EXEC sp_addrolemember db_datareader, RestrictedUser
私の質問は次のとおりです: ストアド プロシージャ内の RestrictedUser の役割をチェックして、改ざんされていないことを確認する方法はありますか? そしてもしあればraiserror。このすべてが正しい方法だと思いますか?なにか提案を?