ما هي بدائل الأحرف التي يجب إجراؤها لجعل عنوان URL للتشفير الأساسي 64 آمنًا؟

StackOverflow https://stackoverflow.com/questions/1412391

سؤال

عند النظر إلى ترميز URL الآمن 64، وجدت أنه شيء غير قياسي على الإطلاق.على الرغم من العدد الكبير من الوظائف المضمنة في PHP، لا توجد واحدة لتشفير URL الآمن الأساسي 64.في الصفحة اليدوية ل base64_encode(), ، تقترح معظم التعليقات استخدام تلك الوظيفة المغلفة بـ strtr():

function base64_url_encode($input)
{
     return strtr(base64_encode($input), '+/=', '-_,');
}

وحدة Perl الوحيدة التي يمكنني العثور عليها في هذا المجال هي MIME::Base64::URLSafe (مصدر)، الذي يقوم بالاستبدال التالي داخليًا:

sub encode ($) {
    my $data = encode_base64($_[0], '');
    $data =~ tr|+/=|\-_|d;
    return $data;
}

على عكس وظيفة PHP المذكورة أعلاه، فإن إصدار Perl هذا يحذف الحرف '=' (يساوي) بالكامل، بدلاً من استبداله بـ '،' (فاصلة) كما تفعل PHP.يساوي هو حرف حشو، لذا فإن وحدة Perl تستبدله حسب الحاجة عند فك التشفير، ولكن هذا الاختلاف يجعل التطبيقين غير متوافقين.

وأخيرا، وظيفة بايثون urlsafe_b64encode(s) يحتفظ بالحشوة "=" حوله، مما يدفع شخصًا ما إلى طرحه هذه الوظيفة لإزالة الحشوة التي تظهر بشكل بارز في نتائج Google لـ "عنوان url الآمن لـ Python base64":

from base64 import urlsafe_b64encode, urlsafe_b64decode

def uri_b64encode(s):
    return urlsafe_b64encode(s).strip('=')

def uri_b64decode(s):
    return urlsafe_b64decode(s + '=' * (4 - len(s) % 4))

الرغبة هنا هي الحصول على سلسلة يمكن تضمينها في عنوان URL دون مزيد من التشفير، وبالتالي التخلص من أو ترجمة الأحرف '+' و'/' و'='.وبما أنه لا يوجد معيار محدد، ما هي الطريقة الصحيحة؟

هل كانت مفيدة؟

المحلول

يبدو أن هناك معيارًا، إنه كذلك آر إف سي 3548, ، القسم 4، التشفير الأساسي 64 باستخدام عنوان URL والأبجدية الآمنة لاسم الملف:

This encoding is technically identical to the previous one, except for the 62:nd and 63:rd alphabet character, as indicated in table 2.

+ و / ينبغي استبداله ب - (minus) و _ (understrike) على التوالى.يجب تغليف أي مكتبات غير متوافقة بحيث تتوافق مع RFC 3548.

لاحظ أن هذا يتطلب أن تقوم بتشفير عنوان URL لملف (pad) = الأحرف، لكنني أفضل ذلك على ترميز URL + و / أحرف من الأبجدية Base64 القياسية.

نصائح أخرى

لا أعتقد أن هناك صواب أو خطأ.ولكن الترميز الأكثر شعبية هو

'+/=' => '-_.'

يتم استخدام هذا على نطاق واسع بواسطة Google وYahoo (يسمونه Y64).الإصدار الأكثر أمانًا لعناوين URL من برامج التشفير التي استخدمتها في Java، يدعم Ruby مجموعة الأحرف هذه.

أقترح تشغيل إخراج base64_encode من خلال urlencode.على سبيل المثال:

function base64_encode_url( $str )
{
    return urlencode( base64_encode( $str ) );
}

إذا كنت تسأل عن الطريقة الصحيحة، فسأختار ترميز URL المناسب بدلاً من الاستبدال التعسفي للأحرف.قم أولاً بتشفير بياناتك باستخدام base64، ثم قم بتشفير الأحرف الخاصة مثل "=" باستخدام ترميز URL المناسب (أي: %<code>).

لماذا لا تحاول تغليفه في ملف urlencode()؟توثيق هنا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top