বেস 64 ডেটা পার্স করতে বা বৈধ করতে RegEx


100

বেইস 64 ডেটা যাচাই করতে বা স্যানিটাইজ করার জন্য কোনও রেজিএক্স ব্যবহার করা সম্ভব? এটি সহজ প্রশ্ন, তবে যে প্রশ্নগুলি এই প্রশ্নটিকে চালিত করে তা হ'ল এটি কঠিন।

আমার কাছে একটি বেস 64 ডিকোডার রয়েছে যা আরএফসি স্পেস অনুসরণ করতে ইনপুট ডেটার উপর পুরোপুরি নির্ভর করতে পারে না। সুতরাং, আমি যে সমস্যার মুখোমুখি হচ্ছি সেগুলি হ'ল সম্ভবত বেস like64 ডেটা যেমন 78৮ ভাগে বিভক্ত না হয়ে যেতে পারে (আমার মনে হয় এটি 78 78, আমাকে আরএফসির দ্বিগুণ পরীক্ষা করতে হবে, সুতরাং সঠিক সংখ্যাটি ভুল হলে আমাকে ডিঙ্গ করবেন না) চরিত্রটি লাইনগুলি বা লাইনগুলি সিআরএলএফ-এ শেষ নাও হতে পারে; এতে এটির কেবলমাত্র একটি সিআর, বা এলএফ থাকতে পারে বা নাও থাকতে পারে।

সুতরাং, আমার কাছে বেস 64 data ডেটা যেমন ফর্ম্যাট করা হয়েছে তা সময় নষ্ট করে ফেলেছে। এর কারণে, নীচের মতো উদাহরণগুলি নির্ভরযোগ্যভাবে ডিকোড করা অসম্ভব হয়ে পড়ে। আমি কেবল বংশবৃদ্ধির জন্য আংশিক MIME শিরোনাম প্রদর্শন করব।

Content-Transfer-Encoding: base64

VGhpcyBpcyBzaW1wbGUgQVNDSUkgQmFzZTY0IGZvciBTdGFja092ZXJmbG93IGV4YW1wbGUu

ঠিক আছে, এতগুলি পার্সিং করা কোনও সমস্যা নয় এবং ঠিক এটিই আমরা প্রত্যাশা করব। এবং 99% ক্ষেত্রে, বাফারের প্রতিটি চরটি একটি বৈধ বেস 64 চর, কমপক্ষে যাচাই করতে কোনও কোড ব্যবহার করে নিখুঁতভাবে কাজ করে। তবে, পরবর্তী উদাহরণটি মিশ্রণে একটি রেঞ্চ ফেলে দেয়।

Content-Transfer-Encoding: base64

http://www.stackoverflow.com
VGhpcyBpcyBzaW1wbGUgQVNDSUkgQmFzZTY0IGZvciBTdGFja092ZXJmbG93IGV4YW1wbGUu

এটি বেস 64৪ এনকোডিংয়ের একটি সংস্করণ যা আমি কিছু ভাইরাস এবং অন্যান্য জিনিসগুলিতে দেখেছি যা কিছু মেল পাঠককে সমস্ত মূল্যে মাইমকে পার্স করার ইচ্ছা পোষণ করে, বইটি বা কঠোরভাবে আরএফসি দ্বারা কঠোরভাবে যায়; আপনি যদি।

আমার বেস 64 ডিকোডারটি নীচের ডেটা স্ট্রিমের দ্বিতীয় উদাহরণটি ডিকোড করে। এবং এখানে মনে রাখবেন, মূল স্ট্রিমটি সমস্ত ASCII ডেটা!

[0x]86DB69FFFC30C2CB5A724A2F7AB7E5A307289951A1A5CC81A5CC81CDA5B5C1B19481054D0D
2524810985CD94D8D08199BDC8814DD1858DAD3DD995C999B1BDDC8195E1B585C1B194B8

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


হালনাগাদ:

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

[^-A-Za-z0-9+/=]|=[^=]|={3,}$

এবং হ্যাঁ, এটি কেবল বেস64 data০ এর একটি STRING এর জন্য , সঠিকভাবে ফর্ম্যাটেড আরএফসি 1341 বার্তা নয়। সুতরাং, আপনি যদি এই ধরণের ডেটা নিয়ে কাজ করে থাকেন তবে উপরের RegEx ব্যবহার করার চেষ্টা করার আগে দয়া করে এটিকে বিবেচনা করুন। আপনি Base16, Base32, Radix বা এমনকি অন্য কাজে (URL গুলি, ফাইল নাম, XML এনকোডিং, ইত্যাদি) জন্য করুন Base64- সাথে ডিল করা হয়, তাহলে এটি করা হয় অত্যন্ত সুপারিশ করছি যে আপনি পড়তে RFC4648 যে গাম্বো তার উত্তর উল্লেখিত হিসাবে আপনি ভাল হতে হবে এই প্রশ্ন / উত্তর সেটে পরামর্শগুলি ব্যবহার করার চেষ্টা করার আগে বাস্তবায়ন দ্বারা প্রয়োগ করা চরসেট এবং টার্মিনেটর সম্পর্কে সচেতন।


আমার ধারণা আপনার কাজটি আরও ভালভাবে সংজ্ঞায়িত করতে হবে। আপনার লক্ষ্যটি কী তা সম্পূর্ণ অস্পষ্ট: কঠোর হোন? নমুনার 100% পার্স? ...
ADEpt

আপনার প্রথম উদাহরণটি হতে হবে 'ভিজিপিপিবিপিসিবিআইএনএইচপিবিএক্সবিএসজেডএসবিবিউউএনএনএসএসবিসিওয়াইএনএনএলজিকিজিজেডএক্সবিএইচবিএক্সবিএসজেএমবিএম 3 আইজিইউ 3আরএইচওয়াই 2 টিপিডিএমভিআইজেএমএক্সভিডি ='
জেএফএস

কেন আপনার ভাষায় একটি স্ট্যান্ডার্ড সমাধান ব্যবহার করবেন না? রেজেক্সের উপর ভিত্তি করে আপনার হাতে লিখিত পার্সার প্রয়োজন কেন?
jfs

4
দুর্দান্ত প্রশ্ন। যদিও আমি চেষ্টা আপডেট এটি একটি Base64- এনকোডেড রয়েছে SHA বিরুদ্ধে চলমান দ্বারা Regex NPM দ্বারা ফিরে এসে এটা ব্যর্থ যেহেতু নির্বাচিত উত্তরে Regex মাত্র কাজ করে জরিমানা
জোশ হাবদাস

4
নিশ্চিত হতে পারছি না কিভাবে আপডেট Regex এখনও সংশোধন ছাড়া পোস্ট করা হয়, কিন্তু এটি লেখকের মত দেখায় বোঝানো লাগাতে ^বন্ধনী বাহিরে, একটি স্টার্ট নোঙ্গর হিসাবে। তবে, গ্রহণযোগ্য উত্তরের মতো জটিল না হয়ে আরও ভাল ^[-A-Za-z0-9+/]*={0,3}$
রেজেক্সটি

উত্তর:


149

আরএফসি থেকে 4648 :

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

সুতরাং এটি ডেটা বিপজ্জনক হিসাবে বিবেচনা করা উচিত যদি এনকোডড ডেটা ব্যবহারের উদ্দেশ্য উপর নির্ভর করে।

তবে আপনি যদি বেস 64 এনকোডড শব্দের সাথে মেলে একটি নিয়মিত প্রকাশের সন্ধান করছেন তবে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$

10
সবচেয়ে সহজ সমাধান হ'ল বৈধতার আগে সমস্ত সাদা স্থান (যা আরএফসি অনুসারে উপেক্ষা করা হবে) ছড়িয়ে দেওয়া।
বেন ফাঁকা

4
প্যাডিংয়ের জন্য সর্বশেষ নন-ক্যাপচারিং গ্রুপটি isচ্ছিক।
গম্বো

4
প্রথমে আমি জটিলতার বিষয়ে সন্দেহ ছিলাম, তবে এটি বেশ ভালভাবে যাচাই করে। যদি আপনি কেবল বেস64-এর সাথে মিল রাখতে চান তবে আমি ^ [a-zA-Z0-9 + /] = {0,3 $ doing করতে এসেছি, এটি আরও ভাল!
লোডেভিজক

4
@ বোগদাননিচাইপোরেনকো কারণ nameহ'ল (হেক্স) বাইট সিকোয়েন্সের একটি বৈধ বেস 64 এনকোডিং 9d a9 9e
মার্টেন

4
^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{4})$অবশ্যই
পাল্টা

38
^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$

এটি ভাল, তবে একটি খালি স্ট্রিংয়ের সাথে মিলবে

এইটি খালি স্ট্রিংয়ের সাথে মেলে না:

^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$

4
খালি স্ট্রিংটি কেন অবৈধ?
জোশ লি

8
এইটা না. তবে যদি আপনি প্রদত্ত স্ট্রিংটি বেস 64 নয় বা না তা অনুসন্ধানের জন্য যদি আপনি একটি রেজেক্স ব্যবহার করছেন তবে সম্ভাবনা রয়েছে যে আপনি খালি স্ট্রিংগুলিতে আগ্রহী নন। কমপক্ষে আমি জানি আমি নই।
njzk2

4
@ লাইজি: যদি আপনি এটি করেন তবে আপনি বেস 64 স্ট্রিংকে কমপক্ষে একটি 4-আকারের ব্লক ধারণ করতে বাধ্য করুন, বৈধ মানগুলি যেমন MQ==আপনার অভিব্যক্তির সাথে মিল নয়
রচনা

4
@ আরস্লান বা এটি করা উচিত নয়। এটি কোনও বৈধ বেস 64 স্ট্রিং নয়। (আকার 23, যা // 4 নয়)। AQENVg688MSGlEgdOJpjIUC=বৈধ ফর্ম হয়।
njzk2

4
@ জিনকওয়ান বেস64 0, 1 বা 2 দিয়ে শেষ হয় =। সর্বশেষ ?0 জন্য অনুমতি দেয় =। এর পরিবর্তে {1}1 বা 2 সমাপ্তি প্রয়োজন=
njzk2

4

আমরাও একটি " : " কিংবা একটি " আপ বৈধ করুন Base64-, তাই আমি মনে করি আপনি unambiguously বর্জন করা করতে পারেন প্রদর্শন করবে" http://www.stackoverflow.comলাইন। পার্লে, বলুন, এমন কিছু

my $sanitized_str = join q{}, grep {!/[^A-Za-z0-9+\/=]/} split /\n/, $str;

say decode_base64($sanitized_str);

আপনি যা চান তা হতে পারে এটি উৎপন্ন করে

স্ট্যাকওভারফ্লো এক্সপ্লেমেলের জন্য এটি সহজ ASCII বেস 64।


আমি সেখানে একমত হতে পারি, তবে ইউআরএলটিতে থাকা সমস্ত অন্যান্য অক্ষরই বৈধ বেস 64৪ হিসাবে ঘটে ... তাই, আপনি লাইনটি কোথায় আঁকেন? শুধু লাইন বিরতি? (আমি এমন কিছুগুলি দেখেছি যেখানে লাইনের মাঝখানে কেবল
দু'জন

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

(অবিরত): সংক্ষিপ্ত উত্তরটি "এটি নির্ভর করে" - কোথা থেকে ডেটা আসে এবং এতে আপনি যে ধরণের গণ্ডগোল খুঁজে পান।
জোনাথন লেফলার

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

4

এখন অবধি আমি যে সেরা রেজিপ্সাকে আবিষ্কার করতে পেরেছিলাম তা এখানে রয়েছে https://www.npmjs.com/package/base64-regex

যা বর্তমান সংস্করণে দেখতে মনে হচ্ছে:

module.exports = function (opts) {
  opts = opts || {};
  var regex = '(?:[A-Za-z0-9+\/]{4}\\n?)*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)';

  return opts.exact ? new RegExp('(?:^' + regex + '$)') :
                    new RegExp('(?:^|\\s)' + regex, 'g');
};

ছাড়া ভাল হতে পারে \\n?
জিন কওন

এটি JSON স্ট্রিংগুলিতে ব্যর্থ হবে
idleberg

3

বেস 64৪ টি চিত্রটি যাচাই করতে আমরা এই রেজেক্স ব্যবহার করতে পারি

/ ^ ডেটা: চিত্র / (?: gif | png | jpeg | বিএমপি | ওয়েবপি) (?: চরসেট = utf-8)?; বেস 64, (?: [এ-জা-জে0-9] | [+ /] ) + = {0,2

  private validBase64Image(base64Image: string): boolean {
    const regex = /^data:image\/(?:gif|png|jpeg|bmp|webp)(?:;charset=utf-8)?;base64,(?:[A-Za-z0-9]|[+/])+={0,2}/;
    return base64Image && regex.test(base64Image);
  }

0

এখানে একটি বিকল্প নিয়মিত প্রকাশ:

^(?=(.{4})*$)[A-Za-z0-9+/]*={0,2}$

এটি নিম্নলিখিত শর্তগুলি সন্তুষ্ট করে:

  • স্ট্রিংয়ের দৈর্ঘ্য চারটির একাধিক হতে হবে - (?=^(.{4})*$)
  • সামগ্রীটি অবশ্যই বর্ণানুক্রমিক অক্ষর বা + বা / - হতে হবে [A-Za-z0-9+/]*
  • এর শেষে দুটি প্যাডিং (=) অক্ষর থাকতে পারে - ={0,2}
  • এটি খালি স্ট্রিং গ্রহণ করে

0

এখন পর্যন্ত উপস্থাপিত উত্তরগুলি ব্যাস 64 স্ট্রিংয়ের সমস্ত প্যাড বিট 0 তে সেট করা আছে কিনা তা পরীক্ষা করতে ব্যর্থ হয়েছে, এটি বেস 64 এর নীতিগত উপস্থাপনা হওয়ার জন্য প্রয়োজন (যা কিছু পরিবেশে গুরুত্বপূর্ণ, https://tools.ietf.org/ দেখুন HTML / rfc4648 # অধ্যায়-3.5 ) এবং সেইজন্য তারা অনুমতি alias লেখা যে একই বাইনারি স্ট্রিং এর জন্য বিভিন্ন এনকোডিং হয়। এটি কিছু অ্যাপ্লিকেশনগুলিতে সুরক্ষা সমস্যা হতে পারে।

এখানে রেজিপ্সপ যাচাই করে যে প্রদত্ত স্ট্রিংটি কেবল বৈধ বেস 64 নয়, বাইনারি ডেটার জন্য ক্যানোনিকাল বেস 64 স্ট্রিংও রয়েছে:

^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/][AQgw]==|[A-Za-z0-9+/]{2}[AEIMQUYcgkosw048]=)?$

উদ্ধৃত আরএফসি খালি স্ট্রিংটিকে বৈধ হিসাবে বিবেচনা করে ( https://tools.ietf.org/html/rfc4648#section-10 দেখুন ) সুতরাং উপরের রেজেক্সটিও তা করে।

বেস 6464 এর জন্য সমান নিয়মিত অভিব্যক্তি (আবার উপরের আরএফসিটি দেখুন):

^(?:[A-Za-z0-9_-]{4})*(?:[A-Za-z0-9_-][AQgw]==|[A-Za-z0-9_-]{2}[AEIMQUYcgkosw048]=)?$
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.