কোন প্রসঙ্গে প্লাগইন ডেটা বৈধকরণ / স্যানিটাইজেশনের জন্য দায়ী?


17

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

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

আউটপুট sanitization জন্য, আমি জানি তুমি সব সময়ই মতো কাজগুলির ব্যবহার করতে হবে esc_html()এবং esc_attr()যখন এইচটিএমএল টেমপ্লেট মধ্যে ভেরিয়েবল echo'ing। তবে, টেমপ্লেট ট্যাগগুলি ব্যবহার করার পরে কী হবে ? তারা সবাই কি ইতিমধ্যে আউটপুট স্যানিটাইজ করে? যদি তা হয় তবে কোন প্রসঙ্গে (সাধারণ এইচটিএমএল, ট্যাগ বৈশিষ্ট্য ইত্যাদি)? কিছু ফাংশনে বিভিন্ন প্রসঙ্গে (যেমন the_title_attribute(), তবে বেশিরভাগ ক্ষেত্রে থাকে না) বৈকল্পিক রয়েছে ।

ইনপুট স্যানিটাইজেশনের জন্য, আমি জানি যে $wpdb->prepare()ম্যানুয়াল ক্যোয়ারীগুলি তৈরি করার সময় আমাকে ব্যবহার করা উচিত তবে প্লাগইন সেটিংস পৃষ্ঠা তৈরি করতে সেটিংস এপিআই ব্যবহার করার সময় বা কাস্টম পোস্টের জন্য পোস্ট মেটা ক্ষেত্রগুলি সংরক্ষণ করার বিষয়ে কী হবে?

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

এপিআই বৈধতা দেয় / স্বাস্থ্যকর করে

  • এর সাথে পোস্ট মেটা সংরক্ষণ করা হচ্ছে update_postmeta()
  • এর সাথে ব্যবহারকারীর মেটা সংরক্ষণ করা হচ্ছে update_user_meta()
  • একটি পোস্ট শিরোনাম আউটপুটিং - এর প্রাসঙ্গিকভাবে উপযুক্ত বৈকল্পিক ব্যবহার করুন the_title()
  • ইত্যাদি

আপনাকে ম্যানুয়ালি বৈধতা / স্যানিটাইজ করতে হবে

  • সেটিংস এপিআই দিয়ে প্লাগইন বিকল্প সংরক্ষণ করা হচ্ছে। এর তৃতীয় প্যারামিটার হিসাবে একটি কলব্যাক পাস করুন register_setting()
  • সরাসরি ডাটাবেসের প্রশ্নের: মোড়ানো ক্যোয়ারী $wpdb->prepare()
  • এইচটিএমএল আউটপুটিং ভেরিয়েবল। ব্যবহার esc_attr(), esc_html()ইত্যাদি
  • ইত্যাদি

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


আমি এই প্রশ্ন পছন্দ করি। আপনার মত আমারও ভাবনা আছে। আমি মনে করি আমাদের যদি ম্যানুয়ালি বৈধতা / স্যানিটাইজ করা আবশ্যক এমন কোনও তালিকা থাকে তবে তা দুর্দান্ত। +1 টি।
আনহ ট্রান

1
@ রিলুইস, আমার উত্তর দেখুন দয়া করে। আপনার অবশ্যই সর্বদা যাচাই করা উচিত। স্যানিটাইটিসেশন জটিল, কারণ 'নিরাপদ' প্রসঙ্গে নির্ভর করে। সাধারণত, যদি ওয়ার্ডপ্রেস পরিচিত ডেটার সাথে ওয়ার্ডপ্রেস এপিআই (ব্যবহার the_title(), the_permalink()ইত্যাদি) তুমি ভাল আছো কিন্তু কাস্টম ডেটার সাথে তাই না (যেমন get_post_meta())। যদি সন্দেহ হয় তবে নিজের স্বাচ্ছন্দ্য দিন - এটি কোনও ক্ষতি করতে পারে না।
স্টিফেন হ্যারিস

@ স্টেফেনহরিস: আমি আপনার মন্তব্যটি পড়েছি। আমি এটাও জানি তবে আমার মতামত ইয়ান ডান। আমি মনে করি তিনি জিজ্ঞাসা করার প্রধান কারণ হ'ল "যথেষ্ট করুন, আর কিছু করবেন না, কমও থাকবেন না"।
আনহ ট্রান

1
আমি আসলে সাবধানতার দিক থেকে ভুল হওয়া এবং অত্যধিক বৈধতা / স্যানিটেশন করার বিষয়টি মনে করি না তবে আমার মনে হয় এমন কিছু ঘটনা রয়েছে যেখানে দু'বার জিনিস পালাতে সমস্যা হতে পারে।
আয়ান ডান

উত্তর:


15

এখানে দুটি ধারণা আছে:

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

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

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

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

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

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


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

আমি কয়েকটি বিষয় স্পষ্ট করতে সবেমাত্র প্রশ্নটি আপডেট করেছি।
ইয়ান ডান

0

নিশ্চিত নয় যে এটি পুরোপুরি, তবে কোনও প্লাগইন বা থিমের সাথে ব্যবহারকারীর ইনপুট স্যানিটাইজ করা উচিত। ডাটাবেস অপারেশনগুলি $ wpdb-> পদ্ধতি ব্যবহার করে করা উচিত। সমস্ত G _GET এবং $ _POST ডেটা স্যানিটাইজ করা উচিত।

এটি ওয়ার্ডপ্রেসের চেয়ে পিএইচপি প্রোগ্রামিংয়ের জন্য সেরা অনুশীলন।

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

আমি যদি খুব অস্পষ্ট হয়ে থাকি তবে দয়া করে আরও নির্দিষ্ট প্রশ্ন জিজ্ঞাসা করুন।


3
আমি বুঝতে পারি যে এটি সর্বদা স্যানিটাইজেশন করা দরকার, তবে প্রশ্নটি প্রতিটি নির্দিষ্ট পরিস্থিতিতে স্যানিটাইজেশন কে করে does কখনও কখনও ওয়ার্ডপ্রেস এটি স্বয়ংক্রিয়ভাবে করে তোলে, এবং কখনও কখনও আপনাকে ম্যানুয়ালি এটি করতে হয়। আমি আরও আপডেট করার চেষ্টা করে প্রশ্নটি আপডেট করেছি।
আয়ান ডান

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

1
মান আপনি পাস update_user_meta()মাধ্যমে গৃহীত পরার stripslashes_deep()এবং sanitize_meta()মধ্যে update_metadata(), এবং তারপর $wpdb->prepare()মধ্যে $wpdb->update()। সুতরাং, আমি এটি স্যানিটাইজ করার দরকার নেই বলে আমি মনে করি না। আমি কিছু অনুপস্থিত করছি?
ইয়ান ডান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.