0

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。このすべてが正しい方法だと思いますか?なにか提案を?

4

1 に答える 1

1

危うしウィル・ロビンソン!ユーザーに任意の SQL を渡すことを許可すると、あらゆる種類のセキュリティの問題が発生します。すべての穴を塞ぐ可能性はわずかです。さらに、クエリを「サニタイズ」する機能は、クエリを解析する能力に基づいています。自分で SQL を解析することは可能ですが、想像力をたくましく考えても簡単ではありません。また、これは Web アプリであるため、SQL インジェクション攻撃の経験が豊富な多くの人々とスキルを競うことになります。

非常に制限されたアクセス許可を持つユーザーを作成することは良いことです (そしておそらくあなたのベストショットです)。ただし、ユーザーがアクセスできるもの (システム ストアド プロシージャ、システム ビューなど) に気を配る必要があります。つまり、db_datareader は十分に制限されていません。まったく新しいルールを作成し、非常に特定のアイテムへのアクセス許可のみを付与する必要があります。

ユーザー (このシナリオではハッカー) が見ることができるデータの一部を制限することに成功したとしても、DOS (サービス拒否) 攻撃に対して脆弱であることに注意してください。

于 2011-02-22T15:45:18.580 に答える