প্যারামিটারটি স্ট্রিং না হয়ে এসকিউএল কোয়েরিটি পরামিতি করা কি নিরাপদ?


113

নিরিখে এসকিউএল ইনজেকশন , আমি সম্পূর্ণভাবে parameterize প্রয়োজনীয়তা বুঝতে stringপরামিতি; এটি বইয়ের প্রাচীন কৌশলগুলির মধ্যে একটি। কিন্তু কখন প্যারামিটারাইজ না করা ন্যায়সঙ্গত হতে পারে SqlCommand? প্যারামিটারাইজ না করার জন্য কোনও ডেটা ধরণের কি "নিরাপদ" হিসাবে বিবেচিত হয়?

উদাহরণস্বরূপ: আমি নিজেকে এসকিউএল বিশেষজ্ঞের কাছাকাছি কোথাও বিবেচনা করি না , তবে এসকিউএল ইঞ্জেকশনটি সম্ভবত কোনও boolবা একটি গ্রহণ করার জন্য intএবং এটি কেবল অনুসন্ধানের সাথে যুক্ত করে তুলতে হবে এমন কোনও ক্ষেত্রে আমি ভাবতে পারি না ।

আমার অনুমানটি কি সঠিক, বা এটি কি আমার প্রোগ্রামে একটি বিশাল সুরক্ষার দুর্বলতা সম্ভাব্যভাবে ছাড়তে পারে?

স্পষ্টতার জন্য, এই প্রশ্নটি ট্যাগ করা এটি একটি দৃ strongly়-টাইপিত ভাষা; যখন আমি "প্যারামিটার" বলি, তখন এরকম কিছু ভাবুন public int Query(int id)


14
প্যারামিটার ব্যবহার না করা থাকলে আপনি ক্যাশেড ক্যোয়ারী প্ল্যানগুলির সুবিধা পাবেন না, আপনার দেওয়া প্রতিটি ইনপুটগুলির সংমিশ্রণের জন্য একটি পৃথক ক্যোয়ারী পরিকল্পনা করা দরকার।
স্কট চেম্বারলাইন

5
@ ম্যাথিউয়েইটেড আপনি কীভাবে জানবেন যে এতে কম সময় লাগে? এই পরিস্থিতি বর্তমান বিকাশকারী এবং পূর্ববর্তী বিকাশকারী থেকে নির্দিষ্ট প্রকল্পগুলিতে সমস্ত জায়গায় ঘটে। যদি এটি আসলে সুরক্ষার উন্নতি করে তবে দয়া করে একটি উত্তর পোস্ট করুন। স্পষ্টতার জন্য, আমি সম্মত হই না যে স্পষ্টতই, পরামিতি করা আরও ভাল। তবে এটি আসলে আমার প্রশ্ন নয়।
johnnyRose

7
প্যারামিটারাইজড কোয়েরিগুলি প্রাথমিকভাবে কর্মক্ষমতা এবং অপ্টিমাইজেশনের জন্য ব্যবহৃত হয়। এসকিউএল ইঞ্জেকশন প্রতিরোধ একটি পার্শ্ব প্রতিক্রিয়া।
সালমান এ

13
আমি মনে করি ওপি একটি কার্যকর প্রশ্ন জিজ্ঞাসা করেছে। তিনি সম্ভাব্য ঝুঁকি নির্ধারণের জন্য মূল্য / সুবিধার মূল্যায়ন করার চেষ্টা করছেন। সেই সমীকরণটি সেই ঝুঁকির সম্ভাবনার সাথে পরিবর্তিত হয়। যদি শূন্য ঝুঁকি থাকে তবে আমি এটিও করতাম না। তিনি সম্ভাব্যতা সম্পর্কে একটি প্রযুক্তিগত প্রশ্ন জিজ্ঞাসা করেছেন, আপনি তার সময়কে উপযুক্ত বলে মনে করেন কিনা তার বিষয়গত বিচারের জন্য নয়। ওপি হ'ল এই কলটি করতে পারে।
স্যার

10
নিজেকে ব্যাখ্যা করার জন্য: আমি একটি ডিবিএ আমি সেরা অনুশীলনের প্রশংসা করি এবং সম্মান করি এবং একটি নিখুঁত বিশ্বে সমস্ত কোড নিখুঁত হয়। দুঃখের সাথে আমি যে সংসারে কাজ করি, সেগুলি সমাধান করার সময় দেওয়ার চেয়ে আমার আরও বেশি সমস্যা সমাধান হয়েছে That এর অর্থ অগ্রাধিকার। আইএমও রাইটারিং কোড যা ইতিমধ্যে কাজ করে, সুরক্ষিত এবং গ্রহণযোগ্য স্তরের কাছে বিলাসিতার মতো শব্দ করে। (যা আমি সহ্য করতে পারি না)
স্যার

উত্তর:


101

আমি মনে করি এটি নিরাপদ ... প্রযুক্তিগতভাবে , তবে এটি getোকা একটি ভয়ানক অভ্যাস। আপনি কি সত্যিই এই জাতীয় প্রশ্ন লিখতে চান?

var sqlCommand = new SqlCommand("SELECT * FROM People WHERE IsAlive = " + isAlive + 
" AND FirstName = @firstName");

sqlCommand.Parameters.AddWithValue("firstName", "Rob");

এটি আপনাকে এমন পরিস্থিতিতেও দুর্বল করে দেয় যেখানে কোনও ধরণের পূর্ণসংখ্যার থেকে স্ট্রিতে পরিবর্তিত হয় (চিন্তা করুন কর্মচারীর নম্বর যা এর নাম সত্ত্বেও - চিঠিগুলি থাকতে পারে)।

সুতরাং, আমরা থেকে EmployeeNumber ধরণ পরিবর্তন করেছি intকরতে string, কিন্তু আমাদের SQL কোয়্যারিগুলোকে আপডেট করতে ভুলে গেছি। উফ।


24
আমরা কি AddWithValue ইতিমধ্যে ব্যবহার বন্ধ করতে পারি ? blogs.msmvps.com/jcoehoorn/blog/2014/05/12/…
রেকর্ডলিমা

5
@ রিমার্কলিমা আপনি যখন গতিশীল কোনও কোড তৈরি করছেন যা সমাধানের ক্ষেত্রে প্যারামিটারগুলিতে মানচিত্র মানাবে? ব্লগ পোস্টটি সেই দৃশ্যের সমাধান করতে ব্যর্থ। হ্যাঁ, এসকিউএল টাইপটি জানা হয়ে গেলে এটি সেট করার জন্য এটি একটি একক লাইন , কিন্তু যখন এটি না হয়, তখন আপনার সমস্যা হয় (বা আপনাকে সেই তথ্য সহ মডেলগুলি টিকিয়ে রাখতে হবে)।
ক্যাস্পার ওয়ান

1
AddWithValueবিবৃতিটির গতিশীল বিল্ডিংয়ের অংশ হিসাবে আপনার কাছে ডাটাবেস ধরণের ম্যাপিং না থাকলে আপনি আটকে রয়েছেন। আমি ধরে নেব যে আপনার কাছে টার্গেট কলামগুলির একটি তালিকা রয়েছে এবং অভিধানের অংশ হিসাবে আপনি যদি চান তবে আপনার ধরণের থাকতে পারে। অন্যথায়, শুধু পারফরম্যান্স হিট নিতে। শেষ পর্যন্ত, আমি মনে করি তা জানার জন্য এটি কেবলমাত্র ভাল তথ্য।
রিমার্কলিমা

8
@RemarkLima এই বিষয়টিটি হ'ল "আমরা কি AddWithValueইতিমধ্যে ব্যবহার বন্ধ করতে পারি ?" আসলেই করা উচিৎ "যদি আপনি টাইপ জানি, তারপর আপনি ব্যবহার করা থেকে বিরত থাকুন AddWithValue
casperOne

2
আরে, ম্যাসেঞ্জারটিকে গুলি করবেন না, আমি এটি লিখি না ;-) তবে পয়েন্টটি রয়ে গেছে, এবং যদি শুরু থেকেই আপনার ডিজাইনগুলি তৈরি করা হয় তবে আপনার ধরণটি না জানার কোনও কারণ নেই। সেরা অনুশীলন এবং সমস্ত জাজ :-)
রেমার্কলিমা

65

একটি কম্পিউটার আপনি (ওয়েব সার্ভার মত) নিয়ন্ত্রণ একটি জোরালোভাবে টাইপ প্ল্যাটফর্ম ব্যবহার করার সময়, আপনি শুধুমাত্র সঙ্গে প্রশ্নের কোড ইনজেকশন প্রতিরোধ করতে পারি bool, DateTimeঅথবা int(এবং অন্যান্য সাংখ্যিক) মান। উদ্বেগের বিষয়টি হ'ল এসকিএল সার্ভারকে প্রতিটি ক্যোয়ারী পুনরায় সংকলন করতে বাধ্য করার কারণে এবং কী কী ফ্রিকোয়েন্সি (যা ক্যাশে পরিচালনায় ব্যাঘাত ঘটায়) দিয়ে কী প্রশ্নগুলি চালিত হয় সে সম্পর্কে ভাল পরিসংখ্যান পেতে বাধা দেওয়ার মাধ্যমে কার্য সম্পাদন সমস্যা issues

তবে "যে কম্পিউটারটি আপনি নিয়ন্ত্রণ করেন" সেই অংশটি গুরুত্বপূর্ণ, কারণ অন্যথায় কোনও ব্যবহারকারী নির্বিচারে পাঠ্য অন্তর্ভুক্ত করার জন্য সেই মানগুলি থেকে স্ট্রিং উত্পন্ন করার জন্য সিস্টেমের দ্বারা ব্যবহৃত আচরণ পরিবর্তন করতে পারে।

আমি দীর্ঘমেয়াদী ভাবতেও পছন্দ করি। আজকের পুরানো এবং-ফাঁদে জোরালোভাবে টাইপিত কোড বেসটি নতুন হটনেস গতিশীল ভাষায় স্বয়ংক্রিয় অনুবাদের মাধ্যমে পোর্ট হয়ে যায় এবং আপনি হঠাৎ টাইপ চেকিংটি হারিয়ে ফেলেন, তবে ডায়নামিক কোডের জন্য এখনও সমস্ত সঠিক ইউনিট টেস্ট নেই ?

সত্যই, এই মানগুলির জন্য ক্যোয়ারী প্যারামিটার ব্যবহার না করার কোনও ভাল কারণ নেই। এটি সম্পর্কে সঠিক উপায় । স্কেল স্ট্রিংয়ে যখন হার্ড-কোড মানগুলি সত্যই ধ্রুবক হয় তখন আরও এগিয়ে যান, তবে অন্যথায়, কেন কেবল পরামিতি ব্যবহার করবেন না? এটা যেমন কঠিন তা নয়।

শেষ পর্যন্ত, আমি এটিকে একটি বাগ বলব না , তবে সেটিকে আমি গন্ধ বলব : বাগ থেকে খুব কম সময়েই পড়ে যাওয়া, তবে এটি একটি শক্তিশালী ইঙ্গিত যা বাগগুলি কাছাকাছি রয়েছে বা শেষ পর্যন্ত হবে। ভাল কোড গন্ধ ছেড়ে যাওয়া এড়ায়, এবং কোনও ভাল স্থিতিশীল বিশ্লেষণ সরঞ্জাম এটিকে পতাকাঙ্কিত করবে।

আমি যোগ করব যে এটি দুর্ভাগ্যক্রমে নয়, আপনি যে ধরণের যুক্তিটি সরাসরি জিততে পারবেন। এটি এমন পরিস্থিতি বলে মনে হচ্ছে যেখানে "ডান" হওয়া এখন আর পর্যাপ্ত নয় এবং আপনার নিজের সহকর্মীদের পায়ের আঙ্গুলগুলি নিজেরাই এই সমস্যাটি সমাধান করার জন্য পদক্ষেপ নেওয়া ভাল দল গতিশীলতার প্রচারের সম্ভাবনা নয়; এটি চূড়ান্তভাবে এটির চেয়ে বেশি ক্ষতি করতে পারে। এই ক্ষেত্রে আরও ভাল পদ্ধতির হতে পারে একটি স্ট্যাটিক বিশ্লেষণ সরঞ্জাম ব্যবহার প্রচার করা। এটি প্রচেষ্টাকে বৈধতা এবং বিশ্বাসযোগ্যতা দেবে এবং লক্ষ্য রেখে এবং ফিরে যাচ্ছে এবং বিদ্যমান কোডটি স্থির করবে।


1
এটি অবশ্যই পরামিতি করা কোনও চ্যালেঞ্জ নয়। আমার প্রশ্ন উত্থাপিত হয়েছিল কারণ সহকর্মী পূর্ণসংখ্যার মানগুলি বোঝায় এমন একাধিক কোয়েরি লিখেছিলেন এবং আমি ভাবছিলাম যে এই সমস্ত বিষয়গুলির মধ্যে দিয়ে যাওয়া এবং সেগুলি ঠিক করা আমার সময় নষ্ট কিনা।
johnnyRose

2
আমি মনে করি "এটি কি বাগ" প্রশ্নটিই আমার প্রশ্নটি উত্সাহিত করে।
johnnyRose

7
এটি একটি "গন্ধ": একটি বাগ যা নিজেই সংক্ষেপে পড়ে তবে এটি নির্দেশ করে যে বাগগুলি সম্ভবত কাছাকাছি রয়েছে। ভাল কোড গন্ধ দূর করার চেষ্টা করে। যে কোনও ভাল স্থিতিশীল বিশ্লেষণ সরঞ্জাম অবশ্যই এটিকে পতাকাঙ্কিত করবে।
জোয়েল কোহোর্ন

1
আমি "গন্ধ" শব্দটি পছন্দ করি। আমি এর পরিবর্তে "লার্ভা" এর মতো কিছু ব্যবহার করতাম, যেখানে এটি এখনও কোনও ত্রুটিপূর্ণ নয়, তবে ভবিষ্যতের আপডেটগুলি এটি কোনও ম্যাগগোটের কাছে ধরে ফেলতে পারে যা আপনি এটি পিষে না ফেলা বা ধুয়ে না ফেলা পর্যন্ত আপনার ব্যাকএন্ডে খাবেন। আপনি অবশ্যই চাইবেন না যে কোনও পরিবেশের পরিবেশে নেক্রোটিক কোড তৈরি হওয়ার সম্ভাবনা রয়েছে এবং নির্দিষ্ট পরিমাণ জরিমানা নিয়ে বিকশিত হয়নি এমন কোনও কিছু অবশ্যই উপস্থিত থাকার কারণ হতে পারে।
সিএসএস

1
এটা ঠিক ভুল। উদাহরণস্বরূপ আপনি কীভাবে এখনও এসকিউএল ইঞ্জেকশন তৈরি করতে পারেন DateTimeবাint
কাস্পারস ওজলস

53

কিছু ক্ষেত্রে স্ট্রিংয়ের মান বাদে নন-প্যারামাইট্রাইজড (কনটেনেটেড) ভেরিয়েবলগুলির সাথে এসকিউএল ইঞ্জেকশন আক্রমণ করা সম্ভব - জনের এই নিবন্ধটি দেখুন: http://codeblog.jonskeet.uk/2014/08/08/the-bobitables -কৃষ্টি /

কথাটি যখন ToStringবলা হয় তখন কিছু কাস্টম সংস্কৃতি সরবরাহকারী একটি স্ট্রিং উপস্থাপনায় একটি নন-স্ট্রিং প্যারামিটার রূপান্তর করতে পারে যা কিছু এসকিউএলকে কোয়েরিতে ইনজেক্ট করে।


14
আমি মনে করি এটিই একমাত্র পোস্ট যা প্রশ্নের উত্তর দেয়, যা মূলত "" intএস দিয়ে ইনজেকশন এমনকি কীভাবে সম্ভব হতে পারে ? "
আর্টুরো টরেস সানচেজ

3
যদিও আপনি কাস্টম কোড ইনজেকশনের মতো অবস্থানে রয়েছেন যেমন বুবি আটকা পড়েছে CultureInfoকেন আপনার আর এসকিউএল ইঞ্জেকশন লাগবে তা জানতে অসুবিধা।
মার্টিন স্মিথ

প্লাস 1, একমাত্র উত্তর যা আসলে প্রশ্নের উত্তর দেয়
ken2k

@ মার্টিনস্মিথ: আমার উত্তরগুলি দেখুন যা সংস্কৃতি-ইনফোকে বাইরে থেকে পরিবর্তনের এক সম্ভাব্য উপায় দেখায়।
ব্যবহারকারী 1027167

যদি কোনও ব্যক্তি প্রয়োগে এই জাতীয় কোড লিখতে পারেন তবে তার এসকিউএল ইঞ্জেকশনটির প্রয়োজন কী?
রেজা আঘাই

51

এটি স্ট্রিংবিহীন প্রকারের জন্যও নিরাপদ নয়সর্বদা পরামিতি ব্যবহার করুন। সময়কাল।

নিম্নলিখিত কোড উদাহরণ বিবেচনা করুন:

var utcNow = DateTime.UtcNow;
var sqlCommand = new SqlCommand("SELECT * FROM People WHERE created_on <= '" + utcNow + "'");

প্রথম নজরে কোডটি নিরাপদ দেখায়, তবে আপনি যদি উইন্ডোজ আঞ্চলিক সেটিংসে কিছু পরিবর্তন করেন এবং সংক্ষিপ্ত তারিখের ফর্ম্যাটে ইঞ্জেকশন যুক্ত করেন তবে সবকিছু পরিবর্তন হয়:

ডেটটাইম ইনজেকশন

এখন ফলস্বরূপ কমান্ড পাঠ্যটি এরকম দেখাচ্ছে:

SELECT * FROM People WHERE created_on <= '26.09.2015' OR '1'<>' 21:21:43'

intব্যবহারকারী কাস্টম নেতিবাচক চিহ্নটি সংজ্ঞায়িত করতে পারে যা সহজেই এসকিউএল ইনজেকশনে পরিবর্তিত হতে পারে হিসাবে প্রকারের জন্য একই করা যেতে পারে ।

যে কেউ তর্ক করতে পারে যে বর্তমান সংস্কৃতির পরিবর্তে আক্রমণকারী সংস্কৃতি ব্যবহার করা উচিত, তবে আমি এরকম স্ট্রিং কনটেনটেশনগুলি বহুবার দেখেছি এবং অবজেক্টের সাহায্যে স্ট্রিংগুলি সংহত করার সময় এটি সহজেই মিস করা যায় +


10
কে সার্ভার সেটিংস পরিবর্তন করতে পারে? যদি কোনও ব্যক্তি এটি আপনার সার্ভারে করতে পারেন তবে ডেটা নষ্ট করার জন্য তাকে এসকিউএল ইঞ্জেকশন লাগবে না।
রেজা আঘাই

5
এটি সেরা উত্তর, এটি ওপস উদ্বেগকে বৈধতা দেওয়ার এক উপায় দেখায় এটি একটি বাগ / সুরক্ষা ত্রুটি। পারফরম্যান্স এবং ভবিষ্যতের প্রমাণীকরণ এসকিউএল-তে উদাহরণস্বরূপ তারিখের সময়গুলি আলাদা করে দেওয়া কেবল গন্ধ বা প্রযুক্তিগত debt ণ নয় । @ রেজাআgাহই প্রশ্নটিতে সার্ভার-সাইডটি কখনও উল্লেখ করা হয়নি, এটি এসকিউএলএক্সপ্রেসযুক্ত একটি উইন্ডোজ অ্যাপ হতে পারে - যেভাবেই প্রশ্নটির মানদণ্ড নয়। যে কেউ বলতে পারে তবে এই দুর্দান্ত উত্তরটি খণ্ডন করতে সার্ভার সেটিংসে যার অ্যাক্সেস রয়েছে, ঠিক তেমনই কেউ ভাগ করে নেওয়া সার্ভার হোস্টিং বা ওয়াই 2 কে বাগ সম্পর্কে কী বলতে পারে। আমি আপনার সাথে সার্ভারটি লক হওয়ার সাথে একমত হই - এটি কেবল পূর্বশর্ত নয়।
জেরেমি থম্পসন

2
আপনি কি intটাইপ সম্পর্কে বলছিলেন একটি উদাহরণ প্রদান করতে পারেন ?
johnnyRose

1
আমি জানি আপনি এটির উত্তর দেওয়ার কয়েক সপ্তাহ হয়ে গেছে, তবে কী আপনার পোস্টটি সম্পাদনা করা এবং আপনি কীভাবে একটি পছন্দসই নেতিবাচক চিহ্নটি সংজ্ঞায়িত করতে পারবেন তার উদাহরণ যুক্ত করা সম্ভব হবে?
johnnyRose

23

"টেবিল 1 থেকে ইলেক্ট করুন * যেখানে আইডি =" + অন্তর্ভুক্ত। টুস্ট্রিং ()


সুরক্ষা
এটি ঠিক আছে।
আক্রমণকারীরা আপনার টাইপ করা ইনটি ভেরিয়েবলে কোনও কিছুই ইনজেক্ট করতে পারে না।

পারফরম্যান্স
ঠিক নেই।

প্যারামিটারগুলি ব্যবহার করা ভাল, সুতরাং ক্যোয়ারীটি একবার সংকলিত হবে এবং পরবর্তী ব্যবহারের জন্য ক্যাশে হবে। পরবর্তী সময় এমনকি বিভিন্ন পরামিতি মান সহ, ক্যোয়ারী ক্যাশে হয়েছে এবং ডাটাবেস সার্ভারে সংকলন করার প্রয়োজন নেই।

কোডিং স্টাইল
খারাপ অনুশীলন।

  • প্যারামিটারগুলি আরও পঠনযোগ্য
  • হতে পারে এটি আপনাকে পরামিতি ছাড়াই ক্যোয়ারিতে অভ্যস্ত করে তোলে, তারপরে আপনি একবার ভুল করেছেন এবং একটি স্ট্রিংয়ের মানটি এভাবে ব্যবহার করুন এবং তারপরে সম্ভবত আপনার ডেটাকে বিদায় জানাতে হবে। খারাপ অভ্যাস!


"প্রোডাক্ট থেকে * নির্বাচন করুন আইডি =" + টেক্সটবক্স 1. পাঠ্য


যদিও এটি আপনার প্রশ্ন নয় তবে ভবিষ্যতের পাঠকদের জন্য এটি দরকারী:

নিরাপত্তা
বিপর্যয়! ক্ষেত্রটি পূর্ণসংখ্যার
পরেও Idআপনার ক্যোয়ারী এসকিউএল ইঞ্জেকশনের বিষয় হতে পারে। ধরুন আপনার আবেদনে আপনার কাছে একটি প্রশ্ন রয়েছে "SELECT * FROM Table1 WHERE Id=" + TextBox1.Text, একজন আক্রমণকারী পাঠ্য বাক্সে প্রবেশ 1; DELETE Table1করতে পারে এবং ক্যোয়ারীটি হ'ল:

"SELECT * FROM Table1 WHERE Id=1; DELETE Table1"

আপনি যদি এখানে প্যারামিট্রাইজড ক্যোয়ারী ব্যবহার করতে না চান তবে আপনার টাইপ করা মানগুলি ব্যবহার করা উচিত:

string.Format("SELECT * FROM Table1 WHERE Id={0}", int.Parse(TextBox1.Text))


তোমার প্রশ্ন


আমার প্রশ্ন উত্থাপিত হয়েছিল কারণ সহকর্মী পূর্ণসংখ্যার মানগুলি বোঝায় এমন একাধিক কোয়েরি লিখেছিলেন এবং আমি ভাবছিলাম যে এই সমস্ত বিষয়গুলির মধ্যে দিয়ে যাওয়া এবং সেগুলি ঠিক করা আমার সময় নষ্ট কিনা।

আমি মনে করি এই কোডগুলি পরিবর্তন করা সময়ের অপচয় নয়। প্রকৃতপক্ষে পরিবর্তন প্রস্তাবিত!

যদি আপনার সহকর্মী ইনট ভেরিয়েবলগুলি ব্যবহার করে তবে এর কোনও সুরক্ষা ঝুঁকি নেই, তবে আমি মনে করি যে এই কোডগুলি পরিবর্তন করা সময় নষ্ট নয় এবং প্রকৃতপক্ষে এই কোডগুলি পরিবর্তন করার পরামর্শ দেওয়া হচ্ছে। এটি কোডকে আরও পঠনযোগ্য, আরও রক্ষণাবেক্ষণযোগ্য এবং কার্যকরকরণকে দ্রুত করে তোলে।


এমনকি প্রথম বিকল্পটি সুরক্ষার জন্য পুরোপুরি ঠিক নেই। এর আচরণটি .ToString()একটি অপারেটিং সিস্টেম কনফিগারেশন আইটেম দ্বারা নির্ধারিত হয় যা স্বেচ্ছাসেবী পাঠ্য অন্তর্ভুক্ত করার জন্য পরিবর্তন করা সহজ।
জোয়েল কোহোর্ন

18

একটিতে দুটি প্রশ্ন রয়েছে। এবং শিরোনাম থেকে আসা প্রশ্নের উত্তরগুলির পরে মন্তব্যে ওপি প্রকাশিত উদ্বেগগুলির সাথে খুব কম সম্পর্ক রয়েছে।

যদিও আমি বুঝতে পেরেছি যে ওপি-র ক্ষেত্রে এটি তাদের বিশেষ ক্ষেত্রে গুরুত্বপূর্ণ, গুগল থেকে আগত পাঠকদের জন্য, আরও সাধারণ প্রশ্নের উত্তর দেওয়া জরুরী, "এটি নিশ্চিত করা যায় যদি আমি নিশ্চিত হয়ে থাকি তবে প্রস্তুত বিবৃতি হিসাবে সুরক্ষিত হওয়া যেমন নিরাপদ" আমি যে প্রতিটি আক্ষরিক সম্মতি জানাতে পারি তা নিরাপদ? " সুতরাং, আমি এই দ্বিতীয়টির দিকে মনোনিবেশ করতে চাই। এবং উত্তরটি হ'ল

অবশ্যই না।

ব্যাখ্যাটি বেশিরভাগ পাঠকরা যেমন পছন্দ করেন তেমন সরাসরি নয়, তবে আমি যথাসাধ্য চেষ্টা করব।

আমি কিছুক্ষণের জন্য বিষয়টি নিয়ে চিন্তাভাবনা করছি, যার ফলে নিবন্ধটি (যদিও পিএইচপি পরিবেশের উপর ভিত্তি করে) যেখানে আমি সমস্ত কিছু সংক্ষিপ্ত করার চেষ্টা করেছি in আমার কাছে এটি ঘটেছিল যে এসকিউএল ইনজেকশন থেকে সুরক্ষার প্রশ্নটি প্রায়শই কিছু সম্পর্কিত তবে সংক্ষিপ্ত বিষয়ের দিকে ঝরে যায়, যেমন স্ট্রিং পলায়ন, টাইপ কাস্টিং এবং এ জাতীয়। যদিও কিছু ব্যবস্থা গ্রহণগুলি নিজেরাই গ্রহণের সময় নিরাপদ হিসাবে বিবেচনা করা যেতে পারে, তবুও কোনও ব্যবস্থা নেই, বা অনুসরণ করার কোনও সহজ নিয়ম নেই। যা এটিকে খুব পিচ্ছিল স্থল করে তোলে, বিকাশকারীর মনোযোগ এবং অভিজ্ঞতার উপরে খুব বেশি।

এসকিউএল ইঞ্জেকশনটির প্রশ্নটি কোনও নির্দিষ্ট সিনট্যাক্স সমস্যার ক্ষেত্রে সহজ করা যায় না। এটি গড় বিকাশকারীরা ভাবেন ব্যবহারের চেয়ে প্রশস্ত। এটি একটি পদ্ধতিগত প্রশ্নও। এটি কেবল "আমাদের কোন নির্দিষ্ট বিন্যাস প্রয়োগ করতে হবে" তা নয়, পাশাপাশি "এটি কীভাবে করতে হবে"।

(এই দৃষ্টিকোণ থেকে, জন্ স্কিটের অন্য উত্তরে উদ্ধৃত একটি নিবন্ধ ভাল করার চেয়ে খারাপ কাজ করছে, কারণ এটি আবার কোনও প্রান্তের ক্ষেত্রে ঝাঁকুনি দিচ্ছে, একটি নির্দিষ্ট বাক্য গঠনতে মনোনিবেশ করছে এবং সমস্যাটি পুরোপুরি সমাধান করতে ব্যর্থ হয়েছে।)

আপনি যখন সুরক্ষার প্রশ্নটিকে সম্পূর্ণ নয় বরং বিভিন্ন সিনট্যাক্স ইস্যুগুলির সেট হিসাবে সমাধান করার চেষ্টা করছেন, তখন আপনি প্রচুর সমস্যার মুখোমুখি হচ্ছেন।

  • সম্ভাব্য বিন্যাসের পছন্দগুলির তালিকা সত্যই বিশাল। মানে যে কেউ সহজেই কিছুকে উপেক্ষা করতে পারে। অথবা এগুলিকে বিভ্রান্ত করুন ( উদাহরণস্বরূপ শনাক্তকারীটির জন্য স্ট্রিং পলায়ন ব্যবহার করে )।
  • সংঘবদ্ধকরণের অর্থ হ'ল সমস্ত সুরক্ষা ব্যবস্থা প্রোগ্রামার দ্বারা করা উচিত, প্রোগ্রাম নয়। এই সমস্যাটি একা একাধিক পরিণতির দিকে পরিচালিত করে:
    • যেমন একটি বিন্যাস ম্যানুয়াল। ম্যানুয়াল মানে চূড়ান্ত ত্রুটিযুক্ত। কেউ আবেদন করতে ভুলে যেতে পারে।
    • তদ্ব্যতীত, কিছু কেন্দ্রীভূত ফাংশনে ফরম্যাটিং পদ্ধতিগুলি স্থানান্তরিত করার প্রবণতা রয়েছে, আরও বেশি জিনিস গণ্ডগোল করা এবং ডেটাবেজে যাওয়া নয় এমন ডেটা নষ্ট করে দেওয়া।
  • যখন একাধিক বিকাশকারী জড়িত হন, তখন দশটির গুণক দ্বারা সমস্যাগুলি বৃদ্ধি করে।
  • যখন সংক্ষিপ্তকরণ ব্যবহার করা হয়, তখন কেউ এক নজরে কোনও সম্ভাব্য বিপজ্জনক জিজ্ঞাসা বলতে পারে না: এগুলি সবই সম্ভবত বিপজ্জনক!

এই গণ্ডগোলের মতো নয়, প্রস্তুত বিবৃতিগুলি হোলি গ্রেইল:

  • এটি অনুসরণ করা সহজ যে একটি সাধারণ নিয়মের আকারে প্রকাশ করা যেতে পারে।
  • এটি মূলত অপরিবর্তনীয় পরিমাপ, এর অর্থ হ'ল বিকাশকারী হস্তক্ষেপ করতে পারে না এবং স্বেচ্ছায় বা অনিচ্ছায় প্রক্রিয়াটি নষ্ট করে দেয়।
  • ইনজেকশন থেকে সুরক্ষা আসলে প্রস্তুত বিবৃতিগুলির কেবলমাত্র একটি পার্শ্ব প্রতিক্রিয়া , যার আসল উদ্দেশ্য সিনথেটিকভাবে সঠিক বিবৃতি তৈরি করা। এবং একটি সিন্টেক্সিকভাবে সঠিক বিবৃতিটি 100% ইনজেকশন প্রুফ proof তবুও আমাদের ইনজেকশন সম্ভাবনা থাকা সত্ত্বেও আমাদের সিনট্যাক্সটি সঠিক হতে হবে।
  • যদি চারপাশে সমস্তভাবে ব্যবহৃত হয়, এটি বিকাশকারীর অভিজ্ঞতা নির্বিশেষে অ্যাপ্লিকেশনটিকে সুরক্ষা দেয়। বলুন, এখানে একটি জিনিস রয়েছে যা দ্বিতীয় আদেশের ইঞ্জেকশন বলে । আর খুব শক্তিশালী বিভ্রম যে সার্চ "অর্ডার রক্ষা করার জন্য, সমস্ত ব্যবহারকারী সরবরাহকৃত ইনপুট Escape "। একত্রিত হয়ে তারা ইনজেকশন নিয়ে যায়, যদি কোনও বিকাশকারী সিদ্ধান্ত নিতে স্বাধীনতাকে গ্রহণ করে, কী সুরক্ষিত করা দরকার এবং কী নয় what

(আরও চিন্তাভাবনা করে, আমি আবিষ্কার করেছি যে বাস্তবধারিত জীবনের প্রয়োজনের জন্য বর্তমান স্থানধারকগুলি যথেষ্ট নয় এবং অ্যারেগুলির মতো জটিল ডেটা স্ট্রাকচারের জন্য এমনকি এসকিউএল কীওয়ার্ড বা শনাক্তকারীদের উভয়ই প্রসারিত করতে হবে, যা কখনও কখনও যোগ করতে হয় গতিশীলভাবেও ক্যোয়ারী অনুসন্ধান করুন, তবে কোনও বিকাশকারীকে এ জাতীয় মামলার জন্য নিরস্ত্র রেখে যাওয়া হয়, এবং স্ট্রিং কনটেনটেশনে ফিরে যেতে বাধ্য করা হয় তবে এটি অন্য প্রশ্নের বিষয়)।

মজার বিষয় হল, স্ট্যাক ওভারফ্লোয়ের খুব বিতর্কিত প্রকৃতির দ্বারা এই প্রশ্নের বিতর্ককে উস্কে দেওয়া হয়েছে। সাইটের ধারণাটি অনুসন্ধান থেকে আসা ব্যবহারকারীদের জন্য সাধারণ উদ্দেশ্যে উত্তরগুলির একটি ডাটাবেস থাকার লক্ষ্য অর্জনের জন্য সরাসরি জিজ্ঞাসা করা ব্যবহারকারীদের বিশেষ প্রশ্নগুলির ব্যবহার করা । প্রতি সে ধারণাটি খারাপ নয় , তবে এটি এইরকম পরিস্থিতিতে ব্যর্থ হয়: যখন কোনও ব্যবহারকারী খুব সংকীর্ণ প্রশ্ন জিজ্ঞাসা করেন , বিশেষত কোনও সহকর্মীর সাথে বিবাদে যুক্তি পেতে (অথবা কোডটি রিফ্যাক্টারের পক্ষে মূল্যবান কিনা তা সিদ্ধান্ত নিতে)। যদিও বেশিরভাগ অভিজ্ঞ অংশগ্রহণকারী মিশনের কথা মাথায় রেখে একটি উত্তর লেখার চেষ্টা করছেন সামগ্রিকভাবে স্ট্যাক ওভারফ্লো, তাদের উত্তরটি যতটা সম্ভব পাঠকের পক্ষে ভাল করে তোলে, কেবল ওপি নয়।


10
প্রশ্নের উত্তর দিচ্ছেন না
edc65

বেশিরভাগ ডাটাবেসগুলি ইতিমধ্যে ব্যবহৃত, এসকিউএল স্ট্রিং সমতা দ্বারা প্যারামিটারাইজড কোয়েরিগুলি সনাক্ত করে, তাই পুরানো প্রস্তুতি এবং ব্যবহারের-হ্যান্ডেল পদ্ধতিটি আমার কাছে পুরানো বলে মনে হয়। এই হ্যান্ডলগুলি কেবল একটি নির্দিষ্ট স্কোপের মধ্যেই ব্যবহার করা যায় এবং হ্যান্ডেলের ট্র্যাক রাখতে কোডিং প্রয়োজন require প্যারামিটারাইজড কোয়েরিগুলি, আমার মতে, সরাসরি ব্যবহার করা উচিত, যাতে হ্যান্ডেল ট্র্যাকিং ছাড়াই এবং এমনকি বিভিন্ন অ্যাপ্লিকেশন জুড়ে ক্যোয়ারী পরিকল্পনাগুলি পুনরায় ব্যবহার করা যেতে পারে।
এরিক হার্ট

15

আসুন কেবল সুরক্ষা বা টাইপ-নিরাপদ বিবেচনা সম্পর্কে ভাবেন না।

প্যারামিট্রাইজড কোয়েরিগুলি ব্যবহার করার কারণটি হ'ল ডাটাবেস স্তরে কর্মক্ষমতা উন্নত করা। একটি ডাটাবেস দৃষ্টিকোণ থেকে, একটি প্যারাম্যাট্রাইজড ক্যোয়ারী এসকিউএল বাফারের একটি কোয়েরি (ওরাকল এর পরিভাষা ব্যবহার করার জন্য যদিও আমি কল্পনা করি যে সমস্ত ডাটাবেসের অভ্যন্তরীণভাবে একই ধারণা রয়েছে)। সুতরাং, ডাটাবেস মেমরিতে একটি নির্দিষ্ট পরিমাণ ক্যোয়ারী ধারণ করতে পারে, প্রস্তুত এবং কার্যকর করতে প্রস্তুত। এই প্রশ্নেরগুলি বিশ্লেষণ করার প্রয়োজন নেই এবং এটি আরও দ্রুত হবে। প্রায়শই চালানো ক্যোয়ারীগুলি সাধারণত বাফারে থাকে এবং প্রতিটিবার ব্যবহৃত হওয়ার সময় পার্সিংয়ের প্রয়োজন হবে না।

যদি না

কেউ প্যারামেট্রাইজড কোয়েরি ব্যবহার করে না। এই ক্ষেত্রে, বাফার অবিচ্ছিন্ন প্রায় একই প্রশ্নের স্রোত দ্বারা ক্রমাগত প্রবাহিত হয়ে যায় যার প্রত্যেকটি বিশ্লেষণ এবং ডেটাবেস ইঞ্জিন দ্বারা চালিত করা প্রয়োজন এবং কার্য সম্পাদনটি সর্বদিক ভোগ করে কারণ এমনকি প্রায়শই চালানো অনুসন্ধানগুলি অনেক বার পুনরায় পার্স করা হয় a দিন. আমি একটি জীবিকার জন্য ডেটাবেস টিউন করেছি এবং এটি নিম্ন-স্তব্ধ ফলের অন্যতম বৃহত্তম উত্স।

এখন

আপনার প্রশ্নের উত্তর দেওয়ার জন্য, যদি আপনার ক্যোয়ারিতে স্বল্প সংখ্যক স্বতন্ত্র সংখ্যা থাকে তবে আপনি সম্ভবত সমস্যা তৈরি করবেন না এবং কার্যত অসীমভাবে পারফরম্যান্সে উন্নতি করতে পারেন। যদি তবে সম্ভাব্য কয়েকশো মান থাকে এবং কোয়েরিকে প্রচুর পরিমাণে ডাকা হয়, আপনি আপনার সিস্টেমের কার্যকারিতা প্রভাবিত করতে চলেছেন তাই এটি করবেন না।

হ্যাঁ আপনি এসকিউএল বাফার বাড়িয়ে তুলতে পারেন তবে এটি সর্বশেষে স্মৃতিতে ক্যাচিং ইনডেক্স বা ডেটা এর মতো অন্যান্য সমালোচনামূলক ব্যবহারগুলির ব্যয় হয়। নৈতিক, প্যারামিট্রাইজড ক্যোয়ারীগুলি বেশ ধার্মিকভাবে ব্যবহার করুন যাতে আপনি আপনার ডাটাবেসটিকে অনুকূল করতে পারেন এবং গুরুত্বপূর্ণ যে জিনিসগুলির জন্য আরও সার্ভার মেমরি ব্যবহার করতে পারেন ...


8

ম্যাকিকের উত্তরে কিছু তথ্য যুক্ত করতে:

প্রতিস্থাপনের মাধ্যমে সমাবেশের মূল ফাংশনটি কল করে একটি .NET তৃতীয় পক্ষের অ্যাপের সংস্কৃতি সম্পর্কিত তথ্য পরিবর্তন করা সহজ:

using System;
using System.Globalization;
using System.Reflection;
using System.Threading;

namespace ConsoleApplication2
{
  class Program
  {
    static void Main(string[] args)
    {
      Assembly asm = Assembly.LoadFile(@"C:\BobbysApp.exe");
      MethodInfo mi = asm.GetType("Test").GetMethod("Main");
      mi.Invoke(null, null);
      Console.ReadLine();
    }

    static Program()
    {
      InstallBobbyTablesCulture();
    }

    static void InstallBobbyTablesCulture()
    {
      CultureInfo bobby = (CultureInfo)CultureInfo.InvariantCulture.Clone();
      bobby.DateTimeFormat.ShortDatePattern = @"yyyy-MM-dd'' OR ' '=''";
      bobby.DateTimeFormat.LongTimePattern = "";
      bobby.NumberFormat.NegativeSign = "1 OR 1=1 OR 1=";
      Thread.CurrentThread.CurrentCulture = bobby;
    }
  }
}

এটি কেবল তখনই কাজ করে যদি ববিস অ্যাপের মূল ফাংশনটি সর্বজনীন হয়। যদি মেইন সর্বজনীন না হয় তবে এমন অন্যান্য পাবলিক ফাংশন থাকতে পারে যাঁকে আপনি কল করতে পারেন।


1
আপনাকে কোড দ্বারা এটি করতে হবে না। আপনি সরাসরি উইন্ডোজ আঞ্চলিক সেটিংসে ইঞ্জেকশন যুক্ত করতে পারেন। আমার উত্তর দেখুন।
কাস্পারস ওজলস

2
কে সার্ভার সেটিংস পরিবর্তন করতে পারে বা সার্ভারে এই জাতীয় কোডটি কে ঘষতে পারে? যদি কোনও ব্যক্তি এটি আপনার সার্ভারে করতে পারেন তবে ডেটা নষ্ট করার জন্য তাকে এসকিউএল ইঞ্জেকশন লাগবে না।
রেজা আঘাই

7

আমার মতে আপনি যদি গ্যারান্টি দিতে পারেন যে আপনি যে প্যারামিটার দিয়ে কাজ করছেন তাতে কখনও স্ট্রিং থাকবে না এটি নিরাপদ তবে আমি এটি কোনও অবস্থাতেই করব না। এছাড়াও, আপনি সংক্ষিপ্ত সম্পাদন করছেন যে কারণে আপনি সামান্য পারফরম্যান্স হ্রাস দেখতে পাবেন। আমি আপনাকে যে প্রশ্নটি জিজ্ঞাসা করব তা হল আপনি কেন প্যারামিটার ব্যবহার করতে চান না?


1
এটি এমন নয় যে আমি পরামিতিগুলি ব্যবহার করতে চাই না, আমি পরামিতিগুলি ব্যবহার করছি। একজন সহকর্মী এই জাতীয় কোড লিখেছিলেন যা আমি আজকে প্যারামিটারাইজড হিসাবে সংশোধন করেছি, যা আমাকে প্রশ্নটি ভাবতে বাধ্য করে।
johnnyRose

ঠিক আছে. গ্রেট। পরামিতিগুলি ব্যবহার করার জন্য এটি সর্বোত্তম অনুশীলন। এসকিউএল ইঞ্জেকশন সম্পর্কিত জিনিসগুলির জন্য আপনাকে চিন্তা করতে হবে না। এছাড়াও যদি আপনি একটি গতিশীল প্রশ্ন তৈরি করে থাকেন তবে আপনার প্রশ্নগুলি কতটা জটিল তা আপনি প্যারামিটারগুলিও ব্যবহার করতে পারেন। এগুলি তৈরি করার সময় কেবল @ 1 ... @ n স্টাইল ব্যবহার করুন। এবং তাদের পছন্দসই মান সহ প্যারামিটার সংগ্রহের সাথে যুক্ত করুন।
সর্বোচ্চ

@ জোহনিরোজ প্যারামিটারগুলি ব্যবহার করার জন্য আরও একটি বিষয় রয়েছে: প্রোগ্রামগুলি বিকশিত হচ্ছে এবং পরিবর্তিত হচ্ছে। আপনি কেবল স্ট্রিংয়ের জন্য কনট্যাকটেশন ব্যবহার করতে পারেন তবে এটি গ্যারান্টি দেয় না যে কেউ রিফ্যাক্টরিং প্রয়োগ করেছেন যা কিছু প্যারামিটারের ধরন পরিবর্তন করে এবং এসকিউএল ইঞ্জেকশন দুর্বলতার পরিচয় দিতে পারে।
লিরটি 61

3

এটি ঠিক আছে তবে কখনও নিরাপদ নয় .. এবং সুরক্ষা সর্বদা ইনপুটগুলির উপর নির্ভর করে, উদাহরণস্বরূপ যদি ইনপুট অবজেক্টটি টেক্সটবক্স হয় তবে আক্রমণকারীরা টেক্সটবক্সটি স্ট্রিং গ্রহণ করতে পারে বলে আক্রমণাত্মক কিছু করতে পারে, তাই আপনাকে কিছু প্রকারের বৈধতা / রূপান্তর রাখতে হবে ব্যবহারকারীদের ভুল ইনপুট প্রতিরোধ করতে সক্ষম হতে। তবে বিষয়টি হ'ল এটি নিরাপদ নয়। যেমন সহজ।


যদিও এটি একটি স্ট্রিং। আমি অন্যান্য ডেটা ধরণের, যেমন পূর্ণসংখ্যা, বুলিয়ান বা তারিখের সময় সম্পর্কে বলছি।
johnnyRose

@ জোহনিরোজ ইউ, আমি উপরে একটি খুব সুন্দর উদাহরণ দেখেছি যা আপনি ক্যাসপার্ডস দ্বারা জবাব হিসাবে চিহ্নিত করেছেন .. এবং দুর্দান্ত উত্তর যখন তিনি ডেটটাইপটি উদাহরণ হিসাবে ব্যবহার করেন যা অস্বাভাবিক। :) আমি আশা করি আপনি ইতিমধ্যে নিশ্চিত হয়ে
গেছেন যে

প্যারামিটারগুলি ব্যবহার করা এটি নিরাপদ বলে আমার কোনও সন্দেহ ছিল না। আমার প্রশ্নটি দৃ strongly়ভাবে টাইপযুক্ত প্রয়োগগুলি উল্লেখ করে।
johnnyRose

হ্যাঁ .. আমি রাজি। এবং এটি ভবিষ্যত
পাঠকদেরও

-2

না আপনি সেভাবে কোনও এসকিউএল ইঞ্জেকশন আক্রমণ পেতে পারেন। আমি তুর্কি ভাষায় একটি পুরানো নিবন্ধ লিখেছি যা এখানে কীভাবে তা দেখায় । পিএইচপি এবং মাইএসকিউএলে নিবন্ধের উদাহরণ কিন্তু সি # এবং এসকিউএল সার্ভারে ধারণাটি একই রকম কাজ করে।

মূলত আপনি নিম্নলিখিত উপায় আক্রমণ। আপনার একটি পৃষ্ঠা বিবেচনা করা যাক যা পূর্ণসংখ্যার আইডি মান অনুযায়ী তথ্য দেখায়। আপনি নীচের মতো এটিতে মানটিকে প্যারাম্যাট্রাইজ করেন না।

http://localhost/sqlEnjeksiyon//instructors.aspx?id=24

ঠিক আছে, আমি ধরে নিচ্ছি আপনি মাইএসকিউএল ব্যবহার করছেন এবং আমি নিম্নলিখিত পদ্ধতিতে আক্রমণ করি।

http://localhost/sqlEnjeksiyon//instructors.aspx?id=ASCII((SELECT%20DATABASE()))

নোট করুন যে এখানে ইনজেকশনের মান স্ট্রিং নয়। আমরা ASCII ফাংশনটি ব্যবহার করে চর মানটি ইন্টে পরিবর্তন করছি। আপনি "CAST (আপনার ভারচার্চল AS INT)" ব্যবহার করে এসকিউএল সার্ভারে একই জিনিস অর্জন করতে পারেন।

এর পরে আমি আপনার ডাটাবেসটির নাম অনুসন্ধান করতে দৈর্ঘ্য এবং স্তরগুলি ফাংশন ব্যবহার করি।

http://localhost/sqlEnjeksiyon//instructors.aspx?id=LEN((SELECT%20DATABASE()))

http://localhost/sqlEnjeksiyon//instructors.aspx?id=ASCII(SUBSTR(SELECT%20DATABASE(),1,1))

তারপরে ডাটাবেসের নাম ব্যবহার করে আপনি ডাটাবেসে টেবিলের নাম পাওয়া শুরু করেন।

http://localhost/sqlEnjeksiyon//instructors.aspx?id=ASCII(SUBSTR((SELECT table_name FROM INFORMATION_SCHEMA.TABLES LIMIT 1),1,1))

অবশ্যই আপনাকে এই প্রক্রিয়াটি স্বয়ংক্রিয় করতে হবে, যেহেতু আপনি প্রতি ক্যোয়ারীতে কেবল একটি অক্ষর পান। তবে আপনি এটি সহজেই স্বয়ংক্রিয় করতে পারেন। আমার নিবন্ধ ওয়েটারের একটি উদাহরণ দেখায় । কেবলমাত্র একটি পৃষ্ঠা ব্যবহার করা হচ্ছে এবং প্যারামিটারাইজড আইডি মান নয়। আমি আপনার ডাটাবেসে প্রতিটি টেবিলের নাম শিখতে পারি। এর পরে আমি গুরুত্বপূর্ণ টেবিলগুলি সন্ধান করতে পারি। এটি সময় লাগবে তবে তা করণীয়।


2
আমার প্রশ্নটি দৃ strongly়ভাবে টাইপিত ভাষা বোঝায়। আপনার ব্যাখ্যাটি নমনীয় টাইপিং সহ ভাষার জন্য দুর্দান্ত তবে ইনজেকশনের মানটি এখনও একটি স্ট্রিং।
johnnyRose

কোনও ইনজেকশনের মান পূর্ণসংখ্যা নয়। আপনি চর পান এবং এএসসিআইআই মাইএসকিউএল ফাংশনটি ব্যবহার করে এটি পূর্ণসংখ্যায় পরিবর্তন করুন। আপনি এসএকিউএল সার্ভারে কাস্ট ব্যবহার করে একই জিনিসটি করেন (আপনার চ্যানেলভ্যালু যেমন INT)
আতিলা ওজগুর

আমি এরকম কিছু বোঝাতে public void QuerySomething(int id) { // this will only accept an integer }
চাইছিলাম

-3

ভাল ... একটি জিনিস নিশ্চিত: সুরক্ষা এটি ঠিক নয়, যখন আপনি আপনার এসকিউএল কমান্ড স্ট্রিংয়ের সাথে কোনও স্ট্রিং (ব্যবহারকারীর দ্বারা নেওয়া) সম্মিলন করেন। যখনই ধারাটি কোনও পূর্ণসংখ্যা বা কোনও প্রকারকে বোঝায় তখন তা বিবেচ্য নয়; ইনজেকশন হতে পারে।

এসকিউএল ইনজেকশনে যা গুরুত্বপূর্ণ তা হ'ল ভেরিয়েবলের ডেটা টাইপ যা ব্যবহারকারীর কাছ থেকে মান পেতে ব্যবহৃত হয়।

ধরা যাক আমাদের যেখানে একটি সংজ্ঞা রয়েছে যেখানে ক্লজ এবং:

  1. ব্যবহারকারী-পরিবর্তনশীল একটি স্ট্রিং। তাহলে ঠিক আছে, ইনজেকশন করা খুব সহজ নয় (ইউনিয়ন ব্যবহার করে) তবে 'OR 1 = 1' ব্যবহার করে বাইপাস করা খুব সহজ - আক্রমণগুলির মতো ...

  2. যদি ব্যবহারকারী-পরিবর্তনশীল একটি পূর্ণসংখ্যা হয়। তারপরে আবার আমরা সিস্টেম ক্র্যাশগুলির জন্য এমনকি একটি লুকানো বাফার ওভারফ্লো (চূড়ান্ত স্ট্রিংয়ে) ...;) জন্য অস্বাভাবিক বড় সংখ্যক পরীক্ষার মাধ্যমে সিস্টেমের শক্তি পরীক্ষা করতে পারি;

সন্ধানী পদ্ধতিগুলির কাছে প্যারামিটারগুলি বা (আরও ভাল - ইমো) সঞ্চিত পদ্ধতিগুলি 100% হুমকি নিরাপদ নয় তবে সেগুলি হ্রাস করার জন্য এগুলি সর্বনিম্ন প্রয়োজনীয় পরিমাপ (বা প্রাথমিক যদি আপনি চান তবে)।


আমি মনে করি আপনি হয়ত প্রশ্নটি ভুল বুঝে থাকতে পারেন। আমি নন- স্ট্রিং টাইপের কথা বলছি ।
johnnyRose

হাই জনিরোজ ... আপনার নোটের জন্য ধন্যবাদ। আমি আপনার প্রশ্নটি বুঝতে পারি তবে আমি আমার উত্তরটি আরও সাধারণ আকারে রেখেছি। নন-স্ট্রিং কেসের জন্য দয়া করে আমার (2) পয়েন্টটি পরীক্ষা করুন। ;)
আন্দ্রে ভেনিয়ারিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.