স্ট্রিং থেকে বাঁচার অর্থ কী?


85

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

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


10
পিএস আমি কেবল একজন বন্ধুকে জিজ্ঞাসা করতে পারি এবং নিজেকে বোকা বানাতে পারি না তবে আমি ভেবেছিলাম আমার মতো এমন অনেক লোক থাকবে যা ভাবছেন যে এই বিষয়টির বিষয়ে কী বলছে is
ব্রেট

উত্তর:


135

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

"Hello World."

তবে আমার স্ট্রিংটির মধ্যে ডাবল কোট থাকলে কী হবে?

"Hello "World.""

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

'Hello "World."'

অথবা আমি আমার উদ্ধৃতিগুলি এড়িয়ে যেতে পারি:

"Hello \"World.\""

স্ল্যাশের আগে থাকা কোনও উদ্ধৃতি এড়ানো যায় এবং স্ট্রিংয়ের মানটির অংশ হিসাবে বোঝা যায়।

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

SELECT select FROM myTable

আমরা এখন আমাদের প্রশ্নের মধ্যে কিছুটা অস্পষ্টতা প্রবর্তন করেছি। আমাদের প্রশ্নের মধ্যে, আমরা ব্যাক-টিকগুলি ব্যবহার করে সেই অস্পষ্টতা হ্রাস করতে পারি:

SELECT `select` FROM myTable

এটি ক্ষেত্রের নাম নির্বাচন করার ক্ষেত্রে দুর্বল রায় ব্যবহার করে আমরা যে বিভ্রান্তিটি শুরু করেছি তা সরিয়ে দেয়।

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

// Query
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
            mysql_real_escape_string($user),
            mysql_real_escape_string($password));

অন্যান্য পদ্ধতি যেমন পলায়নের স্ট্রিং, জন্য বিদ্যমান add_slashes, addcslashes, quotemeta, এবং আরও, যদিও আপনি যে পাবেন যখন লক্ষ্য, একটি নিরাপদ কোয়েরি চালানো হয় মোটের ডেভেলপারদের পছন্দ করা mysql_real_escape_stringবা pg_escape_string(পোস্টগ্রি প্রেক্ষাপটে।


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

22

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

ইন ক্ষেত্রে mysql_real_escape_string()এটা পালাতে \x00, \n, \r, \, ', "এবং \x1aএই হিসাবে, যখন পলান না, পূর্বে উল্লিখিত সমস্যার যা MySQL ডেটাবেস জন্য SQL ইঞ্জেকশন অন্তর্ভুক্ত হতে পারে।


1

সরলতার জন্য, আপনি ব্যাকস্ল্যাশ "\" রানটাইম চলাকালীন দোভাষীর কাছে কমান্ড হওয়ার কথা ভাবতে পারেন।

যেমন এই বিবৃতিটি ব্যাখ্যা করার সময়:

$txt = "Hello world!";

আভিধানিক বিশ্লেষণ সময়ে (অথবা যখন পৃথক টোকেন মধ্যে বিবৃতি আপ বিভাজন) এই টোকেন চিহ্নিত করা হবে $, txt, =, ", Hello world!, ", এবং;

তবে স্ট্রিংয়ের মধ্যে ব্যাকস্ল্যাশ টোকেনগুলির একটি অতিরিক্ত সেট তৈরি করবে এবং অবিলম্বে অনুসরণ করা অক্ষরটির সাথে এমন কিছু করার জন্য একটি আদেশ হিসাবে ব্যাখ্যা করা হবে: যেমন

$txt = "this \" is escaped";

নিম্নলিখিত টোকেন মধ্যে ফলাফল: $, txt, =, ", this, \, ", is escaped, ", এবং;

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

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