我熟悉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)
現在創建以下,並嘗試
CREATE TABLE foo.[[abc]]](x int)
腳本失敗
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]'.
所以不使用QUOTENAME
已引起腳本失敗的錯誤。將右括號加倍不能正確逃脫。正確的語法應該是
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'; --]
的]
被解讀爲封閉的對象名,其餘爲新的聲明。第一條語句返回一條錯誤消息,但不是一個範圍終止,第二條仍然執行。通過不使用QUOTENAME
你已經打開了自己的SQL注入和開發人員已成功地升級其權限
QUOTENAME
可以在生成動態SQL語句時使用。它確實會將您的列名置於括號之間,但也會轉義會破壞您引用的列名稱並可能導致SQL注入的字符。
例如:
SELECT QUOTENAME('abc[]def');
返回結果:
[abc[]]def]
欲瞭解更多信息:QUOTENAME (MSDN)
請您提供有關如何防止注入更多的細節? – user2216
如果你在用戶輸入字符串周圍使用QUOTENAME,這樣的事情不是問題。選擇QUOTENAME('或1 = 1; truncate table Users') –
@ user2216 - 添加示例 –