এসকিউএল ইঞ্জেকশন প্রতিরোধ ব্যবস্থা কেন প্যারামিটারাইজড কোয়েরিগুলি ব্যবহারের দিকের দিকে বিকশিত হয়েছিল?


59

আমি এটি যেভাবে দেখছি, এসকিউএল ইঞ্জেকশন আক্রমণগুলি এর দ্বারা প্রতিরোধ করা যেতে পারে:

  1. সাবধানতার সাথে স্ক্রিনিং, ফিল্টারিং, এনকোডিং ইনপুট (এসকিউএল প্রবেশের আগে)
  2. প্রস্তুত বিবৃতি / প্যারামিটারাইজড কোয়েরি ব্যবহার করে

আমি অনুমান করি যে প্রত্যেকের পক্ষে মতামত রয়েছে, তবে # 2 কেন ইনজেকশন আক্রমণ প্রতিরোধের জন্য আরও বেশি বা কম উপায় হিসাবে বিবেচিত হবে? এটি কি নিরাপদ এবং ত্রুটির প্রবণতা কম বা অন্য কারণগুলি ছিল?

আমি যেমন বুঝতে পেরেছি, যদি # 1 টি সঠিকভাবে ব্যবহৃত হয় এবং সমস্ত সতর্কতামূলক যত্ন নেওয়া হয় তবে এটি # 2 এর মতো কার্যকর হতে পারে।

স্যানিটাইজিং, ফিল্টারিং এবং এনকোডিং

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

প্যারামিটারাইজড কোয়েরি বনাম এনকোডিং লাইব্রেরি

এমন উত্তর রয়েছে যেখানে ধারণাগুলি parameterized queriesএবং encoding librariesসেগুলি বিনিময়যোগ্য হিসাবে বিবেচনা করা হয়। আমি ভুল হলে আমাকে সংশোধন করুন, তবে আমি মনে করি যে তারা আলাদা।

আমার বোধগম্যতা হ'ল encoding libraries, তারা সবসময় এসকিউএল "প্রোগ্রাম" সংশোধন করার সম্ভাবনা রাখে না কেন , তারা আরডিবিএমএস পাঠানোর আগেই এসকিউএল নিজেই পরিবর্তন করে চলেছে।

Parameterized queries অন্যদিকে, এসকিউএল প্রোগ্রামটি আরডিবিএমএসে প্রেরণ করুন, যা কোয়েরিটি অনুকূল করে তোলে, ক্যোয়ারি এক্সিকিউশন প্ল্যানকে সংজ্ঞায়িত করে, ব্যবহার করতে হবে এমন সূচীগুলি নির্বাচন করে এবং তারপর আরডিবিএমএসের অভ্যন্তরের শেষ পদক্ষেপ হিসাবে ডেটা প্লাগ ইন করে নিজেই।

এনকোডিং লাইব্রেরি

  data -> (encoding library)
                  |
                  v
SQL -> (SQL + encoded data) -> RDBMS (execution plan defined) -> execute statement

প্যারামিটারাইজড ক্যোয়ারী

                                               data
                                                 |
                                                 v
SQL -> RDBMS (query execution plan defined) -> data -> execute statement

.তিহাসিক তাৎপর্য

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


1
মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
ম্যাপেল_শ্যাফ্ট

23
প্রস্তুত বিবৃতি এসকিউএল ইঞ্জেকশন আক্রমণ থেকে বিবর্তনের ফলাফল নয় । তারা প্রথম থেকেই সেখানে ছিল। আপনার প্রশ্নটি একটি মিথ্যা প্রতিবাদের ভিত্তিতে তৈরি।
ব্যবহারকারী 207421

4
আপনি যদি মনে করেন যে আপনি খারাপ ছেলেদের চেয়ে বেশি চৌকস, তবে # 1
পাপারাজ্জো

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

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

উত্তর:


147

সমস্যাটি হ'ল # 1 এর জন্য আপনি যে এসকিউএল ভেরিয়েন্টের বিরুদ্ধে কাজ করছেন তার পুরোপুরি কার্যকরভাবে পার্স এবং ব্যাখ্যা করতে হবে যাতে আপনি জানেন যে এটি কিছু না করা উচিত। আপনি আপনার ডাটাবেস আপডেট করার সাথে সাথে সেই কোডটি আপ টু ডেট রাখুন। সব জায়গা আপনি আপনার প্রশ্ন জন্য ইনপুট গ্রহণ। এবং এটি স্ক্রু না।

সুতরাং হ্যাঁ, এই ধরণের জিনিসটি এসকিউএল ইঞ্জেকশন আক্রমণগুলিকে থামিয়ে দেবে, তবে এটি বাস্তবায়ন করা অযৌক্তিকভাবে আরও ব্যয়বহুল।


60
@ এডনিস - আচ্ছা, আপনার এসকিউএল বৈকল্পিকের একটি উদ্ধৃতিটি কী? "? '?"? ইউ + 2018? 201 u2018? কী আলাদা আলাদা ভাব প্রকাশ করার কৌশল আছে? আপনার উপকণাগুলি আপডেট করতে পারে ? বিবেচনা করার মতো অনেক কিছুই রয়েছে।
টেলাস্টিন

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

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

8
@ ডেনিস মিঃ হেনরি নল এটি সঠিকভাবে করার জন্য আপনাকে ধন্যবাদ জানাবে।
ম্যাথিউ গুইন্ডন

14
@ ডেনিস প্রথম নাম অপ্রাসঙ্গিক। শেষ নামটি নিয়েই সমস্যা with দেখুন স্ট্যাক ওভারফ্লো , Programmers.SE , ফক্স স্পোর্টস , তারযুক্ত , বিবিসি , এবং অন্য যাই হোক না কেন আপনি আপ একটি দ্রুত Google অনুসন্ধানে ;-) চালু করতে পারেন
ম্যাথিউকে Guindon

80

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


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


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

8
@ ডেনিস: স্যানিটাইজিং বা ফিল্টারিংয়ের অর্থ তথ্য অপসারণ । এনকোডিং মানে তথ্য হারাতে না করে ডেটার প্রতিনিধিত্বকে রূপান্তরিত করা ।
জ্যাকবিবি

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

3
@ ডেনিস: সঠিক সন্নিবেশের জন্য উদ্ধৃতিটি অব্যাহত রাখতে স্ল্যাশটি O\'Malleyব্যবহার করছেন (কমপক্ষে কিছু ডাটাবেসে)। এমএস এসকিউএল বা অ্যাক্সেসে এটি অতিরিক্ত উদ্ধৃতি দিয়ে পালানো যায় । আপনার নিজের এটি করতে হলে খুব পোর্টেবল নয়। O''Malley
আবরাকাডাভ

5
কোনও সিস্টেমের দ্বারা আমার নাম কীভাবে প্রকাশিত হয়েছে তা আমি আপনাকে বলতে পারি না। কখনও কখনও আমি এমনকি আমার নাম ব্যবহার করে এসকিউএল ইঞ্জেকশনের ফলেও ত্রুটিগুলি দেখেছি। হেক, আমাকে একবার আমার ব্যবহারকারীর নাম পরিবর্তন করতে বলা হয়েছিল কারণ আমি আসলে ব্যাকএন্ডে কিছু ভাঙ্গছিলাম।
আলেকজান্ডার ও'মারা

60

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

List<Integer> list = /* a list of 1, 2, 3 */
String strList = list.toString();   /* to get "[1, 2, 3]" */
strList = /* manipulate strList to become "[1, 2, 5, 3]" */
list = parseList(strList);

যদি কেউ এটি করার পরামর্শ দেয় তবে আপনি যথাযথভাবে প্রতিক্রিয়া জানাতে পারবেন যে এটি বরং হাস্যকর, এবং একজনের কেবল এটি করা উচিত:

List<Integer> list = /* ... */;
list.add(5, position=2);

যা এর ধারণাগত স্তরে ডেটা স্ট্রাকচারের সাথে ইন্টারঅ্যাক্ট করে। এটি কীভাবে সেই কাঠামোটি মুদ্রিত বা পার্স করা যায় তার কোনও নির্ভরতার পরিচয় দেয় না। এগুলি সম্পূর্ণরূপে অর্থেগোনাল সিদ্ধান্ত।

আপনার প্রথম পদ্ধতিটি প্রথম নমুনার মতো (কেবলমাত্র কিছুটা খারাপ): আপনি ধরে নিচ্ছেন যে আপনি ক্রমবর্ধমানভাবে স্ট্রিংটি তৈরি করতে পারবেন যা আপনার পছন্দের ক্যোয়ারী হিসাবে সঠিকভাবে পার্স হবে। এটি পার্সার এবং স্ট্রিং প্রসেসিং লজিকের পুরো গোছা উপর নির্ভর করে।

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

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

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

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

Variable a = new Variable("a");
Variable b = new Variable("b");
Let let = new Let();
let.getBindings().add(new LetBinding(a,b));
let.setBody(a);
return let;

সেরকম কিছু দিয়ে, সিনট্যাকটিকভাবে অবৈধ এমন কোনও কিছু ফিরিয়ে দেওয়া অসম্ভব এবং দুর্ঘটনাক্রমে এমন কোনও কিছু প্রত্যাবর্তন করা খুব শক্ত যে আপনি যা চান তা দুর্ঘটনাক্রমে নয়।


ভাল ব্যাখ্যা!
মাইক পার্টরিজ

2
আপনি আমাকে "ভাল উপমা" এ হারিয়েছেন তবে আমি পূর্বের ব্যাখ্যার ভিত্তিতে উজ্জীবিত হয়েছি। :)
ওয়াইল্ডকার্ড

1
দুর্দান্ত উদাহরণ! - এবং আপনি যোগ করতে পারেন: ডেটাটাইপের উপর নির্ভর করে কখনও কখনও পার্সেবল স্ট্রিং তৈরি করা এমনকি সম্ভবও হয় না বা সম্ভবও হয় না। - আমার পরামিতিগুলির মধ্যে একটি যদি গল্পের খসড়া (~ 10.000 অক্ষর) সহ একটি মুক্ত-পাঠ্য ক্ষেত্র হয় ? বা যদি কোনও পরামিতি একটি জেপিজি-চিত্র হয় ? - তারপরে একমাত্র উপায় হ'ল একটি প্যারামিটারাইজড ক্যোয়ারী
ফ্যালকো

আসলে না - এটি কেন প্রস্তুত বিবৃতিগুলি এসকিএলএল ইনজেকশনের প্রতিরক্ষা হিসাবে বিকশিত হয়েছিল এ সম্পর্কে একটি সুন্দর খারাপ বর্ণনা। বিশেষত কোড উদাহরণটি জাভাতে দেওয়া হয়েছে যা প্যারামিটারাইজড কোয়েরিগুলির সময় নয় যেখানে সময়সীমার ক্ষেত্রে সম্ভবত সি-সি ++ যেখানে শিল্পের অবস্থা হিসাবে বিবেচিত হত develop এসকিউএল ডেটাবেসগুলি 1970-1980 সময়সীমার শুরুর বছরগুলিতে ব্যবহার করা শুরু হয়েছিল। উচ্চ স্তরের ভাষার আগে যেখানে জনপ্রিয় AY হেক, আমি বলব যে তাদের মধ্যে অনেকে ডেটাবেসগুলির সাথে কাজ করা আরও সহজ করেছেন (পাওয়ার বিল্ডার কেউ?)
টমটম

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

21

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


10
এসকিউএল প্রথম আবিষ্কার হওয়ার পর থেকেই এসকিউএল ইঞ্জেকশন একটি সমস্যা হয়ে দাঁড়িয়েছে। এটি পরে কোনও ইস্যুতে পরিণত হয় নি।
পরিবেশন করুন

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

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

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

6
তারা এসকিউএল ইঞ্জেকশন সম্পর্কে সচেতনতার পূর্বাভাস দিতে পারে ।
ব্যবহারকারী 253751

20

সরলভাবে বলেছেন: তারা তা করেনি। আপনার বিবৃতি:

কেন এসকিউএল ইঞ্জেকশন প্রতিরোধের ব্যবস্থাগুলি প্যারামিটারাইজড কোয়েরিগুলি ব্যবহারের দিকের দিকে বিকশিত হয়েছিল?

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

আমার 25 বছর আগে এসকিউএল করার কথা মনে আছে (যখন ইন্টারনেট ব্যাপকভাবে ব্যবহৃত হয়নি - এটি তখন শুরু হয়েছিল) এবং আমি এসকিউএল বনাম IBM DB5 আইআইআরসি সংস্করণ 5 করার কথা মনে করি - এবং এর মধ্যে ইতিমধ্যে প্যারামিটারাইজড কোয়েরি ছিল।


ধন্যবাদ। কেন স্ট্রিং কনটেনটেশন এড়ানো প্রয়োজন ছিল? এটি আমার কাছে মনে হচ্ছে এটি একটি দরকারী বৈশিষ্ট্য হবে। কারও সাথে এটি নিয়ে সমস্যা আছে?
ডেনিস

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

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

হ্যাঁ, তবে আমি যেমন বলেছি - তাদের আবিষ্কারের সময়টি গতিশীল এসকিউএল একটি বেশ শালীন পারফরম্যান্স হিট নিয়ে এসেছিল;) আজও লোকেরা আপনাকে বলে যে স্কিএল সার্ভারে গতিশীল এসকিউএল কোয়েরি প্ল্যানগুলি পুনরায় ব্যবহার করা হয়নি (যা এইচএম - হিসাবে ভুল) আমি 2000 এবং 2007 এর মধ্যে কিছু পয়েন্ট বলেছি - তাই কোয়েট দীর্ঘ)। সেই পুরাতন সময়ে আপনি যদি একাধিকবার স্কোয়েল চালান তবে আপনি সত্যিই প্রস্তুত বিবৃতি চেয়েছিলেন;)
টমটম

ডায়নামিক এসকিউএল-এর জন্য পরিকল্পনার ক্যাচিং প্রকৃতপক্ষে 1998 সালে এসকিউএল সার্ভার 7.0-এ যুক্ত হয়েছিল - sqlmag.com
মাইক

13

অন্যান্য সমস্ত ভাল উত্তর ছাড়াও:

# 2 আরও ভাল হওয়ার কারণ হ'ল এটি আপনার কোড থেকে আপনার ডেটা পৃথক করে। # 1 এ আপনার ডেটা আপনার কোডের অংশ এবং সেখানেই সমস্ত খারাপ জিনিস আসে। # 1 দিয়ে আপনি আপনার ক্যোয়ারী পেয়েছেন এবং আপনার ক্যোয়ারীটি আপনার ডেটাটিকে ডেটা হিসাবে বোঝে তা নিশ্চিত করার জন্য অতিরিক্ত পদক্ষেপগুলি সম্পাদন করতে হবে যেখানে # 2 এ আপনি আপনার কোড পেয়েছেন এবং এটি কোড এবং আপনার ডেটা ডেটা।


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

11

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

এসকিউএল ডাটাবেস দৃষ্টিকোণ থেকে select * from employees where last_name = 'Smith'এবং select * from employees where last_name = 'Fisher'স্বতন্ত্রভাবে পৃথক এবং অতএব পৃথক বিশ্লেষণ, সংকলন এবং অপ্টিমাইজেশন প্রয়োজন। সংকলিত বিবৃতিগুলি সংরক্ষণ করার জন্য উত্সর্গীকৃত মেমরি অঞ্চলে তারা পৃথক স্লটও দখল করবে। প্রচুর পরিমাণে অনুরূপ ক্যোয়ারী সহ ভারী লোড সিস্টেমে বিভিন্ন পরামিতিগুলির গণনা এবং মেমরির ওভারহেড যথেষ্ট পরিমাণে হতে পারে।

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


আমি মনে করি এটি তত্ত্ব (প্যারামিটারাইজড কোয়েরির জন্য ব্যবহৃত প্রস্তুত বিবৃতিগুলির ভিত্তিতে)। বাস্তবে, আমি সন্দেহ করি যে এটি প্রায়শই ঘটে থাকে, কারণ বেশিরভাগ বাস্তবায়ন কেবল একটি কলটিতে প্রস্তুত-বাঁধাই-এক্সিকিউট করে দেবে, সুতরাং প্রতিটি প্যারামিটারাইজড ক্যোয়ারির জন্য আলাদাভাবে প্রস্তুত বিবৃতি ব্যবহার করুন যতক্ষণ না আপনি প্রকৃত বিবৃতি প্রস্তুত করার জন্য স্পষ্ট পদক্ষেপ গ্রহণ করেন (এবং একটি গ্রন্থাগার) -level prepareপ্রায়শই একটি আসল এসকিউএল-স্তর থেকে বেশ আলাদা হয় prepare)।
jcaron

নিম্নলিখিত প্রশ্নগুলি এসকিউএল পার্সারের থেকেও পৃথক: SELECT * FROM employees WHERE last_name IN (?, ?)এবং SELECT * FROM employees WHERE last_name IN (?, ?, ?, ?, ?, ?)
দামিয়ান ইয়ারিক

হ্যা তাদের আছে. এমএস কেন 1998 সালে এসকিউএল সার্ভারে ক্যোয়ারী প্ল্যান ক্যাচিং যুক্ত করেছিল 7. কারণ হিসাবে: আপনার তথ্য প্রজন্মের পুরানো।
টমটম

1
@ টমটম - ​​ক্যোয়ারী প্ল্যান ক্যাচিং অটো-প্যারামিটারাইজেশনের মতো নয়, যেখানে আপনি ইঙ্গিত করছেন বলে মনে হচ্ছে। হিসাবে হিসাবে, আপনি পোস্ট করার আগে পড়ুন।
mustaccio

@ মুস্তাকসিও আসলে কমপক্ষে এমএস একই সাথে উভয়ের পরিচয় করিয়ে দিয়েছে।
টমটম

5

অপেক্ষা কর তবে কেন?

বিকল্প 1 এর অর্থ আপনাকে সর্বদা টাইপের ইনপুটগুলির জন্য স্বাস্থ্যকর রুটিন লিখতে হবে যেখানে বিকল্প 2 আপনার পক্ষে লেখার / পরীক্ষা / রক্ষণাবেক্ষণের জন্য কম ত্রুটি-প্রবণ এবং কম কোড।

প্রায় অবশ্যই "সমস্ত সতর্কতার যত্ন নেওয়া" আপনি যেটিকে ভাবেন এটি আরও জটিল হতে পারে এবং আপনার ভাষার (উদাহরণস্বরূপ জাভা প্রিপারেশনস্টেটমেন্ট) আপনার ভাবার চেয়েও বেশি has

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


1
জেডিবিসি অ্যানিথিং স্যানিটাইজ করবে না। প্রোটোকলের প্যারামিটারের নির্দিষ্ট অংশ রয়েছে এবং ডিবি কেবল সেই পরামিতিগুলির ব্যাখ্যা করে না t এজন্য আপনি প্যারামিটার থেকে সারণির নাম সেট করতে পারেন।
টেলেক্স

1
কেন? যদি প্যারামিটারটি বিশ্লেষণ বা ব্যাখ্যা না করা হয় তবে কিছু এড়ানোর কোনও কারণ নেই।
টেলেক্স

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

2
@ আইএমএসওপি এটি আমার একটি ভুল ধারণা ছিল। যদিও আমি মনে করি এটি সাধারণ একটি কারণ আপনি এই প্রশ্নের দুটি সবচেয়ে বেশি উত্তর দেওয়াতে দেখতে পারেন এসও স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 3271249/… । আমি এটি সম্পর্কে পড়েছি এবং আপনি ঠিক বলেছেন। আমি উত্তর সম্পাদনা করেছি।
তুলাইনস কর্ডোভা

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

1

আসুন কল্পনা করুন একটি আদর্শ "স্যানিটাইজ, ফিল্টার এবং এনকোড" পদ্ধতির দেখতে কেমন হবে।

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

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

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

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

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

এবং একবার অনুসন্ধানগুলি প্যারামিটারাইজড হয়ে গেলে এটি নতুন সুযোগগুলি যেমন: পারফরম্যান্স অপটিমাইজেশন এবং সরলিকৃত তদারকি খুলে দেয়।

এনকোডিংটি সঠিকভাবে করা শক্ত, এবং এনকোডিং-ডান-রাইট প্যারামিটারাইজেশন থেকে পৃথক।

আপনি কি সত্যিই ভবন প্রশ্নের একটি উপায় হিসেবে স্ট্রিং ক্ষেপক মত, ভাষা (Scala এবং ES2015 মনে আসে) আছে প্লাগেবল স্ট্রিং ক্ষেপক একটি দম্পতি আছে, তাই যদি সেখানে হয় লাইব্রেরি , আপনি parameterised প্রশ্ন যা স্ট্রিং ক্ষেপক মত চেহারা লিখুন কিন্তু এসকিউএল ইঞ্জেকশন থেকে নিরাপদ - তাই ES2015 সিনট্যাক্সে:

import {sql} from 'cool-sql-library'

let result = sql`select *
    from users
    where user_id = ${user_id}
      and password_hash = ${password_hash}`.execute()

console.log(result)

1
"এনকোডিংটি সঠিকভাবে করা শক্ত" - হাহাহা। এইটা না. দু'একদিন, এটি সব নথিভুক্ত। আমি বহু বছর আগে একটি ওআরএম-এর জন্য একটি এনকোডার লিখেছিলাম (কারণ এসকিউএল সার্ভারের পরামিতিগুলির একটি সীমা রয়েছে এবং সুতরাং এটি একটি বিবৃতিতে 5000-10000 সারি সন্নিবেশ করানো সমস্যাযুক্ত (15 বছর পূর্বে) আমি মনে করি না যে একটি বড় সমস্যা হচ্ছে।
টমটম

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

3
@ টমটম এনকোডিংটি আপনি যথাসময়ে ফ্যাক্টর করার পরে সঠিকভাবে পাওয়া খুব শক্ত। আপনার ডিবি বিক্রেতা যখন পরবর্তী প্রকাশে একটি নতুন মন্তব্য শৈলী তৈরি করার সিদ্ধান্ত নেয় বা যখন একটি খালি শব্দ একটি আপগ্রেডে নতুন কীওয়ার্ড হয়ে যায় তখন আপনি কী করবেন? আপনি তাত্ত্বিকভাবে আপনার আরডিবিএমএসের একটি মুক্তির জন্য প্রকৃতপক্ষে এনকোডিং পেতে পারেন এবং পরবর্তী সংশোধনটিতে ভুল হতে পারেন। এমনকি যখন আপনি নন-স্ট্যান্ডার্ড সিনট্যাক্স ব্যবহার করে শর্তসাপেক্ষ মন্তব্য
এরিক

@ এরিক, এটি স্পষ্টতই ভয়াবহ। (আমি পোস্টগ্র্রেস ব্যবহার করি; যদি এর মধ্যে এমন কোনও উদ্ভট যুদ্ধের মুখোমুখি হয় তবে আমি এখনও তাদের মুখোমুখি হতে পারি নি।)
ওয়াইল্ডকার্ড

0

বিকল্প 1 এ, আপনি আকার = অসীমের একটি ইনপুট সেট নিয়ে কাজ করছেন যা আপনি খুব বড় আউটপুট আকারে মানচিত্রের চেষ্টা করছেন। বিকল্প 2-এ, আপনি যা কিছু বেছে নিন আপনার ইনপুটকে সীমাবদ্ধ করেছেন। অন্য কথায়:

  1. সাবধানে প্রদর্শণের এবং ফিল্টারিং [ অনন্ত জন্য] [ সকল নিরাপদ এসকিউএল কোয়েরি ]
  2. [ আপনার ক্ষেত্রের মধ্যে সীমাবদ্ধ পূর্বনির্ধারিত পরিস্থিতি ] ব্যবহার করে

অন্যান্য উত্তর অনুসারে, আপনার সুযোগ অসীম থেকে দূরে সীমাবদ্ধ করার এবং পরিচালনাযোগ্য কিছু দিকে কিছু কার্যকারিতা বেনিফিট বলে মনে হয়।


0

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

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

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

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

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


এটি সবই সুন্দর এবং জঘন্য, তবে এটি শিরোনাম অনুযায়ী প্রশ্নটির মোটেও সমাধান করে না।
টমটম

1
@ টমটম: আপনার অর্থ কী? প্রশ্নটি হ'ল কেন প্যারামিটারাইজড কোয়েরিগুলি এসকিউএল ইঞ্জেকশন প্রতিরোধের জন্য পছন্দের প্রক্রিয়া; আমার উত্তর ব্যাখ্যা করে যে প্যারামিটারাইজড কোয়েরিগুলি ব্যবহারকারীদের ইনপুটকে স্যানিটাইজ করার চেয়ে বেশি সুরক্ষিত এবং শক্তিশালী।
ড্যানিয়েল প্রাইডেন

আমি দুঃখিত, তবে আমার প্রশ্নে "এসকিউএল ইঞ্জেকশন প্রতিরোধ ব্যবস্থা কেন প্যারামিটারাইজড ক্যোয়ারী ব্যবহারের দিকে বিকশিত হয়েছিল?" Reads তাহারা করছিল না. এটি এখনকার বিষয় নয়, ইতিহাস সম্পর্কে।
টমটম

0

আমি এ সম্পর্কে এখানে লিখিতভাবে লিখেছি: https://stackoverflow.com/questions/6786034/can-parameterized-statement-stop-all-sql-inication/33033576#33033576

তবে, কেবল এটি সহজ রাখতে:

প্যারামিটারাইজড কোয়েরিগুলি যেভাবে কাজ করে তা হ'ল sqlQuery কে একটি ক্যোয়ারী হিসাবে প্রেরণ করা হয় এবং ডাটাবেসটি এই ক্যোয়ারীটি ঠিক কী করবে তা জানে এবং কেবলমাত্র এটি কেবলমাত্র মান হিসাবে ব্যবহারকারী নাম এবং পাসওয়ার্ডগুলি সন্নিবেশ করবে। এর অর্থ তারা কোয়েরিতে প্রভাব ফেলতে পারে না, কারণ কোয়েরিটি কী করবে তা ডাটাবেস ইতিমধ্যে জানে। সুতরাং এক্ষেত্রে এটি "নোবেইড বা 1 = 1 '-" এর ব্যবহারকারীর নাম এবং একটি ফাঁকা পাসওয়ার্ড সন্ধান করবে, যা ভুল হওয়া উচিত।

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


0

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

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

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

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

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

(আমি জোসিপের উত্তর আকর্ষণীয় পেয়েছি He তিনি মূলত বলেছেন যে প্যারামিটারাইজড কোয়েরিতে আপনি এসকিউএল-এর বিরুদ্ধে যে কোনও আক্রমণ বন্ধ করতে পারেন তবে জাভা স্ক্রিপ্ট ইনজেকশন তৈরি করতে আপনার ডাটাবেসে এমন পাঠ্য থাকতে পারে :-( ওয়েল, আমাদের আবার একই সমস্যা রয়েছে , এবং আমি জানি না জাভাস্ক্রিপ্টের এর কোনও সমাধান আছে কিনা।


-2

প্রধান সমস্যা হ্যাকাররা স্যানিটেশনকে ঘিরে যখন উপায় পেয়েছিল তখন প্যারামেট্রাইজড কোয়েরিগুলি একটি বিদ্যমান পদ্ধতি ছিল যা পারফরম্যান্স এবং স্মৃতির অতিরিক্ত সুবিধার সাথে নিখুঁতভাবে কাজ করে।

কিছু লোক সমস্যাটিকে "এটি কেবলমাত্র একক উদ্ধৃতি এবং ডাবল উক্তি" হিসাবে সরল করে তোলে তবে হ্যাকাররা বিভিন্ন এনকোডিংগুলি ব্যবহার করা বা ডাটাবেস ফান্ট ব্যবহারের মতো সনাক্তকরণ এড়ানোর দুর্দান্ত উপায় খুঁজে পেয়েছিল।

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

অন্যদিকে কেবল কনটেনেটেড ক্যোয়ারীগুলি ব্যবহার করা ব্যবহার করা শেখার এবং এটির অভ্যস্ত হওয়া মাত্র।

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