私はQUOTENAMEの機能について知っています。しかし、私はそれを使うことができるのか分からないのですか?なぜそれが広く使われているのですか?なぜQUOTENAME関数を使用すべきですか?
select quotename('[abc]') -- '[[abc]]]'
select quotename('abc') -- '[abc]'
select '[' + 'abc' +']' -- why it is not so good as previous?
私はQUOTENAMEの機能について知っています。しかし、私はそれを使うことができるのか分からないのですか?なぜそれが広く使われているのですか?なぜQUOTENAME関数を使用すべきですか?
select quotename('[abc]') -- '[[abc]]]'
select quotename('abc') -- '[abc]'
select '[' + 'abc' +']' -- why it is not so good as previous?
dbo
スキーマ以外のスキーマの表をクリーンアップするために、次のスクリプトが定期的に実行されるとします。
DECLARE @TABLE_SCHEMA SYSNAME,
@TABLE_NAME SYSNAME
DECLARE @C1 AS CURSOR;
SET @C1 = CURSOR FAST_FORWARD
FOR SELECT TABLE_SCHEMA,
TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA <> 'dbo'
OPEN @C1;
FETCH NEXT FROM @C1 INTO @TABLE_SCHEMA, @TABLE_NAME;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'DROP TABLE [' + @TABLE_SCHEMA + '].[' + @TABLE_NAME + ']';
EXEC ('DROP TABLE [' + @TABLE_SCHEMA + '].[' + @TABLE_NAME + ']');
FETCH NEXT FROM @C1 INTO @TABLE_SCHEMA, @TABLE_NAME;
END
次のスクリプトを作成してスクリプトを実行すると、手動文字列連結アプローチを使用してもすべてが正常に動作します。テーブルfoo.bar
は削除されます。
CREATE SCHEMA foo
CREATE TABLE foo.bar(x int)
は今すぐ次のものを作成し、スクリプトがエラーので、スクリプトが失敗する原因となったQUOTENAME
を使用していない
DROP TABLE [foo].[[abc]]
Msg 105, Level 15, State 1, Line 6
Unclosed quotation mark after the character string '[abc]'.
Msg 102, Level 15, State 1, Line 6
Incorrect syntax near '[abc]'.
で失敗
CREATE TABLE foo.[[abc]]](x int)
を試してみてください。閉鎖ブラケットは、それを倍にすることによって適切にエスケープされませんでした。正しい構文は
DROP TABLE [foo].[[abc]]]
さらに悪いニュースが悪意のある開発者がスクリプトの存在を知るようになったということですされている必要があります。スクリプトの実行がスケジュールされる直前に、次のスクリプトが実行されます。
CREATE TABLE [User supplied name]];
EXEC sp_addsrvrolemember 'SomeDomain\user2216', 'sysadmin'; --]
(
x int
)
次に実行されてしまうスクリプトである
DROP TABLE [foo].[User supplied name];
EXEC sp_addsrvrolemember 'SomeDomain\user2216', 'sysadmin'; --]
]
オブジェクト名と新しい文として残りを閉鎖するように解釈されました。最初のステートメントはエラーメッセージを返しましたが、スコープは終了せず、2番目のステートメントはまだ実行されていました。 QUOTENAME
を使用しないと、SQLインジェクションまで自分自身を開き、開発者が権限をエスカレートしました。
QUOTENAME
は、動的SQL文を生成するときに使用できます。実際には、カラム名は大括弧で囲まれますが、引用されたカラム名を壊してSQLインジェクションを引き起こす可能性のある文字をエスケープします。例えば
:
SELECT QUOTENAME('abc[]def');
が返されます:詳細情報については
[abc[]]def]
あなたは、これは注射を防ぐ方法の詳細をお願いしてもらえますか? – user2216
ユーザ入力文字列のまわりにQUOTENAMEを使用すると、このようなことは問題になりません。 QUOTENAME( 'または1 = 1;テーブルのユーザを切り捨てる)を選択してください –
@ user2216 - 例が追加されました –