PostgreSQL এ একক উদ্ধৃতি সহ পাঠ্য সন্নিবেশ করুন


432

আমি একটা টেবিল আছে test(id,name)

আমি মান সন্নিবেশ করা প্রয়োজন: user's log, 'my user', customer's

 insert into test values (1,'user's log');
 insert into test values (2,''my users'');
 insert into test values (3,'customer's');

আমি উপরের বিবৃতিগুলির কোনও চালনা করলে আমি একটি ত্রুটি পাচ্ছি।

সঠিকভাবে এটি করার জন্য যদি কোনও পদ্ধতি থাকে তবে শেয়ার করুন। আমি কোনও প্রস্তুত বিবৃতি চাই না।

এসকিএল পালানোর প্রক্রিয়াটি ব্যবহার করা কি সম্ভব?


1
আপনার ক্লায়েন্ট লাইব্রেরি যে পরিমাণ মান সরবরাহ করে তা ব্যবহার করুন। আরও তথ্যের জন্য আপনাকে বলতে হবে যে কীভাবে আপনি ডাটাবেস অ্যাক্সেস করছেন।
রিচার্ড Huxton

@ রিচার্ড হেক্সটন ডাটাবেসটি জাভা দ্বারা অ্যাক্সেস করা হয়।
মাহি

2
সুতরাং স্ট্যান্ডার্ড jdbc স্থানধারক ব্যবহার করুন। বা কেন এটি সর্বোত্তম পছন্দ নয় তা ব্যাখ্যা করুন।
রিচার্ড Huxton

@ রিচার্ড হাক্সটন আমি বলছি না যে এটি সর্বোত্তম পছন্দ নয়, আমি অনুসন্ধান করছি যে এটির জন্য এসকিএল-তে কোনও পালানোর পদ্ধতি রয়েছে কিনা।
মাহি

ঠিক আছে, নীচে @ ক্লাডিক্সের জবাবটি দেখুন, তবে স্পষ্টতই মূল্যবান আক্ষরিকদের বিভিন্ন ধরণের postgresql.org/docs/current/static/datatype.html- র
রিচার্ড হাক্টসন

উত্তর:


763

স্ট্রিং আক্ষরিক

একক উদ্ধৃতিগুলি 'দ্বিগুণ করে পালিয়ে যাওয়া -> ''এটি আদর্শ উপায় এবং অবশ্যই কাজ করে:

'user's log'     -- incorrect syntax (unbalanced quote)
'user''s log'

পুরাতন সংস্করণগুলিতে বা আপনি এখনও চালিয়ে যান standard_conforming_strings = offবা সাধারণত, যদি আপনি পসিক্স এস্কেপ স্ট্রিং সিনট্যাক্সE ঘোষণার সাথে আপনার স্ট্রিং প্রিপেন্ড করেন তবে আপনি ব্যাকস্ল্যাশ দিয়েও পালাতে পারবেন \:

E'user\'s log'

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

'escape '' with '''''
$$escape ' with ''$$

ডলার-কোটগুলির মধ্যে বিভ্রান্তি এড়াতে প্রতিটি জোড়ায় একটি অনন্য টোকেন যুক্ত করুন:

$token$escape ' with ''$token$

যে কোনও স্তরের সংখ্যা বাসাতে পারে:

$token2$Inner string: $token1$escape ' with ''$token1$ is nested$token2$

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

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

Postgres মধ্যে মান

ডাটাবেসের অভ্যন্তরে মানগুলি নিয়ে কাজ করার সময়, স্ট্রিং সঠিকভাবে উদ্ধৃত করার জন্য কয়েকটি কার্যকরী ফাংশন রয়েছে:

  • quote_literal()অথবাquote_nullable() - পরেরটি NULLনাল ইনপুটটির জন্য স্ট্রিং আউটপুট করে । (রয়েছে quote_ident()করার ডাবল উদ্ধৃতি স্ট্রিং যেখানে বৈধ এসকিউএল পেতে প্রয়োজন শনাক্তকারী ।)
  • format()বিন্যাস নির্দিষ্টকরণকারকের %Lসমতুল্য quote_nullable()
    ভালো লেগেছে:format('%L', string_var)
  • concat()বাconcat_ws() সাধারণত নেস্টেড একক কোট এবং ব্যাকস্ল্যাশগুলি এড়ায় না বলে ভাল হয় না

1
এটিও লক্ষণীয় যে কয়েকটি পিজজেডিবিসি সংস্করণে ডলার-উদ্ধৃতি নিয়ে সমস্যা রয়েছে - বিশেষত, এটি ডলার-উদ্ধৃত স্ট্রিংয়ের মধ্যে স্টেটমেন্ট-টার্মিনেটর (;) উপেক্ষা করতে ব্যর্থ হতে পারে।
ক্রেগ রিঞ্জার


1
এবং যদি আপনি পদ্ধতিগত ভাষা ইত্যাদির ক্ষেত্রে সন্নিবেশ করানোর ক্ষেত্রে পাঠ্য কলাম থেকে ছিটকে পালাতে চান তবে আপনি কোট_লাইটারাল (কলাম_নাম) স্ট্রিং ফাংশনটি ব্যবহার করতে পারেন।
আলেক্স্লিউ

1
$ টোকেন aw দুর্দান্ত। ধন্যবাদ।
পৌরাণিক

@ এরউইন ব্র্যান্ডসটেটার, আবার "যে কোনও স্তরের নেস্ট করা যেতে পারে": তবে SELECT $outer$OUT$inner$INNER$inner$ER$outer$;প্রমাণিত হয় যে ২ য় স্তরের নেস্টিং এখানে কাজ করে না।?
ফিলিপ্রেম

46

এটি অনেক খারাপের দুনিয়া, কারণ আপনার প্রশ্ন থেকেই বোঝা যাচ্ছে যে আপনার সম্ভবত এসকিউএল ইঞ্জেকশনটি ফাঁক রয়েছে আপনার অ্যাপ্লিকেশনটিতে গর্ত রয়েছে।

আপনার প্যারামিটারাইজড স্টেটমেন্ট ব্যবহার করা উচিত। জাভা জন্য, PreparedStatementস্থানধারীদের সাথে ব্যবহার করুন । আপনি বলেছিলেন যে আপনি প্যারামিটারাইজড স্টেটমেন্ট ব্যবহার করতে চান না, তবে কেন আপনি তা ব্যাখ্যা করেন না এবং সত্যই এটি তাদের ব্যবহার না করার একটি খুব ভাল কারণ হতে হবে কারণ আপনি যে সমস্যাটি চেষ্টা করছেন সেটি ঠিক করার সহজতম ও নিরাপদ উপায়'re সমাধান করা.

জাভাতে এসকিউএল ইঞ্জেকশন প্রতিরোধ দেখুন । ববির পরবর্তী শিকার হবেন না ।

স্ট্রিং কোটিং এবং পলায়নের জন্য পিজিজেডিবিসিতে কোনও পাবলিক ফাংশন নেই। এটি আংশিক কারণ এটি এটিকে একটি ভাল ধারণা বলে মনে হতে পারে।

সেখানে হয় বিল্ট-ইন ফাংশন উদ্ধৃতি quote_literalএবং quote_identপোস্টগ্রি মধ্যে, কিন্তু তারা জন্য PL/PgSQLব্যবহারের ফাংশন EXECUTE। এই দিনগুলি quote_literalবেশিরভাগই অপ্রচলিত EXECUTE ... USING, যা প্যারামিটারাইজড সংস্করণ , কারণ এটি নিরাপদ এবং সহজ । আপনি এখানে যে উদ্দেশ্যে ব্যাখ্যা করেছেন সে উদ্দেশ্যে আপনি সেগুলি ব্যবহার করতে পারবেন না কারণ তারা সার্ভার-সাইড ফাংশন।


আপনি ');DROP SCHEMA public;--কোনও দূষিত ব্যবহারকারীর কাছ থেকে মান পেলে কী ঘটে তা কল্পনা করুন। আপনি উত্পাদন করতে চাই:

insert into test values (1,'');DROP SCHEMA public;--');

যা দুটি বক্তব্য এবং একটি মন্তব্য যা ভেঙে যায়:

insert into test values (1,'');
DROP SCHEMA public;
--');

ওফ, আপনার ডাটাবেস আছে।


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

@ রোবপ্রোগ কয়েকটি ক্লায়েন্ট ড্রাইভার = ANY(?)এবং আপনি একটি অ্যারের প্যারামিটার ব্যবহার করতে পারেন ।
ক্রেগ রিঞ্জার

12
ডিডিএল পাশাপাশি ডেটা বুটস্ট্র্যাপ করতে আমি প্রায়শই এর মতো আক্ষরিক সন্নিবেশ ব্যবহার করেছি। 'আপনি এটি ভুল করছেন' এর মতো প্রতিক্রিয়াগুলির চেয়ে প্রশ্নের উত্তর দেওয়ার চেষ্টা করি
ThatDataGuy

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

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

26

পোস্টগ্রাইএসকিউএল ডকুমেন্টেশন অনুসারে (৪.১.২.১। স্ট্রিং কনস্ট্যান্টস) :

 To include a single-quote character within a string constant, write two 
 adjacent single quotes, e.g. 'Dianne''s horse'.

আরও দেখুন standard_conforming_strings পরামিতি, যা নিয়ন্ত্রণ ব্যাকস্ল্যাশ কাজ সঙ্গে পলায়নের কিনা।


উত্তরের জন্য ধন্যবাদ, তবে আমি নিজেই এটি ব্যবহার করে প্রতিটি চর থেকে পালাতে হবে, যদি তাদের কাজগুলি করার জন্য কোনও কার্যনির্বাহী উপস্থিত থাকে?
মাহি

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

13

Postgresql এ আপনি যদি এর সাথে মান সন্নিবেশ করতে চান 'তবে এর জন্য আপনাকে অতিরিক্ত দিতে হবে'

 insert into test values (1,'user''s log');
 insert into test values (2,'''my users''');
 insert into test values (3,'customer''s');

আপনার যদি উদ্ধৃত স্ট্রিং থাকে তবে ট্রিপল কোটগুলি দেখানোর জন্য
আপভোট করুন

আপ, এটি একটি সহজ সমাধান হিসাবে
ক্যাটরিয়া


2

আপনার যদি পিজির ভিতরে কাজটি প্রয়োজন হয়:

to_json(value)

https://www.postgresql.org/docs/9.3/static/functions-json.html#FUNCTIONS-JSON-TABLE


এই প্রশ্নটি কীভাবে জেএসএনের সাথে সম্পর্কিত?
এরউইন ব্র্যান্ডসটেটার

1
@ এরউইন ব্র্যান্ডসেটেটার, দুঃখিত, আমি হয়ত বাইরে থাকি .. তবে এটি স্ট্রিংয়ে উদ্ধৃতিগুলি
ছাড়িয়ে

1
এটি পুরোপুরি আরেকটি বিষয়। আপনি ব্যবহার করতে পারেন format(), quote_literal()বা quote_nullable()উদ্ধৃতি উদ্ধার জন্য। দেখুন: স্ট্যাকওভারফ্লো.com
এরউইন ব্র্যান্ডস্টেটার

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