জাভা - এসকিউএল ইঞ্জেকশন প্রতিরোধের স্ট্রিং


146

আমি জাভাতে কিছু এন্টি এসকিএল ইঞ্জেকশন লাগানোর চেষ্টা করছি এবং "রিপ্লেসমেন্ট" স্ট্রিং ফাংশনটি নিয়ে কাজ করা খুব কঠিন মনে হচ্ছে। পরিশেষে আমি একটি ফাংশন যা যেকোনো বিদ্যমান রূপান্তর করবে প্রয়োজন \থেকে \\, কোনো "থেকে \"কোন 'থেকে \', এবং যে কোনো \nজন্য \\nতাই STRING কখন মাইএসকিউএল এসকিউএল ইনজেকশনও দ্বারা মূল্যায়ন করা হয় যে, ব্লক করা হবে।

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


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

2
সমস্ত এসকিউএল বিবৃতি প্যারামিটারাইজড হয় না, উদাহরণস্বরূপ "সেট রোল ভূমিকা নাম" বা "তালিকা চ্যানেল_নাম"
নীল ম্যাকগুইগান

1
@ নীলএমসিগুইগান ইয়েপ আপনি যে অংশটি প্যারামিটারাইজ করার চেষ্টা করছেন তা আসলে ডিএমএল সত্ত্বেও বেশিরভাগ ড্রাইভারই প্যারামিটারাইজ করতে অস্বীকার করবে CREATE VIEW myview AS SELECT * FROM mytable WHERE col = ?যেহেতু মূল বিবৃতিটি একটি ডিডিএল- স্টেটমেন্ট ।
সেলডমনিডি

উত্তর:


249

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

public insertUser(String name, String email) {
   Connection conn = null;
   PreparedStatement stmt = null;
   try {
      conn = setupTheDatabaseConnectionSomehow();
      stmt = conn.prepareStatement("INSERT INTO person (name, email) values (?, ?)");
      stmt.setString(1, name);
      stmt.setString(2, email);
      stmt.executeUpdate();
   }
   finally {
      try {
         if (stmt != null) { stmt.close(); }
      }
      catch (Exception e) {
         // log this error
      }
      try {
         if (conn != null) { conn.close(); }
      }
      catch (Exception e) {
         // log this error
      }
   }
}

নাম এবং ইমেলের অক্ষরগুলি কী তা বিবেচনা না করেই, এই অক্ষরগুলি সরাসরি ডাটাবেসে স্থাপন করা হবে। তারা কোনওভাবেই INSERT বিবৃতিতে প্রভাব ফেলবে না।

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


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

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

2
আপনি যদি একটি INTEGER ক্ষেত্রে প্রবেশ করিয়ে থাকেন তবে আপনি একটি 'সেট-ইন্ট' ব্যবহার করতে চাইবেন। তেমনি, অন্যান্য সংখ্যাগত ডাটাবেস ক্ষেত্রগুলি অন্যান্য সেটার ব্যবহার করবে। আমি প্রিপারেস্টেটমেন্ট ডক্সে একটি লিঙ্ক পোস্ট করেছি যা সমস্ত সেটারের ধরণের তালিকা করে।
কালেব ব্রাসি

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

2
@ কালেব ব্রাসি, ধন্যবাদ এটা জানা ভাল. সরঞ্জামগুলি প্রতিটি পরিবেশে পৃথক, তবে প্যারামিটারাইজড কোয়েরিতে নেমে যাওয়া মৌলিক উত্তর।
কাইলন বিড়াল

46

এসকিউএল ইঞ্জেকশন প্রতিরোধের একমাত্র উপায় হ'ল প্যারামিটারাইজড এসকিউএল। যারা জীবিকার জন্য এসকিউএল হ্যাক করে তাদের চেয়ে স্মার্ট এমন একটি ফিল্টার তৈরি করা সহজ নয়।

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


11
এমনকি প্যারামিটারাইজড এসকিউএল 100% গ্যারান্টি নয়। তবে এটি খুব ভাল শুরু।
duffymo

2
@ ডিফাইমো, আমি সম্মত হই যে কোনও কিছুই এখন পর্যন্ত 100% নিরাপদ নয়। আপনার কাছে কি এসকিউএল ইঞ্জেকশনের একটি উদাহরণ রয়েছে যা প্যারামিটারাইজড এসকিউএল এর সাথেও কাজ করবে?
কাইলন বিড়াল

3
@ কাইলন বিড়াল: অবশ্যই, যখন এসকিউএল এর একটি অংশ (@WhereClause বা @tableName) প্যারামিটার হিসাবে পাস করা হয়, এসকিউএলে সংযুক্ত করে এবং গতিশীলভাবে কার্যকর করা হয় uted এসকিউএল ইঞ্জেকশনটি ঘটে যখন আপনি ব্যবহারকারীদের আপনার কোডটি লিখতে দেন। আপনি তাদের কোডটি প্যারামিটার হিসাবে ক্যাপচার করেছেন কিনা তা বিবেচ্য নয়।
স্টিভ কাস

16
BTW, আমি কেন এই আরো উল্লেখ নেই জানি না, কিন্তু PreparedStatements সঙ্গে কাজ হয় অনেক সহজ এবং অনেক আরো পাঠযোগ্য। এই একা সম্ভবত তাদের প্রতিটি প্রোগ্রামার যারা তাদের সম্পর্কে জানেন তাদের ডিফল্ট করে তোলে।
এডান মাওর

3
দয়া করে মনে রাখবেন যে কিছু ডেটাবেসের প্রস্তুতিমূলক স্টেটমেন্টগুলি তৈরি করা খুব ব্যয়বহুল, সুতরাং আপনার যদি এগুলি প্রচুর করার দরকার হয় তবে উভয় প্রকারের মাপ দিন।
থরবজর্ন রাভন অ্যান্ডারসন

36

যদি সত্যিই আপনি প্রতিরক্ষা বিকল্প 1 ব্যবহার করতে না পারেন : প্রস্তুত বিবৃতি (প্যারামিটারাইজড ক্যোয়ারী) বা প্রতিরক্ষা বিকল্প 2: সঞ্চিত পদ্ধতি , নিজের সরঞ্জাম তৈরি করবেন না, OWASP এন্টারপ্রাইজ সুরক্ষা API ব্যবহার করুন । গুগল কোডে হোস্ট করা ওডব্লিউএসপি ইএসপিআই থেকে :

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

আরও তথ্যের জন্য, জাভাতে এসকিউএল ইনজেকশন প্রতিরোধ করা এবং এসকিউএল ইঞ্জেকশন প্রতিরোধ চিট শিট দেখুন

প্রতিরক্ষা বিকল্প 3 তে বিশেষ মনোযোগ দিন : OWASP ESAPI প্রকল্পের সাথে পরিচয় করিয়ে দেওয়া সমস্ত ব্যবহারকারীর সরবরাহিত ইনপুটটি পালিয়ে যাওয়া )।


4
ইএসএপিআই আজকের মতো অচল মনে হচ্ছে। ডাব্লুএইচএসে এসএকিউএল ইঞ্জেকশন, এক্সএসএস ইত্যাদির বিরুদ্ধে সাহায্য করতে পারে এমন ডাব্লুএএফএ রয়েছে এই মুহুর্তে অন্য কোনও বিকল্প আছে কি?
ক্রিসঅডনি

@ ক্রিসডডনি এ ডাব্লুএএফকে সহজেই বাইপাস করা যায়। বেশিরভাগ ফ্রেমওয়ার্কগুলি ইতিমধ্যে তাদের নিজস্ব এসকিউএল-ইঞ্জেকশন প্রতিরোধ বাস্তবায়ন করে যেখানে তারা নিজেরাই প্যারামিটারগুলি স্বয়ংক্রিয়ভাবে এড়ায়। উত্তরাধিকার প্রকল্পের বিকল্প: owasp.org/index.php/…
জাভান আর।

19

(এটি মূল প্রশ্নের অধীনে ওপি'র মন্তব্যের উত্তরে; আমি পুরোপুরি একমত যে প্রিপেইড স্টেটমেন্টই এই কাজের জন্য হাতিয়ার, রেজেক্সেস নয়।)

আপনি যখন বলছেন \n, আপনি কি অনুক্রমটি \+ nবা একটি আসল লাইনফিড অক্ষরটি বোঝাতে চান ? যদি এটি \+ হয় nতবে কাজটি বেশ সোজা for

s = s.replaceAll("['\"\\\\]", "\\\\$0");

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

আপনার যদি ইনপুটটিতে একটি লাইনফিড অক্ষর থাকে এবং আপনি এটিকে একটি পালানোর অনুক্রমের সাথে প্রতিস্থাপন করতে চান তবে আপনি এটির সাহায্যে ইনপুটটিতে দ্বিতীয় পাস করতে পারেন:

s = s.replaceAll("\n", "\\\\n");

অথবা হতে পারে আপনি দুটি ব্যাকস্ল্যাশ চান (আমি এ সম্পর্কে খুব পরিষ্কার নয়):

s = s.replaceAll("\n", "\\\\\\\\n");

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

1
যেহেতু এটি কেবল একটি অস্থায়ী কুল্জ, তাই এগিয়ে যান এবং প্রস্তুতিমূলক স্টেটমেন্টের উত্তরগুলির একটি গ্রহণ করুন।
অ্যালান মুর

12

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


1
OWASP চিট শিটগুলি গিটহাবে সরানো হয়েছে। এসকিউএল ইঞ্জেকশন চিট শীটটি এখন এখানে রয়েছে: github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/…
theferrit32

10

প্রস্তুত বিবৃতি হ'ল সর্বোত্তম সমাধান, তবে আপনাকে যদি সত্যিই এটির প্রয়োজন হয় তবে আপনি StringEscapeUtilsঅ্যাপাচি কমন্স-ল্যাং লাইব্রেরি থেকে ক্লাসটি ব্যবহার করতে পারেন । এটির একটি escapeSql(String)পদ্ধতি রয়েছে, যা আপনি ব্যবহার করতে পারেন:

import org.apache.commons.lang.StringEscapeUtils; … String escapedSQL = StringEscapeUtils.escapeSql(unescapedSQL);


2
রেফারেন্সের জন্য: commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/… যাইহোক, এই পদ্ধতিটি কেবল উদ্ধৃতিগুলি থেকে বেরিয়ে যায় এবং এসকিউএল ইনজেকশন আক্রমণ রোধ করে বলে মনে হয় না।
পাকো আবাতো

11
এটি সর্বশেষতম সংস্করণগুলি থেকে সরানো হয়েছে কারণ এটি কেবল একক উদ্ধৃতি থেকে
রক্ষা পেয়েছিল

2
এই উত্তরটি মুছে ফেলা উচিত কারণ এটি স্ক্লো ইনজেকশন প্রতিরোধ করে না।
জাভান আর।

9

একটি এসকিউএল ইঞ্জেকশন শোনার কারণ হতে পারে এমন পাঠ্য অপসারণ করতে একটি নিয়মিত অভিব্যক্তি ব্যবহার করা যেমন এসকিউএল বিবৃতিটি একটি এর Statementপরিবর্তে ডাটাবেসে প্রেরণ করা হচ্ছে PreparedStatement

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

আরও তথ্যের জন্য, জাভা টিউটোরিয়ালগুলি থেকে প্রস্তুত বিবৃতি ব্যবহার শুরু করার জন্য ভাল জায়গা হবে।


6

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


5

আপনার নীচের নীচের কোডটি প্রয়োজন। এক নজরে, এটি আমার তৈরি করা কোনও পুরানো কোডের মতো দেখাবে। তবে, আমি যা করেছি তা হ'ল http://grepcode.com/file/repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.31/com/mysql/jdbc/PredparedStatement- র জন্য উত্স কোডটি দেখুন। java । তারপরে, আমি সাবধানতার সাথে সেট স্ট্রিংয়ের কোডটি দেখতে পেলাম (int প্যারামিটার ইন্ডেক্স, স্ট্রিং এক্স) এটি যে অক্ষরগুলি থেকে যায় তা সন্ধান করতে এবং এটি আমার নিজের শ্রেণিতে কাস্টমাইজ করে যাতে এটি আপনার প্রয়োজনের উদ্দেশ্যে ব্যবহার করা যায়। সর্বোপরি, যদি এটি ওরাকল পালিয়ে যায় এমন অক্ষরের তালিকা হয়, তবে এটি জেনে রাখা সত্যই সুরক্ষার ভিত্তিতে স্বস্তিদায়ক। পরবর্তী বড় জাভা রিলিজের জন্য ওরাকল এর অনুরূপ একটি পদ্ধতি যুক্ত করার জন্য নাকের প্রয়োজন হতে পারে।

public class SQLInjectionEscaper {

    public static String escapeString(String x, boolean escapeDoubleQuotes) {
        StringBuilder sBuilder = new StringBuilder(x.length() * 11/10);

        int stringLength = x.length();

        for (int i = 0; i < stringLength; ++i) {
            char c = x.charAt(i);

            switch (c) {
            case 0: /* Must be escaped for 'mysql' */
                sBuilder.append('\\');
                sBuilder.append('0');

                break;

            case '\n': /* Must be escaped for logs */
                sBuilder.append('\\');
                sBuilder.append('n');

                break;

            case '\r':
                sBuilder.append('\\');
                sBuilder.append('r');

                break;

            case '\\':
                sBuilder.append('\\');
                sBuilder.append('\\');

                break;

            case '\'':
                sBuilder.append('\\');
                sBuilder.append('\'');

                break;

            case '"': /* Better safe than sorry */
                if (escapeDoubleQuotes) {
                    sBuilder.append('\\');
                }

                sBuilder.append('"');

                break;

            case '\032': /* This gives problems on Win32 */
                sBuilder.append('\\');
                sBuilder.append('Z');

                break;

            case '\u00a5':
            case '\u20a9':
                // escape characters interpreted as backslash by mysql
                // fall through

            default:
                sBuilder.append(c);
            }
        }

        return sBuilder.toString();
    }
}

2
আমি মনে করি এই কোডটি উপরের লিঙ্কে উত্স কোডটির পচা সংস্করণ। এখন নতুন মধ্যে mysql-connector-java-xxx, case '\u00a5'এবং case '\u20a9'বিবৃতি সরানো হয়েছে থাকার মনে
zhy

আমি আপনার কোডটি দিয়ে স্ক্যলম্যাপটি ব্যবহার করেছিলাম এবং এটি আমাকে ফ্রাইস্ট আক্রমণ থেকে রক্ষা করতে পারেনি `প্রকার: বুলিয়ান ভিত্তিক অন্ধ শিরোনাম: এবং বুলিয়ান ভিত্তিক অন্ধ - কোথায় বা হাউজিং ক্লজ পেওলোড: q = 1% 'এবং 5430 = 5430 এবং'% ' = '`
শরীফ

দুঃখিত এটির কাজ কিন্তু শেষ সঞ্চিত সেশনের ফলাফলগুলি
দেখছিলাম

আপনি ব্যবহার করতে পারেন org.ostermiller.utils.StringHelper.escapeSQL()বা com.aoindustries.sql.SQLUtility.escapeSQL()
মোহাম্মদ এন্নাহাদি এল ইদ্রিসি

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

0

এসকিএলএম্যাপ প্রতিরোধ করার জন্য অনেকগুলি সমাধানের সন্ধান করার পরে এসকিএলএল ইনজেকশন থেকে প্রতিরোধ ব্যবস্থা, যদি উত্তরাধিকার সূত্রের ব্যবস্থা না হয় তবে যেখানে প্রস্তুত স্ট্যাচমেন্ট প্রয়োগ করা যায় না।

জাভা-সিকিউরিটি-ক্রস-সাইট-স্ক্রিপ্টিং-এক্সএস- এস -এসকিএল-ইনজেকশন বিষয় ছিল সমাধান?

আমি @ রিচার্ডের সমাধানটি চেষ্টা করেছি কিন্তু আমার ক্ষেত্রে কার্যকর হয়নি। আমি একটি ফিল্টার ব্যবহার করেছি

এই ফিল্টারটির লক্ষ্য হ'ল অনুরোধটিকে একটি নিজস্ব কোডিং মোড়কযুক্ত MyHttpRequestWrapper যা রুপান্তরিত করে:

org.springframework.web.util.HtmlUtils.htmlEPress (…) পদ্ধতির মাধ্যমে এইচটিএমএল কোডগুলিতে বিশেষ অক্ষর (<,>, ',…) সহ এইচটিটিপি প্যারামিটারগুলি। দ্রষ্টব্য: অ্যাপাচি কমন্সেও একই রকম সংঘর্ষ রয়েছে: org.apache.commons.lang.StringEcreenUtils.escapeHtml (…) এসকিউএল ইনজেকশন অক্ষর (',',…) অ্যাপাচি কমন্স সংঘর্ষের মাধ্যমে org.apache.commons.lang.StringEPressUtils। escapeSql (...)

<filter>
<filter-name>RequestWrappingFilter</filter-name>
<filter-class>com.huo.filter.RequestWrappingFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>RequestWrappingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>




package com.huo.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletReponse;
import javax.servlet.http.HttpServletRequest;

public class RequestWrappingFilter implements Filter{

    public void doFilter(ServletRequest req, ServletReponse res, FilterChain chain) throws IOException, ServletException{
        chain.doFilter(new MyHttpRequestWrapper(req), res);
    }

    public void init(FilterConfig config) throws ServletException{
    }

    public void destroy() throws ServletException{
    }
}




package com.huo.filter;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import org.apache.commons.lang.StringEscapeUtils;

public class MyHttpRequestWrapper extends HttpServletRequestWrapper{
    private Map<String, String[]> escapedParametersValuesMap = new HashMap<String, String[]>();

    public MyHttpRequestWrapper(HttpServletRequest req){
        super(req);
    }

    @Override
    public String getParameter(String name){
        String[] escapedParameterValues = escapedParametersValuesMap.get(name);
        String escapedParameterValue = null; 
        if(escapedParameterValues!=null){
            escapedParameterValue = escapedParameterValues[0];
        }else{
            String parameterValue = super.getParameter(name);

            // HTML transformation characters
            escapedParameterValue = org.springframework.web.util.HtmlUtils.htmlEscape(parameterValue);

            // SQL injection characters
            escapedParameterValue = StringEscapeUtils.escapeSql(escapedParameterValue);

            escapedParametersValuesMap.put(name, new String[]{escapedParameterValue});
        }//end-else

        return escapedParameterValue;
    }

    @Override
    public String[] getParameterValues(String name){
        String[] escapedParameterValues = escapedParametersValuesMap.get(name);
        if(escapedParameterValues==null){
            String[] parametersValues = super.getParameterValues(name);
            escapedParameterValue = new String[parametersValues.length];

            // 
            for(int i=0; i<parametersValues.length; i++){
                String parameterValue = parametersValues[i];
                String escapedParameterValue = parameterValue;

                // HTML transformation characters
                escapedParameterValue = org.springframework.web.util.HtmlUtils.htmlEscape(parameterValue);

                // SQL injection characters
                escapedParameterValue = StringEscapeUtils.escapeSql(escapedParameterValue);

                escapedParameterValues[i] = escapedParameterValue;
            }//end-for

            escapedParametersValuesMap.put(name, escapedParameterValues);
        }//end-else

        return escapedParameterValues;
    }
}

এটা ভাল java-security-cross-site-scripting-xss-and-sql-injection topic? আমি কোনও উত্তরাধিকারের আবেদনের সমাধান খুঁজে পাওয়ার চেষ্টা করছি।
কয়ট

0

থেকে: [SOURCE]

public String MysqlRealScapeString(String str){
  String data = null;
  if (str != null && str.length() > 0) {
    str = str.replace("\\", "\\\\");
    str = str.replace("'", "\\'");
    str = str.replace("\0", "\\0");
    str = str.replace("\n", "\\n");
    str = str.replace("\r", "\\r");
    str = str.replace("\"", "\\\"");
    str = str.replace("\\x1a", "\\Z");
    data = str;
  }
return data;

}


0

আপনি যদি পিএল / এসকিউএল ব্যবহার করে থাকেন তবে আপনি এটি ব্যবহার করতে পারেন DBMS_ASSERT এটি আপনার ইনপুটটি স্যানিটাইজ করতে পারে যাতে আপনি এসকিউএল ইঞ্জেকশনগুলি নিয়ে চিন্তা না করেই এটি ব্যবহার করতে পারেন।

উদাহরণস্বরূপ এই উত্তরটি দেখুন: https://stackoverflow.com/a/21406499/1726419

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