Is_email () ফাংশনে পাঠানোর আগে আমার কোনও ইমেল ঠিকানা স্যানিটাইজ করা উচিত?


13

আমি is_email()ব্যবহারকারীর দ্বারা সরবরাহিত ইমেল ঠিকানাটি বৈধ কিনা তা পরীক্ষা করতে ব্যবহার করছি । উদাহরণ স্বরূপ:

$email = $_POST['email'];
if ( is_email( $email ) )
    // Do something.

আমার জ্ঞানের সেরা হিসাবে, এই ফাংশনটির কিছুই ডেটাবেজে তথ্য লেখেনি। $emailফাংশনে পাস করার আগে আমার কী স্যানিটাইজিং করা উচিত ?


কায়সার, সম্পাদনার জন্য ধন্যবাদ। এটি আসলে আমার জন্য স্যানিটাইজেশন তবে আমি নিশ্চিত যে এখানে বেশিরভাগ পাঠক একটি জেড ব্যবহার করবেন :)
হেনরিউইট

উত্তর:


5

এ খুঁজছি is_email()TRAC কার্যকারিতা, এটা আপনি এটি এর ঠিক স্ট্রিং পরীক্ষামূলক যেমন sanatizie প্রয়োজন হবে না বলে মনে হচ্ছে। আমি এমনকি এতদূর গিয়েও বলতে পারি যে যদি এই ফাংশনটি সত্য হয় তবে আপনাকে এটি ডাটাবেসে প্রেরণের আগে স্যানিটাইজ করার প্রয়োজন হবে না।


স্ট্রিং টেস্টিং সম্পর্কে আমার চিন্তাভাবনা। আমি মনে করি ডিবিতে প্রেরণের আগে আমি এখনও স্যানিটাইজ করব, আপনি সম্ভবত এটি সঠিক নন যে এই জিনিসগুলি আসার পরে আমি নার্ভাস নষ্ট :)
হেনরিউইট

সত্য, দুঃখের চেয়ে আরও নিরাপদ এবং স্যানিটাইজেশন ওভারহেড সম্পূর্ণ অলক্ষিতযোগ্য।
হাওডি_এমসিজি

18

ওয়ার্ডপ্রেস এবং পিএইচপি কোর

is_email()ফাংশন উত্স একটি টিপিক্যাল ওয়ার্ডপ্রেস বাস্তবায়ন আর কোনটা সাথে সম্পূর্ণরূপে কাজ করে না বোঝায় যা RFC 6531 পারেন। একটি কারণ হতে পারে, ডিফল্ট পিএইচপি FILTER_VALIDATE_EMAILধ্রুবক ইন্টারনেট ইঞ্জিনিয়ারিং টাস্ক ফোর্স (আইইটিএফ®) নির্দেশিকা filter_var()অনুসারে কোনও কিছুকে বৈধতা দেওয়ার পক্ষে আরও ভাল নয় ।

স্ট্যান্ডার্ড

পয়েন্টটি হ'ল আরএফসি 6531 "ASCII সীমার বাইরে ইউনিকোড অক্ষর" এর অনুমতি দেয় । যথা: সেগুলি (স্থানীয় অংশের জন্য - এর আগে @):

  • বড় হাতের এবং ছোট হাতের অক্ষরের ইংরেজি অক্ষর (a – z, A – Z) (এএসসিআইআই: 65-90, 97–122)
  • সংখ্যা 0থেকে 9(হওয়া ASCII: 48-57)
  • এই বিশেষ চরিত্রগুলি: ! # $ % & ' * + - / = ? ^ _ ` { | } ~
  • অক্ষর .(বিন্দু, পিরিয়ড, পুরো স্টপ) (এএসসিআইআই: 46) শর্ত দেয় যে এটি প্রথম বা শেষ অক্ষর নয় এবং এটি সরবরাহ করে যে এটি ক্রমাগতভাবে প্রদর্শিত না হয় (যেমন John..Doe@example.comঅনুমোদিত নয়)।
  • বিশেষ অক্ষরগুলি সীমাবদ্ধতার সাথে অনুমোদিত। তারা হ'ল:
    • স্পেস এবং "(),:;<>@[\](এএসসিআইআই: 32, 34, 40, 41, 44, 58, 59, 60, 62, 64, 91-93)
    • বিশেষ অক্ষরের জন্য বিধিনিষেধগুলি হ'ল এগুলি কেবলমাত্র উদ্ধৃতি চিহ্নের মধ্যে থাকা অবস্থায় ব্যবহার করা আবশ্যক এবং তাদের মধ্যে দুটি (ব্যাকস্ল্যাশ \ এবং উদ্ধৃতি চিহ্ন "(এএসসিআইআই: 92, 34)) অবশ্যই ব্যাকস্ল্যাশ \(যেমন "\\"এবং "\"") এর আগে হওয়া উচিত ।
  • স্থানীয় অংশের উভয় প্রান্তে বন্ধনীর সাহায্যে মন্তব্যগুলি অনুমোদিত; উদাহরণস্বরূপ john.smith(comment)@example.comএবং (comment)john.smith@example.comউভয় সমতুল্য "john.smith@example.com", তবে john.(comment)smith@example.comএটি অবৈধ হবে।
  • U+007Fইউটিএফ -8 হিসাবে এনকোডযুক্ত উপরের আন্তর্জাতিক অক্ষরগুলি আরএফসি 6531 দ্বারা অনুমোদিত, যদিও মেল সিস্টেমগুলি স্থানীয় অংশগুলি বরাদ্দ করার সময় কোন অক্ষর ব্যবহার করতে হবে তা সীমাবদ্ধ করতে পারে।

এবং গ্লোবাল / ডোমেন অংশের জন্য:

ইমেল ঠিকানার ডোমেন নাম অংশটি কঠোর নির্দেশিকা মেনে চলতে হয়: এটি অবশ্যই একটি হোস্টনামের সাথে প্রয়োজনীয়তার সাথে মেলে, অক্ষর, অঙ্ক, হাইফেন এবং বিন্দু সমন্বিত। এছাড়াও, ডোমেন অংশটি একটি আইপি ঠিকানা আক্ষরিক হতে পারে, বর্গাকার ধনুর্বন্ধনী দ্বারা বেষ্টিত, যেমন jsmith@[192.168.2.1]বা jsmith@[IPv6:2001:db8::1][…]

সূত্র: উইকিপিডিয়া

বৈধ কি?

এটি নিম্নলিখিতগুলির মতো অদ্ভুত, তবে বৈধ ইমেল ঠিকানাগুলিতে নিয়ে যেতে পারে:

  • localpart.ending.with.dot.@example.com
  • (comment)localpart@example.com
  • "this is v@lid!"@example.com
  • "much.more unusual"@example.com
  • postbox@com
  • admin@mailserver1
  • "()<>[]:,;\\@\"\\\\!#$%&\'*+-/=?^_`{}| ~.a"@example.org
  • " "@example.org

সূত্র: php.net / লেখক gt@kani.hu - উদাহরণটি এই পোস্টের লেখক দ্বারা স্থির করা হয়েছে

সীমা

স্থানীয় এবং ডোমেন দৈর্ঘ্যের সীমাও রয়েছে:

ইমেল ঠিকানাগুলির ফর্ম্যাটটি local-part@domainযেখানে স্থানীয় অংশটি 64৪ টি অক্ষর পর্যন্ত দীর্ঘ হতে পারে এবং ডোমেন নামটিতে সর্বাধিক 253 অক্ষর থাকতে পারে - তবে একটি ফরোয়ার্ড বা বিপরীত পথের সর্বাধিক 256-অক্ষরের দৈর্ঘ্য পুরো ইমেল ঠিকানাটিকে সীমাবদ্ধ করে ২৫৪ টির বেশি অক্ষরের চেয়ে বেশি লম্বা হবেন না । [২] আনুষ্ঠানিক সংজ্ঞাগুলি আরএফসি 5322 (বিভাগ 3.3.3 এবং 3.4.1) এবং আরএফসি 5321 - ইন তথ্য সম্পর্কিত আরএফসি 3696 [3] এবং সম্পর্কিত ত্রুটিযুক্ত দেওয়া হয়েছে আরও পাঠযোগ্য ফর্ম সহ ।

সূত্র: উইকিপিডিয়া

ওয়ার্ডপ্রেস বিধিনিষেধ

এবং এটিই ওয়ার্ডপ্রেস যাচাই করে:

  • ন্যূনতম দৈর্ঘ্যের পরীক্ষা ইমেল হতে পারে: strlen( $email ) < 3
  • প্রথম অবস্থানের পরে @ চরিত্রের জন্য পরীক্ষা করুন: strpos( $email, '@', 1 ) === false
  • অবৈধ অক্ষরের জন্য পরীক্ষা: !preg_match( '/^[a-zA-Z0-9!#$%&\'*+\/=?^_`{|}~\.-]+$/', $local )
  • পিরিয়ডের ক্রমগুলির জন্য পরীক্ষা: preg_match( '/\.{2,}/', $domain )
  • শীর্ষস্থানীয় এবং পিছনের পিরিয়ড এবং সাদা স্থানের জন্য পরীক্ষা: trim( $domain, " \t\n\r\0\x0B." ) !== $domain
  • ধরে নিন ডোমেনটিতে কমপক্ষে দুটি সাব থাকবে: $subs = explode( '.', $domain );এবং তারপরে
    • 2 > count( $subs )
    • trim( $sub, " \t\n\r\0\x0B-" ) !== $sub
    • !preg_match('/^[a-z0-9-]+$/i', $sub )

সূত্র: ডাব্লুপি কোর ভি 4.0

ফিল্টার এবং কাস্টম বৈধতা

উল্লিখিত সমস্ত ক্ষেত্রেই is_email()মিথ্যা ফিরে আসতে ট্রিগার করবে । ফলাফলটি ফিল্টার-সক্ষম (একটি কলব্যাক সংযুক্ত করা যেতে পারে) এবং ফিল্টারটিতে তিনটি আর্গুমেন্ট থাকবে, যেখানে শেষ যুক্তির কারণ। উদাহরণ:

return apply_filters( 'is_email', false, $email, 'sub_hyphen_limits' );

যার অর্থ আপনি নির্দিষ্ট পরীক্ষায় ফিরে আসা ফলাফলগুলিকে ওভাররাইড করতে পারেন।

এটি আপনাকে বিশেষ চেক যোগ করার অনুমতি দেয়, উদাহরণস্বরূপ উমলাউট-ডোমেনগুলি, কেবলমাত্র টিএলডি-র জন্য কেবল ডোমেন পার্টস ইত্যাদির অনুমতি দেওয়া etc.

উপসংহার

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

সম্পাদন করা

মজাদার পার্শ্ব ফ্যাক্ট: ভিতরে দুটি সম্পর্কিত ফাংশন রয়েছে ~/wp-includes/formatting: is_email()এবং sanitize_email()। তারা কার্যত একই ফাংশন। আমার ধারণা নেই যে কেন কেউ সিদ্ধান্ত নিয়েছে যে কেবলমাত্র অন্যটি সরবরাহকারী ফিল্টারগুলিতে কলব্যাক হিসাবে একটি যুক্ত করার পরিবর্তে ফাংশন সামগ্রীটি এক থেকে অন্যটিতে অনুলিপি করা ভাল ধারণা। হিসাবে v0.71 যেহেতু এবং v1.5 যেহেতু একই রকম, আমি ব্যক্তিগতভাবে পরে ব্যবহার আপনি একটি পরিষ্কার স্ট্রিং পেতে হবে। নোট করুন এমনকি এমনকি এটি আরএফসি অনুগত নয় বলেও জানিয়েছে।is_email() sanitize_email() is_email()


সুতরাং আপনি বলছেন, তত্ত্বগতভাবে, সেখানে ইমেল ঠিকানাগুলি থাকবে যা আরএফসি 6531 অনুসারে সম্পূর্ণ বৈধ তবে এগুলি ওয়ার্ডপ্রেস দ্বারা অবৈধ বলে বিবেচিত হবে?
হেনরিয়াইট

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

1
আমি এটি ইতিমধ্যে দুবার পড়েছি কারণ এটি এমন কিছু যা বোঝার মতো! যেমন একটি বিস্তারিত উত্তরের জন্য ধন্যবাদ :)
হেনরিউইট

2

সমস্ত জিনিস স্যানিটাইজ করুন!

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


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