সেরা পিএইচপি ইনপুট স্যানিটাইজিং ফাংশনগুলি কী কী?


161

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

শূন্যস্থান পূরণ করতে দয়া করে আমাকে:

function filterThis($string) {
    $string = mysql_real_escape_string($string);
    $string = htmlentities($string);
    etc...
    return $string;
}

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

ডাটাবেস সন্নিবেশের জন্য পরিষ্কার করার জন্য নির্দিষ্ট উত্তরের জন্য stackoverflow.com/questions/60174/… দেখুন (এটি পিডিওর একটি উদাহরণ দেয় যা অন্যরা নীচে উল্লেখ করেছেন)।
পট

উত্তর:


433

বন্ধ করুন!

আপনি এখানে একটি ভুল করছেন। ওহ, না, আপনি আপনার ডেটা কিছুটা নিরাপদ করতে সঠিক পিএইচপি ফাংশন বেছে নিয়েছেন। সেটা ঠিক আছে. আপনার ভুলটি ক্রিয়াকলাপের ক্রম এবং এই ফাংশনগুলি কখন এবং কোথায় ব্যবহার করবেন।

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

স্যানিটাইজিং এবং ব্যবহারকারীর ডেটা বৈধকরণ

ব্যবহারকারীরা ডেটা জমা দেওয়ার সময়, আপনাকে নিশ্চিত করা উচিত যে তারা আপনার প্রত্যাশিত কিছু সরবরাহ করেছে।

স্যানিটাইজেশন এবং ফিল্টারিং

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

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

প্রথমে, আপনি এইচটিএমএল ইনপুট দিয়ে পালাতে চেষ্টা করতে পারেন htmlspecialchars। আপনার htmlentitiesএইচটিএমএলকে নিরপেক্ষ করতে ব্যবহার করা উচিত নয় , কারণ এটি উচ্চারণযুক্ত এবং অন্যান্য অক্ষরগুলির এনকোডিংও সম্পাদন করবে যা এটি মনে করে যে এনকোড করাও দরকার।

দ্বিতীয়ত, আপনি যে কোনও সম্ভাব্য এইচটিএমএল সরিয়ে চেষ্টা করতে পারেন । strip_tagsদ্রুত এবং সহজ, তবে ঝাপটায় op এইচটিএমএল পিউরিফায়ার উভয়ই এইচটিএমএল কেটে ফেলা এবং এর মাধ্যমে ট্যাগ এবং বৈশিষ্ট্যগুলির একটি নির্বাচিত শ্বেত তালিকা সরবরাহ করার অনুমতি দেয় of

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

ভ্যালিডেশন

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

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

যদি সেই ডেটা ড্রপ-ডাউন মেনু হওয়া উচিত তবে তা নিশ্চিত হয়ে নিন যে জমা দেওয়া মানটি মেনুতে উপস্থিত হয়েছে।

অন্যান্য প্রয়োজনীয়তা পূরণ করে যে পাঠ্য ইনপুটগুলি সম্পর্কে কী? উদাহরণস্বরূপ, তারিখ ইনপুটগুলি strtotimeবা ডেটটাইম শ্রেণীর মাধ্যমে বৈধ হওয়া উচিত । প্রদত্ত তারিখটি আপনার প্রত্যাশা রেঞ্জের মধ্যে হওয়া উচিত। ইমেল ঠিকানা সম্পর্কে কি? পূর্বে উল্লিখিত ফিল্টার এক্সটেনশানটি পরীক্ষা ঠিক করতে পারে যে ঠিকানা ঠিকঠাক হয়েছে, যদিও আমি is_email লাইব্রেরির একজন অনুরাগী ।

অন্যান্য সমস্ত ফর্ম নিয়ন্ত্রণের ক্ষেত্রেও এটি একই । রেডিও বোতাম আছে? তালিকার বিরুদ্ধে বৈধতা দিন। চেকবক্স আছে? তালিকার বিরুদ্ধে বৈধতা দিন। একটি ফাইল আপলোড আছে? নিশ্চিত করুন যে ফাইলটি প্রত্যাশিত ধরণের is

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

স্টোরেজ জন্য ডেটা পালাচ্ছে

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

প্রতিটি একক ডেটা স্টোরেজ মেকানিজমিতে ডেটা সঠিকভাবে পালানো এবং এনকোড করা হয়েছে তা নিশ্চিত করার একটি নির্দিষ্ট উপায় রয়েছে। যদি আপনি এসকিউএল তৈরি করে থাকেন তবে প্রশ্নগুলিতে ডেটা পাস করার স্বীকৃত উপায় হ'ল স্থানধারীদের সাথে প্রস্তুত বিবৃতি

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

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

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

আমি ব্যক্তিগতভাবে মাইস্কুলির অনুরাগী নই। এটি প্রস্তুত বিবৃতিগুলিতে যেভাবে পরিবর্তনশীল বাইন্ডিং সম্পাদন করে তা অবিরাম এবং এটি ব্যবহারে ব্যথা হতে পারে। সন্দেহ হলে, পরিবর্তে PDO ব্যবহার করুন।

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

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

উপস্থাপনের জন্য ডেটা পালাচ্ছে

প্রতিবার আপনি যখন ব্যবহারকারীদের ডেটা দেখান, আপনার অবশ্যই নিশ্চিত হওয়া উচিত যে তথ্যটি নিরাপদে পালানো হয়েছে, যদি না আপনি জানেন যে এটি এড়ানো উচিত নয়।

এইচটিএমএল নির্গমন করার সময়, আপনাকে প্রায়শই মূলত ব্যবহারকারী-সরবরাহ করা কোনও ডেটা পাস করা উচিত htmlspecialchars। প্রকৃতপক্ষে, আপনি যখনই জানেন যে ব্যবহারকারী এইচটিএমএল সরবরাহ করেছে এবং আপনি জানেন যে এটি ইতিমধ্যে কোনও শ্বেতলিস্ট ব্যবহার করে এটি স্যানিটাইজড করা হয়েছে কেবল তখনই আপনি এটি না করা উচিত ।

কখনও কখনও আপনার পিএইচপি ব্যবহার করে কিছু জাভাস্ক্রিপ্ট তৈরি করা প্রয়োজন। জাভাস্ক্রিপ্টের এইচটিএমএলের মতো পালানোর নিয়ম নেই! পিএইচপি এর মাধ্যমে জাভাস্ক্রিপ্টে ব্যবহারকারী দ্বারা সরবরাহিত মান সরবরাহের একটি নিরাপদ উপায় json_encode

এবং আরও

ডেটা বৈধকরণের আরও অনেকগুলি সূক্ষ্মতা রয়েছে।

উদাহরণস্বরূপ, অক্ষর সেট এনকোডিং একটি বিশাল ফাঁদ হতে পারে । আপনার অ্যাপ্লিকেশনটির " সমস্ত দিক দিয়ে ইউটিএফ -8 " তে বর্ণিত অনুশীলনগুলি অনুসরণ করা উচিত । অনুমানমূলক আক্রমণ রয়েছে যা আপনি স্ট্রিং ডেটাটিকে ভুল চরিত্রের সেট হিসাবে বিবেচনা করার সময় ঘটতে পারে।

এর আগে আমি ব্রাউজারের ডিবাগ সরঞ্জামগুলি উল্লেখ করেছি। এই সরঞ্জামগুলি কুকির ডেটা ম্যানিপুলেট করতেও ব্যবহার করা যেতে পারে। কুকিজ অবিশ্বস্ত ব্যবহারকারী ইনপুট হিসাবে বিবেচনা করা উচিত

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


এবং এটি নির্দিষ্ট করার সময় নিশ্চিত হয়ে নিন যে এটি সমর্থিত এনকোডিংগুলির তালিকায় রয়েছে।
চার্লস

3
এবং একেবারে এইচটিএমলেটিটিস ব্যবহার করবেন না <>, প্রতিটি চরিত্রকে তার সত্তার পরিবর্তে কেবল প্রতিস্থাপনের উদ্দেশ্যে এইচটিএমএল স্পেশালচার্স দিয়ে এটিকে প্রতিস্থাপন করুন
আপনার কমন সেন্স

6
কেবল htmlspecialcharsদু'বার কল না করার বিষয়ে নিশ্চিত হন , কারণ তিনি "এর সাথে ব্যবহারকারীরা যখন ডেটা অংশ জমা দেয়" এবং "ডেটা প্রদর্শন করার সময়" অংশে কথা বলেন।
সেভেজম্যান

2
সম্মত। এসকিউএল ইঞ্জেকশন সম্পর্কিত অনেক প্রশ্নোত্তর থেকে আমি সর্বাধিক সহায়ক উত্তর helpful
আকিনুরি

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

32

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

এইচটিএমএল অপসারণের ক্ষেত্রে, strip_tagsসম্ভবত HTML অপসারণের জন্য সেরা ধারণা, কারণ এটি সমস্ত কিছু সরিয়ে ফেলবে। htmlentitiesএটি যেমন মনে হয় তেমন করে, তাই এটিও কার্যকর হয়। যদি আপনাকে কোন এইচটিএমএলকে অনুমতি দেওয়ার ( যেমনটি আপনি কিছু ট্যাগের অনুমতি দিতে চান ) পার্সিং করতে চান তবে আপনার একটি পরিপক্ক বিদ্যমান পার্সার যেমন এইচটিএমএল পিউরিফায়ার ব্যবহার করা উচিত


2
ওহ মানুষ, আমি পাঠকের সেই দৈত্য প্রাচীরটি কেবলমাত্র লিখেছি কারণ আমি কাউকে এইচটিএমএল পিউরিফায়ারের উল্লেখ করতে দেখিনি, এবং এখানে আপনি 40 মিনিটের মতো আমাকে পিটিয়েছেন। ;)
চার্লস

3
আপনার কি কেবলমাত্র আউটপুটটিতে এইচটিএমএল স্ট্রিপ করা উচিত নয়? আইএমও আপনার কখনই ইনপুট ডেটা পরিবর্তন করা উচিত নয় - কখনই আপনার কখন প্রয়োজন হবে তা আপনি জানেন না
জো ফিলিপস

11

ডাটাবেস ইনপুট - কীভাবে এসকিউএল ইনজেকশন প্রতিরোধ করা যায়

  1. ধরণের পূর্ণসংখ্যার ডেটা নিশ্চিত করার জন্য চেক করুন, উদাহরণস্বরূপ, এটি আসলে একটি পূর্ণসংখ্যা নিশ্চিত করে বৈধ হয়
    • নন-স্ট্রিংয়ের ক্ষেত্রে আপনাকে নিশ্চিত করতে হবে যে ডেটা আসলে সঠিক ধরণের
    • স্ট্রিংয়ের ক্ষেত্রে আপনাকে নিশ্চিত করতে হবে যে স্ট্রিংটি কোয়েরিতে উদ্ধৃতি দ্বারা বেষ্টিত রয়েছে (স্পষ্টত, অন্যথায় এটি এমনকি কাজ করবে না)
  2. এসকিউএল ইনজেকশন (mysql_real_escape_string বা প্যারামিটারাইজড কোয়েরি) এড়িয়ে যাওয়ার সময় ডাটাবেসে মান প্রবেশ করান
  3. ডাটাবেস থেকে মানটি পুনরুদ্ধার করার সময় নিশ্চিত করুন যে এইচটিএমএল পৃষ্ঠাতে ইনজেক্ট করা যাবে না তা নিশ্চিত করে ক্রস সাইট স্ক্রিপ্টিং আক্রমণগুলি এড়িয়ে চলুন (এইচটিএমএল স্পেশালচার্স)

ডাটাবেসে serোকানো বা আপডেট করার আগে আপনাকে ব্যবহারকারীর ইনপুটটি এড়াতে হবে। এটি করার জন্য এটি একটি পুরানো উপায়। আপনি এখন প্যারামিটারাইজড ক্যোয়ারী ব্যবহার করতে চান (সম্ভবত পিডিও ক্লাস থেকে)।

$mysql['username'] = mysql_real_escape_string($clean['username']);
$sql = "SELECT * FROM userlist WHERE username = '{$mysql['username']}'";
$result = mysql_query($sql);

ডাটাবেস থেকে আউটপুট - এক্সএসএস (ক্রস সাইট স্ক্রিপ্টিং) কীভাবে প্রতিরোধ করবেন

htmlspecialchars()ডাটাবেস থেকে ডেটা আউটপুট দেওয়ার সময়ই ব্যবহার করুন । এইচটিএমএল পিউরিফায়ারের ক্ষেত্রেও একই প্রযোজ্য। উদাহরণ:

$html['username'] = htmlspecialchars($clean['username'])

এবং অবশেষে ... আপনি যা অনুরোধ করেছেন

আমার অবশ্যই উল্লেখ করতে হবে যে আপনি যদি প্যারামিটারাইজড কোয়েরিগুলি (এটি করার সঠিক উপায়) দিয়ে PDO অবজেক্টগুলি ব্যবহার করেন তবে সহজেই এটিকে সহজে অর্জন করার কোনও সহজ উপায় নেই। তবে আপনি যদি পুরানো 'মাইএসকিএল' উপায় ব্যবহার করেন তবে আপনার প্রয়োজনটি এটিই।

function filterThis($string) {
    return mysql_real_escape_string($string);
}

5

আমার 5 সেন্ট।

এখানে mysql_real_escape_stringকাজ করার উপায় কেউ বুঝতে পারে না । এই ফাংশনটি কোনও কিছুই ফিল্টার করে না বা "স্যানিটাইজ" করে না।
সুতরাং, আপনি এই ক্রিয়াকে কিছু সর্বজনীন ফিল্টার হিসাবে ব্যবহার করতে পারবেন না যা আপনাকে ইঞ্জেকশন থেকে রক্ষা করবে।
আপনি এটি তখনই ব্যবহার করতে পারবেন যখন আপনি বুঝতে পারবেন কীভাবে কীভাবে কার্যকর হয় এবং এটি কোথায় প্রযোজ্য।

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

এইচটিএমএলটিটিস হিসাবে - চার্লস আপনাকে সঠিকভাবে এই ফাংশনগুলি আলাদা করতে বলছে।
ভাবুন আপনি কোনও ডেটা toোকাতে যাচ্ছেন, অ্যাডমিন দ্বারা উত্পাদিত, যিনি এইচটিএমএল পোস্ট করার অনুমতিপ্রাপ্ত। আপনার ফাংশন এটি লুণ্ঠন করবে।

যদিও আমি htmlentities বিরুদ্ধে পরামর্শ দিতে চাই। এই ফাংশনটি অনেক আগে অচল হয়ে পড়েছিল। আপনি প্রতিস্থাপন করতে চান শুধুমাত্র <, >এবং "এইচটিএমএল নিরাপত্তা অনুরোধে অক্ষর - একটি - ফাংশন যা যে উদ্দেশ্যে ইচ্ছাকৃতভাবে উন্নত ছিল ব্যবহার htmlspecialchars () অন্যতম।


1
mysql_real_escape_stringএকটি স্ট্রিংয়ের মধ্যে প্রয়োজনীয় অক্ষরগুলি পালিয়ে যায়। এটি কঠোরভাবে ফিল্টারিং বা স্যানিটাইজিং নয়, তবে উদ্ধৃতিগুলিতে একটি স্ট্রিং আবদ্ধ করা হয় না (এবং প্রত্যেকেই তা করে, আমি এ সম্পর্কে কখনও কোনও প্রশ্ন দেখিনি)। সুতরাং যখন আমরা এসকিউএল লিখি তখন কিছুই স্যানিটাইজ হয় না? অবশ্যই না. এসকিউএল ইঞ্জেকশনটি যা প্রতিরোধ করে তা হ'ল ব্যবহার mysql_real_escape_string। এনকোলেসিং কোটগুলিও, তবে প্রত্যেকে তা করে এবং আপনি যা করেন তা পরীক্ষা করে নিলে আপনি এই বাদ দিয়ে কোনও এসকিউএল সিনট্যাক্স ত্রুটি শেষ করেন। আসল বিপজ্জনক অংশটি পরিচালনা করা হয় mysql_real_escape_string
সেভেজম্যান

@ সাভেজম্যান দুঃখিত, আপনি কিছুই বুঝতে পারেন না। যেভাবে mysql_real_escape_string কাজ করে তা আপনি বুঝতে পারবেন না। এই "প্রয়োজনীয় অক্ষরগুলি" এআরএ এর উদ্ধৃতি রয়েছে। এই ফাংশন বা উদ্ধৃতি একাকী কিছু না। এই 2 টি জিনিস কেবল এক সাথে কাজ করে । ক্যোয়ারী স্ট্রিংটি কেবল সিনট্যাক্টিক্যালি সঠিকভাবে তৈরি করা, "ইঞ্জেকশন থেকে নিরাপদ" নয়। এবং আমি কি সিনট্যাক্স ত্রুটি ঠিক জন্য পেতে হবে WHERE id = 1? ;)
আপনার সাধারণ সংবেদন

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

1
@ সাজেজম্যান তাই বলেছি: আপনি কীভাবে এটি কার্যকর এবং কোথায় এটি প্রযোজ্য তা বুঝতে পারলেই আপনি এটি ব্যবহার করতে পারবেন। আপনি সবেমাত্র স্বীকার করেছেন যে mysql_real_escape_string সর্বত্র প্রযোজ্য নয়। হিসাবে everyone use themআপনি এখন এখানে কোড চেক করতে পারেন। অনেকে সংখ্যা সহ কোট ব্যবহার করেন না। চিত্রে যান. দয়া করে মনে রাখবেন যে আপনি কী বলেছেন এবং কী করেন না আমি এখানে সে বিষয়ে আলোচনা করছি না। আমি কেবল বুনিয়াদি ডাটাবেস সুরক্ষা বিধিগুলি ব্যাখ্যা করছি। খালি তর্ক করার পরিবর্তে আপনি আরও ভাল শিখতে চাইছেন। কেউ এখানে উদ্ধৃতি বা কাস্টিংয়ের কথা উল্লেখ করেনি তবে m_r_e_s কেবল এটি জাদু। আমি যে বিষয়ে কথা বলছি
আপনার সাধারণ সংবেদন

1
ওভার আপ, পাশাপাশি @ চারেলস নবজাতক হিসাবে, ডাটাবেস ইন্টারঅ্যাকশন ... ইনপুট এবং প্রদর্শনের জন্য জিনিসগুলিকে নিরাপদ করা, বিশেষ অক্ষর, ইনজেকশন সমস্যাগুলি খুব খাড়া শেখার বক্ররেখা ছিল। আপনার পোস্ট এবং তাঁর (পাশাপাশি আপনার অন্যান্য পিএইচপি উত্তরগুলিও আমার পড়া পড়া আমাকে যথেষ্ট সহায়তা করেছে your আপনার সমস্ত ইনপুটটির জন্য Tx
জেমস ওয়াকার

2

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

htmlentitiesআপনি কোনও ওয়েব পৃষ্ঠায় ডেটা প্রদর্শন করার সময় ব্যবহার করুন ।

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

$input = preg_replace('/\s+/', ' ', $input);

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


2

1) নেটিভ পিএইচপি ফিল্টার ব্যবহার করে , আমি নিম্নলিখিত ফলাফল পেয়েছি:

এখানে চিত্র বর্ণনা লিখুন


(উত্স লিপি: https: // রানফোর github.com/tazotodua/useful-php-scriptts/blob/master/filter-php-variable-sanitize.php )


আপনার চিত্রটি লোড হয় না (বা এটির জন্য Google ড্রাইভে লগইন প্রয়োজন)।
ক্রিস্টোফার বোহমান

2

এটি নির্ভর করে আপনি কী ধরণের ডেটা ব্যবহার করছেন। ব্যবহারের জন্য সাধারণ mysqli_real_escape_stringসেরাটি হ'ল তবে, উদাহরণস্বরূপ, আপনি জানেন যে এইচটিএমএল সামগ্রী থাকবে না, স্ট্রিপ_ট্যাগগুলি ব্যবহার করে অতিরিক্ত সুরক্ষা যুক্ত হবে।

আপনি যে অক্ষরগুলি জানেন সেগুলিও মুছে ফেলা উচিত নয়।


1

আমি সর্বদা GUMP: https://github.com/Wixel/GUMP এর মতো একটি ছোট বৈধতা প্যাকেজ ব্যবহার করার পরামর্শ দিই

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


1

এখানে যারা mysql_real_escape_string সম্পর্কে কথা বলছেন এবং তাদের উপর নির্ভর করছেন তাদের সবার জন্য আপনাকে লক্ষ্য করতে হবে যে ফাংশনটি পিএইচপি 5-এ অবনতি হয়েছে এবং পিএইচপি 7 এ আর বিদ্যমান নেই।

আইএমএইচও এই কাজটি সম্পাদন করার সর্বোত্তম উপায় হ'ল পিডিও ব্যবহারের মাধ্যমে প্যারামেট্রাইজড কোয়েরিগুলি ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করার জন্য। এটি দেখুন: https://phpdelusions.net/pdo_example/select

ব্যবহারকারী ইনপুট প্রক্রিয়া করতে সর্বদা ফিল্টার ব্যবহার করুন। Http://php.net/manual/es/function.filter-input.php দেখুন


এটি আসলে প্রশ্নের উত্তর দেয় না। একটি সমাধান অন্তর্ভুক্ত আপনার উত্তর পরিবর্তন করার বিবেচনা করুন।
ক্রিস

আশা করি এটা আপনার ভালো লেগেছে!
কুন্টুর

আমি করি. চমৎকার উত্তর!
ক্রিস

আমি নোট তৈরির পরামর্শ দিচ্ছি যে পিএইচপি 7- mysqli_real_escape_string()তে উপলব্ধ।
ক্রিস

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

0

আপনি নিম্নলিখিত একটির মতো কোডটিতে mysql_real_escape_string () ব্যবহার করেন ।

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

ডকুমেন্টেশন হিসাবে বলা হয়েছে, এর উদ্দেশ্যটি যুক্তি হিসাবে পাস করা স্ট্রিংয়ের বিশেষ অক্ষরগুলি থেকে দূরে চলেছে, সংযোগের বর্তমান চরিত্রের সেটটি বিবেচনা করে যাতে এটি একটি mysql_query () এ স্থাপন করা নিরাপদ থাকে । ডকুমেন্টেশন এছাড়াও যোগ করেছে:

যদি বাইনারি ডেটা beোকাতে হয় তবে এই ফাংশনটি অবশ্যই ব্যবহার করা উচিত।

এইচটিএমলেটিটিস () হ'ল এইচটিএমএল সামগ্রীতে স্ট্রিং আউটপুট করার সময় সত্ত্বায় কিছু অক্ষর রূপান্তর করতে ব্যবহৃত হয়।


0

আমি বর্তমানে যেভাবে অনুশীলন করছি তার মধ্যে এটি 1

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

আমি বিশ্বাস করি সমস্তই বেসিক সেকেন্ডের জন্য যথেষ্ট। এটি হ্যাকার থেকে সমস্ত বড় আক্রমণ প্রতিরোধ করা উচিত।

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

আপনি htaccess অ্যাপাচি সেকেন্ড স্তর (সাধারণ rpactices) থেকে সেকেন্ডের অনুলিপি শিখতে এবং পেতে পারেন


0
function sanitize($string,$dbmin,$dbmax){
$string = preg_replace('#[^a-z0-9]#i', '', $string); //useful for strict cleanse, alphanumeric here
$string = mysqli_real_escape_string($con, $string); //get ready for db
if(strlen($string) > $dbmax || strlen($string) < $dbmin){
    echo "reject_this"; exit();
    }
return $string;
}

0

এই সম্পর্কে কি

$string = htmlspecialchars(strip_tags($_POST['example']));

অথবা এটা

$string = htmlentities($_POST['example'], ENT_QUOTES, 'UTF-8');
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.