নোড.জেজে এসকিউএল ইঞ্জেকশন প্রতিরোধ করা


88

পিএইচপি যেভাবে তাদের বিরুদ্ধে সুরক্ষিত বিবৃতি প্রস্তুত করেছিল, নোড.জেএস (সর্বাধিক মডিউল সহ) এসকিউএল ইঞ্জেকশনগুলি প্রতিরোধ করা কি সম্ভব?

যদি তাই হয়, কিভাবে? যদি তা না হয় তবে কয়েকটি উদাহরণ কী যা আমার দেওয়া কোড বাইপাস করতে পারে (নীচে দেখুন)।


কিছু প্রসঙ্গ:

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

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

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

আমি কি আপাতত নোড-মাইএসকিএল-নেটিভে স্যুইচ করব , যেহেতু এটি প্রস্তুত বিবৃতি সরবরাহ করে? আমি এটি করতে দ্বিধাগ্রস্থ, কারণ এটি নোড-মাইএসকিএল হিসাবে সক্রিয় বলে মনে হচ্ছে না (যদিও এর অর্থ কেবল এটি সম্পূর্ণ হয়েছে)।

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

// Prevent xss
var clean_user = sanitizer.sanitize(username);

// assume password is hashed already
var post = {Username: clean_user, Password: hash};

// This just uses connection.escape() underneath
var query = connection.query('INSERT INTO users SET ?', post,
   function(err, results)
   {
       // Can a Sql injection happen here?
   });

উত্তর:


60

node-mysqlগ্রন্থাগার স্বয়ংক্রিয়ভাবে পলায়নের যখন ছিলাম আপনারা ইতিমধ্যে করছ সম্পাদন করে। Https://github.com/felixge/node-mysql#escaping-query-values দেখুন


4
আমার পোস্টে উল্লিখিত হিসাবে, আমি সচেতন যে লাইব্রেরি অক্ষরগুলি থেকে রক্ষা পেয়েছে, তবে আমি যদি সুরতকরণের প্রভাব সম্পর্কে আরও উদ্বিগ্ন তবে যদি আমি প্রস্তুত বিবৃতি কার্যকর করে এমন কোনও লাইব্রেরিতে না সরে যাই, তবে এমন কোনও এসকিউএল ইঞ্জেকশন রয়েছে যা এর সাথে সংঘটিত হতে পারে আমি বর্তমানে করছি?
funseiki

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

4
কিন্তু এটি কি সমস্ত এসকিউএল ইঞ্জেকশনগুলিকে প্রতিরোধ করে? এই উত্তরটি কমপক্ষে (পিএইচপি + মাইএসকিউএল এর জন্য) প্রস্তাব দেয় না এবং বোঝায় যে পিএইচপি-র প্রস্তুত বিবৃতিগুলি তা করে। আবার, এই পিএইচপি প্রসঙ্গে।
funseiki

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

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

12

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

সম্পাদনা: নোড-মাইএসকিএল-স্থানীয় একটি খাঁটি জাভাস্ক্রিপ্ট সমাধানও।

  • নম্বরগুলি অপরিবর্তিত রয়েছে
  • বুলিয়ানগুলি true/ falseস্ট্রিংয়ে রূপান্তরিত হয়
  • তারিখের অবজেক্টগুলি YYYY-mm-dd HH:ii:ssস্ট্রিংয়ে রূপান্তরিত হয়
  • বাফারগুলি হেক্স স্ট্রিংগুলিতে রূপান্তরিত হয়, যেমন X'0fa5'
  • স্ট্রিংগুলি নিরাপদে পালানো হয়
  • অ্যারেগুলি তালিকায় পরিণত হয়, যেমন ['a', 'b']turns'a', 'b'
  • নেস্টেড অ্যারেগুলি গোষ্ঠীভুক্ত তালিকায় পরিণত হয় (বাল্ক সন্নিবেশের জন্য), যেমন [['a', 'b'], ['c', 'd']]পরিবর্তিত হয়('a', 'b'), ('c', 'd')
  • বস্তুগুলিকে key = 'val'জোড়ায় পরিণত করা হয় । নেস্টেড অবজেক্টস স্ট্রিংয়ে কাস্ট করা হয়।
  • undefined/ nullএ রূপান্তরিত হয়NULL
  • NaN/ Infinityযেমন আছে তেমন বাকি আছে। মাইএসকিউএল এগুলিকে সমর্থন করে না, এবং তাদের মান প্রয়োগের আগ পর্যন্ত মান হিসাবে সন্নিবেশ করার চেষ্টা করা মাইএসকিউএল ত্রুটিগুলিকে ট্রিগার করবে।

এটি আপনাকে এ জাতীয় কাজ করতে দেয়:

var userId = 5;
var query = connection.query('SELECT * FROM users WHERE id = ?', [userId], function(err, results) {
  //query.sql returns SELECT * FROM users WHERE id = '5'
});

ঠিক এটার মতন:

var post  = {id: 1, title: 'Hello MySQL'};
var query = connection.query('INSERT INTO posts SET ?', post, function(err, result) {
  //query.sql returns INSERT INTO posts SET `id` = 1, `title` = 'Hello MySQL'
});

এই ফাংশনগুলি বাদ দিয়ে, আপনি পালানোর কাজগুলিও ব্যবহার করতে পারেন:

connection.escape(query);
mysql.escape(query);

ক্যোয়ারী শনাক্তকারীদের পালাতে:

mysql.escapeId(identifier);

এবং প্রস্তুত বিবৃতিতে আপনার মন্তব্যের প্রতিক্রিয়া হিসাবে:

ব্যবহারের দৃষ্টিকোণ থেকে, মডিউলটি দুর্দান্ত, তবে এটি এখনও পিএইচপি'র প্রস্তুতকৃত বিবৃতিগুলির মতো কিছু বাস্তবায়ন করতে পারেনি।

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

connection.config.queryFormat = function (query, values) {
  if (!values) return query;
  return query.replace(/\:(\w+)/g, function (txt, key) {
    if (values.hasOwnProperty(key)) {
      return this.escape(values[key]);
    }
    return txt;
  }.bind(this));
};

এটি সংযোগের ক্যোয়ারী বিন্যাসটিকে পরিবর্তন করে যাতে আপনি এর মতো প্রশ্নগুলি ব্যবহার করতে পারেন:

connection.query("UPDATE posts SET title = :title", { title: "Hello MySQL" });
//equivalent to
connection.query("UPDATE posts SET title = " + mysql.escape("Hello MySQL");

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

এটি মুরগির ও ডিমের প্রশ্নের ধরণের। আমি আমার ড্রাইভারটি সক্রিয়ভাবে বিকাশ করছি না কারণ বেশিরভাগ লোকেরা @ felixge- র ব্যবহার করেন আমি সম্ভবত নোড-মাইএসকিএল-তে প্রস্তুত বিবৃতিগুলি পোর্ট করার জন্য কিছুটা সময় নেওয়ার চেষ্টা করব কারণ এটি প্রকৃতপক্ষে কিছু কার্যকারিতা সুবিধা দেয় (এবং সম্ভাব্যভাবে এসকিএল ইঞ্জেকশনগুলি আরও শক্ত করে তোলে)। আপনি যদি এটিকে যাওয়ার সিদ্ধান্ত নেন তবে নির্দ্বিধায় মন্তব্য / পোস্ট করতে পারেন
আন্দ্রে সিদোরভ

4
@ ফুনসেকি আমি নিশ্চিত যে প্রস্তুত বিবৃতিগুলি সর্বোত্তম সমাধান হতে পারে তবে আমি নিশ্চিত যে পালানো এসকিউএল ইঞ্জেকশনগুলিকে রোধ করবে। যেহেতু মডিউলটি নিজেই জয়েন্ট দ্বারা সমর্থিত, তাই মডিউলটি সক্রিয় এবং স্পষ্টতই পুরোপুরি পরীক্ষা করা হয়েছে। যদি এই মডিউলটি উত্পাদনের জন্য প্রস্তুত না হয়, তবে আমি মনে করি না যে গত মাসে মাসে মডিউলটির প্রায় 1000 ডাউনলোড / দিন থাকবে। মনে রাখবেন নোড-মাইএসকিএল-নেটিভ এটি শেষ বিকাশ হওয়ার পরে 6 মাস, এবং নোড-মাইএসকিএল খুব সক্রিয়, এতে একাধিক লোক কাজ করে।
hexacyanide

@ অ্যান্ড্রেসিডোরভ মন্তব্যটির জন্য ধন্যবাদ - যদি আমি এটি মোকাবেলা করার চেষ্টা করি তবে আমি একটি আপডেট পোস্ট করব। আমি মনে করি না এটি শীঘ্রই খুব শীঘ্রই হবে, যদিও, এটি হ্যান্ডেল করা সহজ জন্তু হবে বলে মনে হয় না (আমার কাছে বর্তমানে সময় দেওয়ার চেয়ে আরও গবেষণা প্রয়োজন)। এছাড়াও ড্রাইভারটি তৈরি করার জন্য ধন্যবাদ - আপনি ছেলেরা কারণ নোড.জেএস দ্রুত অ্যাপ্লিকেশনগুলি চালানো সহজ করে তোলে
funseiki

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

12

আমি বুঝতে পারি এটি একটি পুরানো পোস্ট তবে মনে হচ্ছে কোনও উত্তর কখনই চিহ্নিত করা হয়নি তাই আমি এটি এখানে ফেলে দেব।

আপনি যে মডিউলটি ব্যবহার করছেন সেটি নিরাপদ কিনা তা পরীক্ষা করার ক্ষেত্রে আপনি বিভিন্ন রাস্তা অবধি নিতে পারেন। আমি প্রত্যেকের উপকার / বিবেচনা স্পর্শ করব যাতে আপনি আরও সুবিদিত সিদ্ধান্ত নিতে পারেন।

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

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

  2. একটি fuzzer তৈরি করুন, একটি ব্যবহার fuzzer বা অন্যান্য দুর্বলতার ফ্রেমওয়ার্ক যেমন metasploit , sqlMap ইত্যাদি সাহায্যের পরীক্ষা সমস্যা বিক্রেতা খোঁজ নাও হতে পারে জন্য। প্রো: এটি আপনি যে মডিউল / সফ্টওয়্যারটি প্রয়োগ করছেন তা জনসাধারণের অ্যাক্সেসের জন্য নিরাপদ কিনা তা গ্রহণযোগ্য স্তরে নিশ্চিত করার একটি নিশ্চিত অগ্নি পদ্ধতি হতে পারে। কন: এটি সময় সাপেক্ষ এবং ব্যয়বহুলও হয়ে যায়। অন্য সমস্যাটি মিথ্যা ইতিবাচক পাশাপাশি ফলাফলের অশিক্ষিত পর্যালোচনা থেকে শুরু করবে যেখানে কোনও সমস্যা থাকে তবে তা লক্ষ্য করা যায় না।

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

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


3

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

এটিও খুব সক্রিয় (শেষ পরিবর্তনটি 2-1 দিন থেকে হয়েছিল) আমি এর আগে চেষ্টা করেছিলাম না তবে আমি মনে করি এটি আপনি কী চান এবং আরও অনেক কিছু।


-1

সবচেয়ে সহজ উপায় হ'ল আপনার সমস্ত ডেটাবেস ইন্টারঅ্যাকশনকে তার নিজস্ব মডিউলে পরিচালনা করা যা আপনি নিজের রুটে রফতানি করে। আপনার রুটে যদি ডাটাবেসের কোনও প্রসঙ্গ না থাকে তবে এসকিউএল এটি কোনওভাবে স্পর্শ করতে পারে না।


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