কী ফাংশন এসকিউএল সার্ভারের সাথে ডায়নামিক-এসকিএল-তে একটি সনাক্তকারীকে উদ্ধৃত করে?


11

গতিশীল এসকিএল প্রজন্মের নিরাপদ-উদ্ধৃতি শনাক্তকারীদের এসকিউএল সার্ভার পদ্ধতি কী।

আমি কীভাবে নিশ্চিত করব যে গতিবেগের সাথে উত্পন্ন বিবৃতিটির জন্য গতিশীলভাবে উত্পন্ন কলামের নাম দেওয়া হয়েছে যে কলামটি নিজেই কোনও এসকিউএল-ইনজেকশন আক্রমণ নয়।

ধরা যাক আমার একটি এসকিউএল স্টেটমেন্ট আছে,

SELECT [$col] FROM table;

যা মূলত একই

'SELECT [' + $col + '] FROM table;'

কোন ইনজেকশন আক্রমণ থামায় কোথায়

$col = "name] FROM sys.objects; \r\n DROP TABLE my.accounts; \r\n\ --";

ফলাফল

SELECT [name] FROM sys.objects;
DROP TABLE my.accounts;
-- ] FROM table;

উত্তর:


14

আপনি যে ফাংশনটি সন্ধান করছেন তা হ'ল 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 এটি কোনও টেবিল ফেলে ফেলেছে বা অনুমতি দিয়েছে '-'।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.