পিএইচপি: \"উদ্ধৃতি\"। মাইএসকিউএল প্রশ্ন, স্ল্যাশ, উদ্ধৃতি পালানো লেখা। এসকিউএল ইনজেকশন Mysql পালানোর বিরুদ্ধে সুরক্ষা

তাই মূলত আমি MySQL এবং PHP এর এলাকায় গভীরভাবে খনন করেছি... বিশেষত ডাটাবেস এবং ফর্ম ইনপুট নিয়ে কাজ করার সময় আমার যে নিরাপত্তা ব্যবস্থা নেওয়া উচিত। এখনও অবধি আমি নিম্নলিখিতগুলিকে অত্যন্ত প্রস্তাবিত বলে পেয়েছি:

  1. প্রস্তুত বিবৃতি
  2. _real_escape_string() ব্যবহার করা হচ্ছে
  3. ম্যাজিক উদ্ধৃতি ব্যবহার না করা কারণ এটি ডাটাবেসগুলিকে বিভ্রান্ত করে এবং আপনাকে "আপনি এটিকে কল করেননি..." এর মতো জিনিসগুলি প্রদান করে।

এই সব মহান এবং আমি এটি উপর নজর রাখছি. যাইহোক, আমি ভাবছিলাম ডলার চিহ্ন [$], শতাংশ চিহ্ন [%] এবং সম্ভবত অন্যদের পালানো উচিত কিনা। প্রশ্ন ডলার চিহ্ন হিসাবে ব্যাখ্যা করতে পারে পিএইচপি ভেরিয়েবল, হতে পারে? আমি শুনেছি LIKE সিনট্যাক্স সম্পর্কে কি % প্রতীক বা এমনকি একটি ওয়াইল্ডকার্ড ব্যবহার করে? প্রস্তুত বিবৃতিগুলি প্রযুক্তিগতভাবে এই সমস্ত কিছুর যত্ন নেওয়া উচিত, তবে আমি কেবল নিরাপদে থাকতে চেয়েছিলাম এবং নিশ্চিত করতে চেয়েছিলাম যে আমি সঠিকভাবে সবকিছু পেয়েছি। যেসব ক্ষেত্রে আমি প্রস্তুত বিবৃতি ব্যবহার করতে ভুলে যাই বা কেবল তাদের অবহেলা করি, আমি আশা করেছিলাম যে প্রতিরক্ষার এই দ্বিতীয় লাইনটি আমাকে বলতে পারে যে আমি মাথা ঘোরা থেকে মুক্তি পেতে পারি।

পালানোর জন্য আমি বর্তমানে যা ব্যবহার করছি তা এখানে:

ফাংশন এস্কেপ($connection, $data)( $new_data = trim($data); $new_data = i_real_escape_string($connection, $new_data); $new_data = addcslashes($new_data, "%_$"); $new_data = htmlspecial ($new_data, ENT_NOQUOTES) ফেরত $new_data;

তাহলে এটা কি সঠিক? আমি কি ভয়ানক ভুল কিছু করছি? দয়া করে মনে রাখবেন যে ডাটাবেস ডেটা ফেরত দেওয়ার সময় আমাকে মুছতে হবে পিছনে braids$,% এবং _ চিহ্নের আগে।

আমি কি ভয়ানক ভুল কিছু করছি?

প্রথমে আপনার গবেষণা সম্পর্কে।

প্রস্তুত বিবৃতি - একমাত্রবিস্ময়কর জিনিস আপনি খুঁজে পেয়েছেন।

যদিও mysqli_real_escape_string ব্যবহার করে (অনুমান করা হচ্ছে আপনি প্রস্তুত বিবৃতি ব্যবহার করছেন) অকেজো এবং ক্ষতিকর(একটি ফলাফল তৈরি করা যা আপনি নিজেই উল্লেখ করেছেন: "আপনি ডাকছেন না...")।

এবং ম্যাজিক কোটগুলি অনেক আগেই ভাষা থেকে মুছে ফেলা হয়েছে - এইভাবে সত্যিই কিছু মূল্যবান নয়।

সুতরাং এমনকি আপনার প্রাথমিক প্রাঙ্গনে অধিকাংশ স্পষ্টভাবে ভুল.

এখন আপনার প্রশ্নে।

প্রশ্ন সম্ভবত একটি PHP পরিবর্তনশীল হিসাবে ডলার চিহ্ন ব্যাখ্যা করতে পারে?

আমি শুনেছি LIKE সিনট্যাক্স সম্পর্কে কি % প্রতীক বা এমনকি একটি ওয়াইল্ডকার্ড ব্যবহার করে?

হ্যাঁ, আপনি ঠিক শুনেছেন। LIKE অপারেটরের সঠিক উদ্দেশ্য হল একটি প্যাটার্ন অনুসন্ধান করা। এই অক্ষরগুলিকে LIKE-এ নিষ্ক্রিয় করা সামান্যতম অর্থপূর্ণ হবে না।

প্রতিবার আপনি LIKE অপারেটর ব্যবহার করতে যাচ্ছেন, আপনাকে অবশ্যই সিদ্ধান্ত নিতে হবে কোন নির্দিষ্ট অক্ষরটি ব্যবহার করতে হবে এবং কোনটি অননুমোদিত হবে। ব্যবহার করা যাবে না এককালীন সমাধান. উল্লেখ করার মতো নয় যে অন্যান্য সমস্ত mysql ইন্টারঅ্যাকশনে % চিহ্নের কোন বিশেষ অর্থ নেই।

প্রস্তুত বিবৃতি প্রযুক্তিগতভাবে এই সব যত্ন নেওয়া উচিত

$ বা % চিহ্নের সাথে প্রস্তুত বিবৃতিগুলির কোন সম্পর্ক নেই। প্রস্তুত বিবৃতিগুলি এসকিউএল ইনজেকশনকে নির্দেশ করে, কিন্তু কোনও অক্ষর এটির কারণ হতে পারে না (আপনি "ইনজেকশন" কে সঠিকভাবে ব্যবহৃত LIKE অপারেটর বলতে পারেন না, আপনি কি পারেন?)।

অবশেষে, সবচেয়ে খারাপ অংশে।

যদি আপনি প্রস্তুত বিবৃতি ব্যবহার করতে ভুলে যান বা সেগুলি অনুসরণ করতে অবহেলা করেন,

কিছুই আপনাকে রক্ষা করবে না।

এবং ন্যূনতম সাহায্য আপনার বিকাশ ফাংশন থেকে হবে.

সারসংক্ষেপ।

  1. এই বৈশিষ্ট্য পরিত্রাণ পেতে.
  2. ব্যবহার করুন ফিলার*ক্যোয়ারীতে প্রতিটি পৃথক ভেরিয়েবলের প্রতিনিধিত্ব করতে।
  3. এস্কেপ % এবং _ অক্ষর ইনপুটে শুধুমাত্র যদি সেগুলি LIKE অপারেটরে ব্যবহার করা হবে এবং আপনি তাদের ব্যাখ্যা করতে চান না।
  4. আউটপুটের জন্য htmlspecialchars() ব্যবহার করুন, mysql ইনপুট নয়।

* প্রস্তুত বিবৃতি পড়ুন যদি এই শব্দটি আপনার কাছে অপরিচিত হয়।

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

আপনাকে শুধুমাত্র % এবং _ এড়িয়ে যেতে হবে যদি আপনি LIKE আর্গুমেন্ট হিসাবে ব্যবহারকারীর ইনপুট ব্যবহার করেন এবং আপনি চান না যে ব্যবহারকারী ওয়াইল্ডকার্ড ব্যবহার করতে সক্ষম হন। আপনি একটি অনুসন্ধান ফর্ম প্রক্রিয়াকরণ করা হলে এটি ঘটতে পারে. একটি ডাটাবেসে সংরক্ষণ করার সময় আপনাকে এটি ব্যবহার করতে হবে না।

ডাটাবেস অ্যাক্সেস করার সময় আপনাকে htmlspecialchars ব্যবহার করতে হবে না। এটি শুধুমাত্র ব্যবহারকারীর কাছে ডেটা প্রদর্শন করার সময় ব্যবহার করা উচিত HTML পৃষ্ঠা XSS ইনজেকশন প্রতিরোধ করতে।

কি ডেটা এবং কিসের জন্য এটি ব্যবহার করা হয় তার উপর নির্ভর করে।

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

এই ক্লাসের সাথে প্রশ্ন সন্নিবেশ করার একটি উদাহরণ

$ডেটা = অ্যারে ("লগইন" => "অ্যাডমিন", "সক্রিয়" => সত্য, "প্রথম নাম" => "জন", "শেষ নাম" => "ডো", "পাসওয়ার্ড" => $db->func( "SHA1(?)", অ্যারে ("secretpassword+salt")), // password = SHA1("secretpassword+salt") "createdAt" => $db->now(), // createdAt = NOW() " মেয়াদ শেষ হয়" => $db->এখন("+1Y") // মেয়াদ শেষ হয় = NOW() + ব্যবধান 1 বছর // সমর্থিত বিরতি [সেকেন্ড], [মি]মিনিট, [ঘণ্টা]ঘণ্টা, [ডি]দিন, [M]মাস, [Y]কান); $id = $db-> সন্নিবেশ ("ব্যবহারকারী", $ডেটা); যদি ($id) echo "ব্যবহারকারী তৈরি করা হয়। id="। $id; অন্যথায় ইকো "সন্নিবেশ ব্যর্থ হয়েছে: "। $db->getLastError();

আমার কাজের প্রকৃতির কারণে, আমাকে নিরাপত্তা অডিট করতে হবে সোর্স কোডওয়েব অ্যাপ্লিকেশন।
প্রচুর ওয়েব অ্যাপ্লিকেশন এবং প্রচুর কোড...

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

তাই শুরু করা যাক.

অকেজো চরিত্র পলায়নপর
এসকিউএল ইনজেকশনের জন্য ঝুঁকিপূর্ণ PHP ওয়েব অ্যাপ্লিকেশনের 83% মধ্যে পাওয়া যায়
অক্ষরের জন্য এস্কেপ ফাংশন ব্যবহার করা যেমন
mysql_escape_string
mysql_real_escape_string
যোগ স্ল্যাশ
উদ্ধৃতি চিহ্ন ছাড়া। প্রায়শই এটি নিজেকে সাংখ্যিক প্যারামিটারে প্রকাশ করে (সকল ধরণের *_id)।
উদাহরণ
$sql = "ব্যবহারকারী তালিকা থেকে ব্যবহারকারী নির্বাচন করুন যেখানে userid=".mysql_real_escape_string($_GET["uid"]);

চেহারা, এই নিরাপদ কোড, কিন্তু শুধুমাত্র চেহারা. আমার অনুশীলনে পিএইচপিতে এসকিউএল ইনজেকশনের সবচেয়ে সাধারণ প্যাটার্নটি এখানে রয়েছে। এই দুর্বলতাকে আক্রমণ করার জন্য, একজন আক্রমণকারীকে আক্রমণ ভেক্টরে " " \x00 \r \n \x1a অক্ষর ব্যবহার করা এড়াতে হবে।
যেমন:
/index.php?uid=-777 UNION ব্যবহারকারী তালিকা থেকে পাসওয়ার্ড নির্বাচন করুন

কোড অনুসন্ধান করুন
ভাষার শব্দার্থবিদ্যা দ্বারা জটিল। জন্য সহজ অনুসন্ধানআপনি egrep ব্যবহার করতে পারেন:
egrep -Rin "(নির্বাচন|আপডেট | grep -v "[\""]["\"]"

অনুসন্ধান অভিব্যক্তির যুক্তি নিম্নরূপ: ফিল্টারিং ফাংশনের বাম দিকে উদ্ধৃতি অক্ষরগুলির ("", "", "", "") কোন ক্রম নেই এমন সমস্ত লাইন খুঁজুন। পদ্ধতিটি, অবশ্যই, 100% থেকে অনেক দূরে, তবে শব্দার্থগত বিশ্লেষণ করার জন্য একটি নিয়মিত অভিব্যক্তির প্রয়োজন হওয়া অসম্ভব।
তথ্য প্রদর্শন করা সহজ করতে, আপনি কনসোলে রঙে ফাংশনটি হাইলাইট করতে পারেন:
egrep -Rin "(নির্বাচন|আপডেট | grep -v "[\""]["\"]" | egrep --color "(mysql_escape_string|mysql_real_escape_string|addslashes)"

এই ওয়াইল্ডকার্ড দুর্বলতা থেকে রক্ষা করার জন্য, টাইপ কাস্টিং ব্যবহার করা ভাল।
এটি সর্বদা দ্রুত কাজ করে এবং সব ধরনের ফিল্টারিং এবং স্ক্রীনিং এর চেয়ে বেশি নির্ভরযোগ্য।
উপরের উদাহরণের জন্য, প্যাচটি এইরকম হতে পারে:
$sql = "ব্যবহারকারী তালিকা থেকে ব্যবহারকারী নির্বাচন করুন যেখানে userid=".intval($_GET["uid"]);

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


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

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

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

উপরের সবগুলি স্ট্রিং ডেটা এবং তারিখগুলিতে প্রযোজ্য৷ উদ্ধৃতি চিহ্ন দিয়ে সংখ্যাগুলিকে পিছনে না রেখে বা চারপাশে সন্নিবেশ করা যেতে পারে। আপনি যদি এই কাজ করেন তাহলে অগত্যা!ক্যোয়ারীতে ঢোকানোর আগে ডেটাটিকে পছন্দসই প্রকারে জোর করুন, উদাহরণস্বরূপ:
$id = intval ($id);
যাইহোক, সরলতার জন্য (এবং নির্ভরযোগ্যতা), আপনি স্ট্রিংগুলির মতো সংখ্যার সাথে কাজ করতে পারেন (যেহেতু mysql এখনও তাদের পছন্দসই টাইপে রূপান্তর করে)। তদনুসারে, আমরা অনুরোধে ঢোকানো কোনও ডেটা ট্রেস করব এবং এটিকে উদ্ধৃতি চিহ্নে আবদ্ধ করব।

এছাড়াও, আরও একটি নিয়ম রয়েছে - ঐচ্ছিক, তবে ত্রুটিগুলি এড়াতে এটি অনুসরণ করা উচিত:
ক্ষেত্র এবং টেবিলের নামগুলি পিছনের একক উদ্ধৃতিতে আবদ্ধ করা উচিত - "`" (এই চিহ্ন সহ কীটি "1" কী-এর বাম দিকে একটি আদর্শ কীবোর্ডে অবস্থিত) কীওয়ার্ড mysql, কিন্তু যদি আমরা একটি ব্যাককোট ব্যবহার করি, তাহলে MySQL সবকিছু সঠিকভাবে বুঝতে পারবে:
`টেবিল` থেকে * নির্বাচন করুন যেখানে `তারিখ` = "2006-04-04"
আপনার এই উদ্ধৃতি চিহ্নগুলির মধ্যে পার্থক্য করা উচিত এবং একটিকে অন্যটির সাথে বিভ্রান্ত করা উচিত নয়। আপনার এটাও মনে রাখা উচিত যে ব্যাকটিকগুলি স্ল্যাশের মাধ্যমে এড়ানো যায় না।

সুতরাং, আমরা শিখেছি কিভাবে সঠিকভাবে একটি অনুরোধে ডেটা প্রতিস্থাপন করতে হয়।
কিন্তু! ডাইনামিক কোয়েরি নির্মাণ ডেটা প্রতিস্থাপনের মধ্যে সীমাবদ্ধ নয়। প্রায়শই আমাদের একটি ক্যোয়ারীতে SQL কমান্ড এবং ক্ষেত্রের নাম প্রতিস্থাপন করতে হয়। এবং এখানে আমরা নিরাপত্তার বিষয়ে এগিয়ে যাই:

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

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

দ্বিতীয় পয়েন্টটি অনেক বেশি কঠিন, যেহেতু ডেটার মতো এমন কোনো একক সার্বজনীন নিয়ম নেই - ব্যাকটিকএকটি হ্যাকার দ্বারা পরিবর্তন করা থেকে ক্ষেত্রের নাম রক্ষা করবে না. উদ্ধৃতি দিয়ে একটি টেবিলের নাম রক্ষা করা সম্ভব নয়। এসকিউএল বিবৃতি, LIMIT কমান্ড পরামিতি, এবং অন্যান্য অপারেটর।
অতএব, একটি ক্যোয়ারীতে নিয়ন্ত্রণ উপাদান প্রতিস্থাপন করার সময় মৌলিক নিয়ম হল:
আপনি যদি একটি ক্যোয়ারীতে গতিশীলভাবে SQL স্টেটমেন্ট বা ক্ষেত্র, ডাটাবেস, টেবিলের নাম সন্নিবেশ করতে চান, তাহলে কোন অবস্থাতেই আপনি সরাসরি ক্যোয়ারীতে প্রবেশ করাবেন না।
এই ধরনের সংযোজনের জন্য সমস্ত বিকল্প আপনার স্ক্রিপ্টে অগ্রিম লিখতে হবে এবং ব্যবহারকারী যা প্রবেশ করেছে তার উপর ভিত্তি করে নির্বাচন করতে হবে।
উদাহরণস্বরূপ, যদি আপনাকে অপারেটর দ্বারা অর্ডারে একটি ক্ষেত্রের নাম পাস করতে হয়, তাহলে কোনো অবস্থাতেই আপনি সরাসরি এটি প্রতিস্থাপন করবেন না। আমরা প্রথমে এটি পরীক্ষা করতে হবে. উদাহরণস্বরূপ, বৈধ মানগুলির একটি অ্যারে তৈরি করুন এবং এটিকে অনুরোধে প্রতিস্থাপন করুন শুধুমাত্র যদি পাস করা প্যারামিটারটি এই অ্যারেতে উপস্থিত থাকে:
$orders = array("নাম" , "মূল্য" , "qty");
$key = array_search($_GET["sort"], $orders));
$orderby = $orders [ $key ];
$query = ক্রম অনুসারে `টেবিল` থেকে * নির্বাচন করুন$orderby " ;

আমরা ব্যবহারকারীর দ্বারা প্রবেশ করা শব্দের জন্য পূর্ব-বর্ণিত বিকল্পগুলির অ্যারে অনুসন্ধান করি এবং যদি আমরা এটি খুঁজে পাই, আমরা অ্যারের সংশ্লিষ্ট উপাদান নির্বাচন করি। যদি কোনো মিল পাওয়া না যায়, অ্যারের প্রথম উপাদান নির্বাচন করা হবে।
সুতরাং, অনুরোধে যা প্রতিস্থাপিত হয়েছে তা ব্যবহারকারী যা প্রবেশ করেছে তা নয়, তবে আমাদের স্ক্রিপ্টে যা লেখা হয়েছে।
অন্য সব ক্ষেত্রে একই কাজ করা আবশ্যক.
উদাহরণস্বরূপ, যদি WHERE ক্লজটি গতিশীলভাবে তৈরি হয়:
যদি (!empty($_GET [ "price" ])) $where .= "price="" . mysql_real_escape_string ($_GET [ "price" ]). """ ;
$query = "টেবিল থেকে * নির্বাচন করুন যেখানে $কোথায় " ;

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


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

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

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

আসলে, উপরের সবগুলি স্ট্রিং ডেটা এবং তারিখগুলিতে প্রযোজ্য। উদ্ধৃতি চিহ্ন দিয়ে সংখ্যাগুলিকে পিছনে না রেখে বা চারপাশে সন্নিবেশ করা যেতে পারে। আপনি যদি এই কাজ করেন তাহলে অগত্যা!ক্যোয়ারীতে ঢোকানোর আগে ডেটাটিকে পছন্দসই প্রকারে জোর করুন, উদাহরণস্বরূপ:
$id = intval ($id);
যাইহোক, সরলতার জন্য (এবং নির্ভরযোগ্যতা), আপনি স্ট্রিংগুলির মতো সংখ্যার সাথে কাজ করতে পারেন (যেহেতু mysql এখনও তাদের পছন্দসই টাইপে রূপান্তর করে)। তদনুসারে, আমরা অনুরোধে ঢোকানো কোনও ডেটা ট্রেস করব এবং এটিকে উদ্ধৃতি চিহ্নে আবদ্ধ করব।

এছাড়াও, আরও একটি নিয়ম রয়েছে - ঐচ্ছিক, তবে ত্রুটিগুলি এড়াতে এটি অনুসরণ করা উচিত:
ক্ষেত্র এবং টেবিলের নামগুলি পিছনের একক উদ্ধৃতিতে আবদ্ধ করা উচিত - "`" (এই চিহ্ন সহ কীটি "1" কী-এর বাম দিকে একটি স্ট্যান্ডার্ড কীবোর্ডে অবস্থিত) সর্বোপরি, ক্ষেত্রের নামটি mysql-এর সাথে মিলে যেতে পারে কীওয়ার্ড, কিন্তু যদি আমরা একটি ব্যাক কোট ব্যবহার করি, তাহলে MySQL বুঝবে সবকিছু সঠিক:
`টেবিল` থেকে * নির্বাচন করুন যেখানে `তারিখ` = "2006-04-04"
আপনার এই উদ্ধৃতি চিহ্নগুলির মধ্যে পার্থক্য করা উচিত এবং একটিকে অন্যটির সাথে বিভ্রান্ত করা উচিত নয়। আপনার এটাও মনে রাখা উচিত যে ব্যাকটিকগুলি স্ল্যাশের মাধ্যমে এড়ানো যায় না।

সুতরাং, আমরা শিখেছি কিভাবে সঠিকভাবে একটি অনুরোধে ডেটা প্রতিস্থাপন করতে হয়।
কিন্তু! ডাইনামিক কোয়েরি নির্মাণ ডেটা প্রতিস্থাপনের মধ্যে সীমাবদ্ধ নয়। প্রায়শই আমাদের একটি ক্যোয়ারীতে SQL কমান্ড এবং ক্ষেত্রের নাম প্রতিস্থাপন করতে হয়। এবং এখানে আমরা নিরাপত্তার বিষয়ে এগিয়ে যাই:

এসকিউএল ইনজেকশন হ্যাকার আক্রমণের একটি পদ্ধতি যখন একটি স্ক্রিপ্টে স্থানান্তরিত ডেটা এমনভাবে পরিবর্তিত হয় যাতে এই স্ক্রিপ্টে উত্পন্ন ক্যোয়ারীটি যা উদ্দেশ্যে করা হয়েছিল তার থেকে সম্পূর্ণ আলাদা কিছু করতে শুরু করে।
এই ধরনের আক্রমণ থেকে রক্ষা করার নিয়ম দুটি পয়েন্টে বিভক্ত করা যেতে পারে:
1. ডেটা নিয়ে কাজ করা।
2. ক্যোয়ারী নিয়ন্ত্রণের সাথে কাজ করা।

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

দ্বিতীয় পয়েন্টটি অনেক বেশি কঠিন, যেহেতু ডেটার মতো কোনো একক সার্বজনীন নিয়ম নেই - একটি ব্যাকটিক্স ফিল্ডের নামটিকে হ্যাকার দ্বারা পরিবর্তন করা থেকে রক্ষা করবে না। আপনি একটি টেবিলের নাম, SQL স্টেটমেন্ট, LIMIT কমান্ড প্যারামিটার বা অন্যান্য বিবৃতি রক্ষা করতে উদ্ধৃতি ব্যবহার করতে পারবেন না।
অতএব, একটি ক্যোয়ারীতে নিয়ন্ত্রণ উপাদান প্রতিস্থাপন করার সময় মৌলিক নিয়ম হল:
আপনি যদি একটি ক্যোয়ারীতে গতিশীলভাবে SQL স্টেটমেন্ট বা ক্ষেত্র, ডাটাবেস, টেবিলের নাম সন্নিবেশ করতে চান, তাহলে কোন অবস্থাতেই আপনি সরাসরি ক্যোয়ারীতে প্রবেশ করাবেন না।
এই ধরনের সংযোজনের জন্য সমস্ত বিকল্প আপনার স্ক্রিপ্টে অগ্রিম লিখতে হবে এবং ব্যবহারকারী যা লিখেছেন তার উপর ভিত্তি করে নির্বাচন করতে হবে।
উদাহরণস্বরূপ, যদি আপনাকে অপারেটর দ্বারা অর্ডারে একটি ক্ষেত্রের নাম পাস করতে হয়, তাহলে কোনো অবস্থাতেই আপনি সরাসরি এটি প্রতিস্থাপন করবেন না। আমরা প্রথমে এটি পরীক্ষা করতে হবে. উদাহরণস্বরূপ, বৈধ মানগুলির একটি অ্যারে তৈরি করুন এবং এটিকে অনুরোধে প্রতিস্থাপন করুন শুধুমাত্র যদি পাস করা প্যারামিটারটি এই অ্যারেতে উপস্থিত থাকে:
$orders = array("নাম" , "মূল্য" , "qty");
$key = array_search($_GET["sort"], $orders));
$orderby = $orders [ $key ];
$query = "সারণী থেকে * নির্বাচন করুন $orderby দ্বারা অর্ডার করুন";
আমরা ব্যবহারকারীর দ্বারা প্রবেশ করা শব্দের জন্য পূর্ব-বর্ণিত বিকল্পগুলির অ্যারে অনুসন্ধান করি এবং যদি আমরা এটি খুঁজে পাই, আমরা অ্যারের সংশ্লিষ্ট উপাদান নির্বাচন করি। যদি কোনো মিল না পাওয়া যায়, অ্যারের প্রথম উপাদান নির্বাচন করা হবে।
সুতরাং, অনুরোধে যা প্রতিস্থাপিত হয়েছে তা ব্যবহারকারী যা প্রবেশ করেছে তা নয়, তবে আমাদের স্ক্রিপ্টে যা লেখা হয়েছে।
অন্য সব ক্ষেত্রে একই কাজ করা আবশ্যক.
উদাহরণস্বরূপ, যদি WHERE ক্লজটি গতিশীলভাবে তৈরি হয়:
যদি (!empty($_GET [ "price" ])) $where .= "price="" . mysql_real_escape_string ($_GET [ "price" ]). """ ;
$query = "টেবিল থেকে * নির্বাচন করুন যেখানে $কোথায়";
আমার পক্ষে এমন একটি ক্ষেত্রে কল্পনা করা কঠিন যেখানে একটি টেবিলের নাম গতিশীলভাবে একটি ক্যোয়ারীতে ঢোকানো যেতে পারে, কিন্তু যদি এটি ঘটে, তবে নামটিও স্ক্রিপ্টে পূর্ব-সংজ্ঞায়িত একটি সেট থেকে সন্নিবেশ করা দরকার।
LIMIT অপারেটরের পরামিতিগুলিকে গাণিতিক ক্রিয়াকলাপ বা intval() ফাংশন ব্যবহার করে একটি পূর্ণসংখ্যার ধরণে বাধ্য করা উচিত।
মনে করবেন না যে এখানে তালিকাভুক্ত উদাহরণগুলি গতিশীল ক্যোয়ারী নির্মাণের জন্য সমস্ত বিকল্পকে নিঃশেষ করে দেয়৷ আপনাকে কেবল নীতিটি বুঝতে হবে এবং এই জাতীয় সমস্ত ক্ষেত্রে এটি প্রয়োগ করতে হবে।

LIKE অপারেটরের সাথে কাজ করার বৈশিষ্ট্য
একটি সম্পূর্ণ আলাদা কেস হল LIKE অপারেটর।
প্রথমত, সাধারণ ট্রেসিং ছাড়াও, স্ল্যাশগুলি অবশ্যই LIKE-তে প্রতিস্থাপিত ভেরিয়েবলে দ্বিগুণ করতে হবে। অর্থাৎ, যদি ভেরিয়েবলটিতে \ অক্ষর থাকে, তাহলে এটিকে দ্বিগুণ করতে হবে এবং তারপর স্বাভাবিক এস্কেপটি mysql_real_escape_string এর মাধ্যমে করতে হবে।
উদাহরণস্বরূপ, যদি আমরা স্ট্রিং খুঁজছি
\ অক্ষরটিকে "ব্যাকস্ল্যাশ" বলা হয় এবং আমাদের একটি সঠিক মিল প্রয়োজন, তারপর আমরা কেবল mysql_real_escape_string ব্যবহার করি এবং প্রশ্নটি মানক:
পরীক্ষা থেকে নির্বাচন করুন যেখানে ক্ষেত্র = "চিহ্ন \\ কে \"ব্যাকস্ল্যাশ\" বলা হয়যদি আমরা এই স্ট্রিংটিকে LIKE-এ প্রতিস্থাপন করতে চাই, তাহলে আমাদের প্রথমে প্রতিটি স্ল্যাশ দুটি দিয়ে প্রতিস্থাপন করতে হবে এবং তারপর mysql_real_escape_string প্রয়োগ করতে হবে। ফলাফল হবে
টেবিল থেকে * নির্বাচন করুন যেখানে "% অক্ষর \\\\ কে \"ব্যাকস্ল্যাশ\"% বলা হয়
দ্বিতীয় জিনিসটি লক্ষণীয় যে যে ফাংশনগুলি স্ল্যাশ যুক্ত করে সেগুলিকে LIKE অপারেটরে ব্যবহৃত "%" এবং "_" অনুসন্ধান মেটাক্যারেক্টারগুলিতে যুক্ত করে না। অতএব, আপনি যদি এই অপারেটরটি ব্যবহার করেন এবং _ এবং % অক্ষরগুলি ওয়াইল্ডকার্ড হিসাবে ব্যবহার করতে না চান, তাহলে ম্যানুয়ালি স্ল্যাশ যোগ করুন। এটি কমান্ড দিয়ে করা যেতে পারে
$data = addClashes($data, "%_");

মনোযোগ - এই addlashes না! এই ফাংশনের নামের সাথে একটি অতিরিক্ত "c" আছে।
সুতরাং, দেখা যাচ্ছে যে আমাদের অবশ্যই LIKE অপারেটরে ব্যবহৃত ভেরিয়েবলগুলিকে আলাদাভাবে প্রক্রিয়া করতে হবে।
প্রথমে একটি স্ল্যাশ দুটি দিয়ে প্রতিস্থাপন করুন, উদাহরণস্বরূপ, এইরকম কোড ব্যবহার করে:
$var = str_replace ("\\" , "\\\\" , $var);তারপর (আপনি অনুরোধে যাওয়া অন্যান্য সমস্ত ডেটা সহ করতে পারেন), ট্রেস:
$var = mysql_real_escape_string ($var);
এবং তারপরে যদি আমরা চাই _ এবং % নিজেদেরকে হুবহু মেলে, আমরা তা করি
$var = addClashes($var, "_%");ফলস্বরূপ, যদি আমরা অনুসন্ধান করি, উদাহরণস্বরূপ, নিম্নলিখিত স্ট্রিংয়ের জন্য
\ অক্ষরটিকে "ব্যাকস্ল্যাশ" বলা হয় এবং _ অক্ষরটিকে "আন্ডারস্কোর" বলা হয়তারপর প্রক্রিয়াকরণের পরে, অনুরোধে এটি দেখতে এইরকম হওয়া উচিত:

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

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

magic_quotes_gpc এবং magic_quotes_runtime যদি প্রথমটি সক্ষম করা হয়, তাহলে পিএইচপি স্বয়ংক্রিয়ভাবে ব্যবহারকারীর কাছ থেকে আসা ডেটাতে স্ল্যাশ যোগ করে - POST, GET অনুরোধ এবং কুকি থেকে (পাশাপাশি HTTP অনুমোদনের মাধ্যমে প্রাপ্ত লগইন এবং পাসওয়ার্ডে)।
যদি দ্বিতীয়টি হয়, তাহলে স্ল্যাশগুলি স্ক্রিপ্ট সম্পাদনের সময় প্রাপ্ত ডেটাতে যোগ করা হয় - উদাহরণস্বরূপ, একটি ফাইল বা ডাটাবেস থেকে।
php_flag magic_quotes_gpc 0
php_flag magic_quotes_runtime 0

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

অপারেশন চলাকালীন প্রাপ্ত ডেটা বোঝার সবচেয়ে সহজ উপায় হল স্ক্রিপ্টের শুরুতে লেখা:
set_magic_quotes_runtime(0);

  • ব্যবহারকারীর কাছ থেকে প্রাপ্ত ডেটার জন্য, সবকিছু অনেক বেশি জটিল। এই কোডের জন্য আমাদের দুটি ফাংশন প্রয়োজন:
  • আপনি get_magic_quotes_gpc ফাংশন ব্যবহার করে পিএইচপি এটি যোগ করেছে কিনা তা পরীক্ষা করতে পারেন।
    স্ট্রিপস্ল্যাশ ফাংশন স্ল্যাশগুলি সরিয়ে দেয়।
    তদনুসারে, আপনাকে প্রথমটি ব্যবহার করে পরীক্ষা করতে হবে এবং যদি পিএইচপি যোগ করা হয়ে থাকে, তবে সমস্ত আগত ভেরিয়েবলের মধ্য দিয়ে যান এবং দ্বিতীয়টি ব্যবহার করে এটি পরিষ্কার করুন।
    আপনি যদি সঠিকভাবে কাজ করেন, register_globals = off এর সাথে, তাহলে ব্রাউজার থেকে আসা ডেটা ধারণকারী সমস্ত অ্যারেতে স্ট্রিপস্ল্যাশ প্রয়োগ করা যথেষ্ট।
    উদাহরণস্বরূপ, আপনি সমস্ত সাইটের স্ক্রিপ্টে নিম্নলিখিত কোড অন্তর্ভুক্ত করতে পারেন:
    ফাংশন স্ট্রিপ (& $el ) (
    যদি (is_array($el))
    foreach($el হিসাবে $k => $v)
    স্ট্রিপস($el[$k]);
    }
    অন্য $el = স্ট্রিপস্ল্যাশ ($el);
    যদি (get_magic_quotes_gpc()) (
    স্ট্রিপস($_GET);
    স্ট্রিপস($_POST);
    স্ট্রিপস($_COOKIE);
    স্ট্রিপস($_REQUEST);
    যদি (isset($_SERVER [ "PHP_AUTH_USER" ])) স্ট্রিপ ($_SERVER [ "PHP_AUTH_USER" ]);
    }
    যদি (isset($_SERVER [ "PHP_AUTH_PW" ])) স্ট্রিপ ($_SERVER [ "PHP_AUTH_PW" ]); ক্ষেত্রেভুল সেটিংস

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

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

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

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

    $query = "টেবিল ঢোকান (id, col1, col2) VALUES (NULL, val1, val2)";

    এছাড়াও, উপরের উদাহরণে, বিবেচনা করুন যে "টেবিল," "col[n]," এবং "val[n]" ভেরিয়েবল হতে পারে।

    এই জন্য মান কি? আপনি কি করছেন?

    আমি প্রায় 20 মিনিট ধরে অনুরূপ প্রশ্নের উত্তর পড়ছি, কিন্তু এই প্রশ্নের একটি নির্দিষ্ট উত্তর আছে বলে মনে হচ্ছে না।

    উত্তর

    এখন ধরুন আপনি MySQL ক্যোয়ারীতে সরাসরি পোস্ট ভেরিয়েবল ব্যবহার করছেন তাহলে এটি এভাবে ব্যবহার করুন:

    $query = "`টেবিল` (`id`, `name`, `email`) VALUES (" ".$_POST["id"]।" "," ".$_POST["name"] তে সন্নিবেশ করুন।" ", " ".$_POST["ইমেইল"]");

    মাইএসকিউএলে পিএইচপি ভেরিয়েবল ব্যবহার করার জন্য এটি সর্বোত্তম অনুশীলন।

    প্রধানত Mysql-এ, এই ধরনের শনাক্তকারী ব্যবহার করা হয় ` , " , " এবং () প্রশ্নে।

      " বা " মান হিসেবে একটি স্ট্রিং অন্তর্ভুক্ত করতে ব্যবহার করুন "01/26/2014 00:00:00" বা "01/26/2014 00:00:00"। এই শনাক্তকারীটি শুধুমাত্র "01/26/2014 00:00:00" স্ট্রিং ফাংশনের জন্য ব্যবহৃত হয়, যেমন now() বা sum ,max।

      একটি টেবিল বা টেবিল টেবিল অন্তর্ভুক্ত করতে ব্যবহার করুন, যেমন table_name থেকে column_name নির্বাচন করুন যেখানে id = "2"

      () শুধুমাত্র একটি প্রশ্নের অংশগুলিকে সহজভাবে আবদ্ধ করতে ব্যবহৃত হয়, উদাহরণস্বরূপ table_name থেকে column_name নির্বাচন করুন যেখানে (id = "2" এবং লিঙ্গ = "পুরুষ") বা নাম = "রাকেশ।

    সমস্ত (ভালভাবে ব্যাখ্যা করা) উত্তরগুলি ছাড়াও, নীচে উল্লেখ করা কিছুই ছিল না এবং আমি প্রায়ই এই প্রশ্নোত্তরগুলিতে আসি।

    সংক্ষেপে; মাইএসকিউএল মনে করে আপনি গণিত করতে চানআপনার নিজের টেবিল/কলামে এবং হাইফেন যেমন "ইমেল" ইমেইল হিসাবে ব্যাখ্যা করুন।

    দাবিত্যাগ।তাই আমি ভেবেছিলাম যে আমি এটিকে "FYI" উত্তর হিসাবে যুক্ত করব যারা ডাটাবেসের সাথে কাজ করার জন্য সম্পূর্ণ নতুন, এবং যারা ইতিমধ্যে বর্ণিত প্রযুক্তিগত শর্তাদি বুঝতে পারেন না।

    (আপনার প্রশ্নের SQL প্রকৃতি সম্পর্কে উপরে ভাল উত্তর আছে, কিন্তু আপনি PHP এ নতুন হলে এটি প্রাসঙ্গিক হতে পারে।)

    এটা মনে রাখা গুরুত্বপূর্ণ হতে পারে যে পিএইচপি একক এবং দ্বিগুণ উদ্ধৃতিগুলিকে ভিন্নভাবে ব্যবহার করে...

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

    $foo = "বার"; প্রতিধ্বনি "একটি $foo আছে"; // একটি $foo প্রতিধ্বনি আছে "একটি $foo আছে"; // একটি বার প্রতিধ্বনি আছে `ls -l`; // ... একটি ডিরেক্টরি তালিকা

    যদি কল টেবিল এবং মানগুলি ভেরিয়েবল হয়, তবে দুটি উপায় রয়েছে:

    ডবল উদ্ধৃতি "" সহ সম্পূর্ণ প্রশ্ন হল:

    $query = "$table_name (id, $col1, $col2) মানগুলিতে সন্নিবেশ করুন (NULL, "$val1", "$val2")";

    $query = "ঢোকান ".$table_name।" (id, ".$col1.", ".$col2.") VALUES (NULL, "".$val1.", "".$val2."" ) ";

    একক উদ্ধৃতি সহ "" :

    $query = "ঢোকান ".$table_name." (id, ".$col1.", ".$col2.") VALUES (NULL, ".$val1.", ".$val2.")";

    যখন কলাম/মূল্যের নাম একটি MySQL সংরক্ষিত কীওয়ার্ডের মতো হয় তখন ব্যাকটিক্স ব্যবহার করুন।

    দ্রষ্টব্য।আপনি যদি টেবিলের নামের সাথে একটি কলামের নাম উল্লেখ করেন, তাহলে ব্যাকটিক্স ব্যবহার করুন:

    `টেবিল_নাম` `কলাম_নাম`<- Примечание: исключить. из задних клещей.

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

    স্ট্রিং মানগুলির জন্য একক উদ্ধৃতি ব্যবহার করা উচিত, যেমন VALUES() তালিকায়৷ স্ট্রিং মানের জন্যও ডাবল কোট MySQL দ্বারা সমর্থিত, কিন্তু একক উদ্ধৃতিগুলি অন্যান্য RDBMS-এর দ্বারা ব্যাপকভাবে গৃহীত হয়, তাই ডাবল উদ্ধৃতিগুলির পরিবর্তে একক উদ্ধৃতি ব্যবহার করা একটি ভাল ধারণা।

    MySQL এছাড়াও আক্ষরিক DATE এবং DATETIME মানগুলিকে স্ট্রিং হিসাবে একক-উদ্ধৃত করার আশা করে, যেমন "2001-01-01 00:00:00"। আরও তথ্যের জন্য, তারিখ এবং সময় সাহিত্য ডকুমেন্টেশন দেখুন, বিশেষ করে হাইফেন ব্যবহারের বিকল্প - তারিখের স্ট্রিং-এ একটি সেগমেন্ট বিভাজক হিসাবে।

    তাই আপনার উদাহরণ ব্যবহার করে, আমি পিএইচপি স্ট্রিংটি ডাবল কাস্ট করব এবং "val1", "val2" মানগুলির জন্য একক উদ্ধৃতি ব্যবহার করব। NULL একটি MySQL কীওয়ার্ড এবং একটি অ-মান এবং তাই ব্যবহার করা হয় না।

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

    RDBMS-সম্পর্কিত ফাংশনগুলি (যেমন MySQL-এ NOW() উদ্ধৃত করা উচিত নয়, যদিও তাদের আর্গুমেন্টগুলি একই নিয়ম বা উদ্ধৃতি নিয়মের অধীন ইতিমধ্যে উল্লিখিত৷

    ব্যাকটিক(`) টেবিল এবং কলাম ─┬──── ┬──┬───────┐ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ `টেবিল` (`id`, `col1`, `col2`, `date`, `updated`) VALUES (NULL, "val1", "val2", "2001-01-01", NOW()) এর মধ্যে ঢোকান"; উদ্ধৃতিহীন কীওয়ার্ড ─────┴┴┴┘ │ │ │ │ │ ││││ │ │││││ একক-উদ্ধৃত (") ──── ──── ─ ───┴── ┴────┘ │ │ │││││ একক-উদ্ধৃত (") তারিখ ──────────────────────── ────┴── উদ্ধৃতিহীন ফাংশন ───────────────────────────── ──────────── ───┴┴┴┴┘

    পরিবর্তনশীল ইন্টারপোলেশন

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

    // কিছু পরিবর্তনশীল প্রতিস্থাপনের সাথে একই জিনিস // এখানে, একটি পরিবর্তনশীল টেবিলের নাম $table ব্যাকটিক-উদ্ধৃত, এবং ভ্যারিয়েবলগুলি // VALUES তালিকায় একক-উদ্ধৃত $query = "INSERT INTO `$ টেবিল`(`id`, `col1`, `col2`, `date`) মান (NULL, "$val1", "$val2", "$ তারিখ")";

    প্রস্তুত বিবৃতি

    প্রস্তুত বিবৃতিগুলির সাথে কাজ করার সময়, বিবৃতি ফিলারগুলি অন্তর্ভুক্ত করা উচিত কিনা তা নির্ধারণ করতে ডকুমেন্টেশনের সাথে পরামর্শ করুন৷ পিএইচপি, পিডিও এবং মাইএসকিউএলআই-এ পাওয়া সবচেয়ে জনপ্রিয় এপিআই জড়িত অননুমোদিতস্থানধারক, অন্যান্য ভাষায় সর্বাধিক প্রস্তুত নির্দেশ API-এর মতো:

    // নামযুক্ত প্যারামিটার সহ PDO উদাহরণ, unquoted $query = " INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (:id, :col1, :col2, :date)" ; // MySQLi এর সাথে উদাহরণ? parameters, unquoted $query = "ঢোকান `টেবিল` (`id`, `col1`, `col2`, `date`) VALUES (?, ?, ?, ?)";

    আইডেন্টিফায়ারে একটি ব্যাকলিংক ফেরত দেয় এমন প্রতীক:

    যেমন:

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

    বিপরীত অনুমান সম্পর্কে আরও জানতে এই উত্তরটি দেখুন।

    এখন ডাবল কোটস এবং একক উদ্ধৃতি সম্পর্কে (মাইকেল ইতিমধ্যে এটি উল্লেখ করেছেন)।

    কিন্তু মান নির্ধারণ করতে, আপনাকে একক বা ডবল উদ্ধৃতি ব্যবহার করতে হবে। আরেকটি উদাহরণ দেখা যাক।

    `টেবিলনেম` (`আইডি, `শিরোনাম`) মান (শূন্য, শিরোনাম1) ঢোকান;

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

    INSERT INTO `tablename` (`id, `title`) VALUES (NULL, "title1");

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

    $query = "সারণীতে সন্নিবেশ করুন (`id`, `col1`, `col2`) মান (NULL, "$val1", "$val2"");

    এখন, পিএইচপি-তে ডবল কোট ব্যবহার করে, আপনি ভেরিয়েবল $val1 এবং $val2-কে তাদের মান ব্যবহার করতে দেবেন, এইভাবে একটি বৈধ কোয়েরি তৈরি করা হবে। পছন্দ

    $val1 = "আমার মান 1"; $val2 = "আমার মান 2"; $query = "সারণীতে সন্নিবেশ করুন (`id`, `col1`, `col2`) মান (NULL, "$val1", "$val2"");

    `টেবিল` (`id`, `col1`, `col2`) মান (NULL, "আমার মান 1", "আমার মান 2") এর মধ্যে সন্নিবেশ করুন

    এখানে অনেক সহায়ক উত্তর ছিল, সাধারণত দুটি পয়েন্টে শেষ হয়।

    1. ব্যাকটিক্স (`) শনাক্তকারীর নামের চারপাশে ব্যবহার করা হয়।
    2. একক উদ্ধৃতি (") মানগুলির চারপাশে ব্যবহৃত হয়।

    এবং @ মাইকেল বারকোস্কি যেমন বলেছেন

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

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

    123E10 একটি বৈধ শনাক্তকারীর নাম, তবে এটি একটি বৈধ পূর্ণসংখ্যা আক্ষরিক।

    [বিস্তারিত না গিয়ে আপনি কীভাবে এমন একটি আইডি নাম পাবেন], ধরা যাক আমি 123456e6 নামে একটি অস্থায়ী টেবিল তৈরি করতে চাই।

    ব্যাকটিক্সে কোন ত্রুটি নেই।

    DB > অস্থায়ী টেবিল তৈরি করুন `123456e6` (`id` char(8)); কোয়েরি ঠিক আছে, 0টি সারি প্রভাবিত হয়েছে (0.03 সেকেন্ড)

    আপনি কলব্যাক ব্যবহার না করলে ত্রুটি৷

    DB > অস্থায়ী টেবিল তৈরি করুন 123451e6 (`id` char (8)); ERROR 1064 (42000): আপনার SQL সিনট্যাক্সে একটি ত্রুটি আছে; লাইন 1 এ "123451e6 (`id` char (8))" এর কাছাকাছি ব্যবহার করার জন্য সঠিক সিনট্যাক্সের জন্য আপনার MariaDB সার্ভার সংস্করণের সাথে সামঞ্জস্যপূর্ণ ম্যানুয়ালটি দেখুন

    যাইহোক, 123451a6 একটি সূক্ষ্ম আইডি নাম (ব্যাকটিক্স ছাড়া)।

    DB > অস্থায়ী টেবিল তৈরি করুন 123451a6 (`id` char (8)); কোয়েরি ঠিক আছে, 0টি সারি প্রভাবিত হয়েছে (0.03 সেকেন্ড)

    এটি সম্পূর্ণ কারণ 1234156e6ও একটি সূচকীয় সংখ্যা।

    স্ট্রিং মানগুলির জন্য একক উদ্ধৃতি ব্যবহার করা উচিত, যেমন VALUES() তালিকায়৷

    ব্যাকটিকগুলি সাধারণত একটি শনাক্তকারীকে নির্দেশ করতে ব্যবহৃত হয় এবং সংরক্ষিত কীওয়ার্ডগুলির মাঝে মাঝে ব্যবহারের কারণেও নিরাপদ হতে পারে।

    পিএইচপি এবং মাইএসকিউএল-এর সাথে মিলিত হলে, ডবল কোট এবং একক উদ্ধৃতিগুলি ক্যোয়ারী লেখার সময়কে ব্যাপকভাবে সরল করে।

    মাইএসকিউএল-এ দুই ধরনের উদ্ধৃতি রয়েছে:

    1. " স্ট্রিং লিটারেল অন্তর্ভুক্ত করতে
    2. ` টেবিল এবং কলামের নামের মতো শনাক্তকারী অন্তর্ভুক্ত করতে

    এবং তারপর আছে "এটি একটি বিশেষ ক্ষেত্রে। এটির জন্য ব্যবহার করা যেতে পারে একসার্ভারের sql_mode এর উপর নির্ভর করে একটি সময়ে উপরের লক্ষ্যগুলির মধ্যে:

    1. ডিফল্টস্ট্রিং লিটারেল নেস্ট করতে "অক্ষর" ব্যবহার করা যেতে পারে "
    2. ANSI_QUOTES মোডে " চিহ্নটি সনাক্তকারী অন্তর্ভুক্ত করতে ব্যবহার করা যেতে পারে, ANSI_QUOTES

    নিম্নলিখিত ক্যোয়ারী SQL মোডের উপর নির্ভর করে বিভিন্ন ফলাফল (বা ত্রুটি) তৈরি করবে:

    টেবিল থেকে "কলাম" নির্বাচন করুন যেখানে foo = "বার"

    ANSI_QUOTES নিষ্ক্রিয়

    প্রশ্নটি স্ট্রিং আক্ষরিক "কলাম" নির্বাচন করবে যেখানে কলাম foo স্ট্রিং "বার" এর সমান

    ANSI_QUOTES সক্ষম হয়েছে৷

    কোয়েরি কলাম কলাম নির্বাচন করবে যেখানে কলাম foo কলামের সমান

    কখন ব্যবহার করতে হবে

    • আমি আপনাকে " ব্যবহার করা এড়াতে পরামর্শ দিচ্ছি যাতে আপনার কোড SQL মোডের উপর নির্ভর না করে
    • সর্বদা শনাক্তকারী অন্তর্ভুক্ত করুন কারণ এটি একটি ভাল অভ্যাস (SO তে বেশ কয়েকটি প্রশ্ন এটি নিয়ে আলোচনা করুন)

    " " এবং " " ব্যবহারের মধ্যে একটি স্পষ্ট পার্থক্য রয়েছে।

    যখন " " সর্বত্র ব্যবহৃত হয়, তখন কোন "রূপান্তর বা অনুবাদ" থাকে না। এটা যেমন আছে মুদ্রিত হয়.

    "" দিয়ে, এটিকে ঘিরে থাকা যাই হোক না কেন তার মান "অনুবাদিত বা রূপান্তরিত" হয়।

    অনুবাদ/রূপান্তর বলতে আমি যা বোঝাতে চাচ্ছি তা হল: একক উদ্ধৃতির মধ্যে থাকা কিছু তাদের মানগুলিতে "অনুবাদিত" হবে না। তারা গৃহীত হবে কারণ তারা কোট ভিতরে আছে. উদাহরণ: a=23 , তারপর echo "$a" স্ট্যান্ডার্ড আউটপুটে $a তৈরি করবে। যখন ইকো "$a" স্ট্যান্ডার্ড আউটপুটে 23 তৈরি করবে।

    অপারেশন