0

パラメータを持つ関数があります。この関数は、パラメーターを使用してストアド プロシージャを内部的に呼び出します。また、クライアントは HTTP リクエストを介して関数に文字列を渡すことができます。

パラメータを介して危険な SQL ステートメントを挿入する可能性を排除する方法を追加しようとしています。メソッド名は IsSQLParameterSafe() で、パラメーターに応じてブール値を返します。値が安全に実行できる場合、メソッドは true を返し、それ以外の場合は false を返します。

私の場合、パラメーターに空白を含める必要はないため、空白がある場合は false を返します。また、パラメーターの最大長であるため、入力の長さを最大 64 に制限します。

私の考えはうまくいくと思いますか?そうでない場合は、アイデアを提案できますか?

ありがとう

4

2 に答える 2

1

SQL を手動でつなぎ合わせてから、EXEC コマンドで実行する場合を除き、心配する必要はありません。

たとえば、これは単純なストアド プロシージャです。

CREATE PROCEDURE DeleteRecord
(
@name VARCHAR(64)
)
AS
BEGIN
DELETE FROM Records WHERE [Name] = @name
END

この文字列をプロシージャに渡そうとすると...

name OR 1=1

...その後、この正確な名前を持っている人は誰もいないため、プロシージャは 0 レコードを削除します。

すべてを削除しないのはなぜですか?

ストアド プロシージャは、SQL をつなぎ合わせて大きな文字列にするわけではありません (この種のことは、PHP の初心者向けのチュートリアルでよく見られます)。代わりに、元の SQL ステートメントを渡し、次に各パラメーターを別個の引数として渡します。これがどのように機能するかの技術的な詳細はわかりませんが、スラッシュや引用符、文字化けを追加してもこのクエリが壊れないことは経験からわかっています。

しかし...

動的 SQL を作成していて、パラメーターがテーブルまたは列の名前を表している場合は、より注意する必要があります。そのためにホワイトリストを使用します。

http://www.sommarskog.se/dynamic_sql.html

于 2013-05-29T12:46:10.600 に答える