আপনি যে ফাংশনটি সন্ধান করছেন তা হ'ল QUOTENAME
!
স্কয়ার ব্র্যাকেট প্রযুক্তির ব্যবহারিক ব্যবহারের মাধ্যমে আপনি গরম এসকিউএল ইঞ্জেকশন আক্রমণ প্রতিরোধে সহায়তা করতে স্ট্রিংগুলি নিরাপদে আবদ্ধ করতে পারেন।
লক্ষ্য করুন কিছু প্রায় বর্গাকার বন্ধনী স্টিকিং নেই না নিরাপদে বের উদ্ধৃত যদিও আপনি বস্তুর নাম অবৈধ অক্ষর সঙ্গে erroring আপনার কোড এড়াতে পারবেন।
ভাল কোড
DECLARE @sql NVARCHAR(MAX) = N''
SELECT @sql = 'SELECT ' + QUOTENAME(d.name) + ' FROM your_mom'
FROM sys.databases AS d
খারাপ কোড
DECLARE @sql NVARCHAR(MAX) = N''
SELECT @sql = 'SELECT [' + d.name + '] FROM your_mom'
FROM sys.databases AS d
একটি নির্দিষ্ট উদাহরণ দিতে ...
নিম্নলিখিত ইনপুট জন্য নিম্নলিখিত কাজ করে
DECLARE @ObjectName SYSNAME = 'sysobjects';
DECLARE @dynSql NVARCHAR(MAX) = 'SELECT COUNT(*) FROM [' + @ObjectName + ']';
EXEC (@dynSql);
তবে দূষিত ইনপুট সহ এটি এসকিউএল ইঞ্জেকশনের পক্ষে ঝুঁকিপূর্ণ
DECLARE @ObjectName SYSNAME = 'sysobjects];SELECT ''This is some arbitrary code executed. It might have dropped a table or granted permissions''--'
DECLARE @dynSql NVARCHAR(MAX) = 'SELECT COUNT(*) FROM [' + @ObjectName + ']';
EXEC (@dynSql);
QUOTENAME
সঠিকভাবে ব্যবহার এম্বেড থাকা থেকে পালিয়ে যায় ]
এবং চেষ্টা করা এসকিউএল ইঞ্জেকশনটি ঘটতে বাধা দেয়।
DECLARE @ObjectName SYSNAME = 'sysobjects];SELECT ''This is some arbitrary code executed. It might have dropped a table or granted permissions''--'
DECLARE @dynSql NVARCHAR(MAX) = 'SELECT COUNT(*) FROM ' + QUOTENAME(@ObjectName);
EXEC (@dynSql);
অবৈধ অবজেক্টের নাম 'সিসোবজেক্টস]; নির্বাচন করুন' এটি কিছু নির্বিচার কোড প্রয়োগ করা হয়েছে code এটি কোনও টেবিল ফেলে ফেলেছে বা অনুমতি দিয়েছে '-'।