অতিরিক্ত HTTP অনুরোধ শিরোনাম যোগ করুন

HTTP অনুরোধে ব্যবহারকারী-এজেন্ট বা বিষয়বস্তুর প্রকারের মতো শিরোনাম থাকে। ব্রাউজার দ্বারা সংযুক্ত শিরোনাম ছাড়াও, Android অ্যাপগুলি অতিরিক্ত শিরোনাম যোগ করতে পারে, যেমন কুকি বা রেফারার EXTRA_HEADERS ইন্টেন্ট অতিরিক্তের মাধ্যমে৷ নিরাপত্তার কারণে, কিভাবে এবং কোথায় একটি উদ্দেশ্য চালু করা হয়েছে তার উপর নির্ভর করে Chrome কিছু অতিরিক্ত শিরোনাম ফিল্টার করে।

ক্রস-অরিজিন অনুরোধের জন্য নিরাপত্তার একটি অতিরিক্ত স্তর প্রয়োজন কারণ ক্লায়েন্ট এবং সার্ভার একই পক্ষের মালিকানাধীন নয়। এই নির্দেশিকাটি Chrome কাস্টম ট্যাবগুলির মাধ্যমে এই ধরনের অনুরোধগুলি চালু করার বিষয়ে আলোচনা করে, অর্থাৎ ব্রাউজার ট্যাবে একটি URL খোলে এমন অ্যাপগুলি থেকে শুরু করা অভিপ্রায়গুলি৷ Chrome 83 পর্যন্ত, একটি কাস্টম ট্যাব চালু করার সময় ডেভেলপাররা যেকোনো শিরোনাম যোগ করতে পারে। সংস্করণ 83 এর পর থেকে, ক্রোম অনুমোদিত ক্রস-অরিজিন হেডার ব্যতীত সমস্ত ফিল্টার করা শুরু করেছে, যেহেতু অ-অনুমোদিত শিরোনামগুলি একটি নিরাপত্তা ঝুঁকি তৈরি করেছে৷ Chrome 86 দিয়ে শুরু করে, যখন সার্ভার এবং ক্লায়েন্ট একটি ডিজিটাল সম্পদ লিঙ্ক ব্যবহার করে সম্পর্কিত হয় তখন ক্রস-অরিজিন অনুরোধে অ-অনুমোদিত হেডার সংযুক্ত করা সম্ভব। এই আচরণটি নিম্নলিখিত টেবিলে সংক্ষিপ্ত করা হয়েছে:

ক্রোম সংস্করণ CORS হেডার অনুমোদিত
Chrome 83 এর আগে অনুমোদিত, অ-অনুমোদিত
Chrome 83 থেকে Chrome 85 অনুমোদিত
Chrome 86 থেকে অনুমোদিত, অ-অনুমোদিত যখন একটি ডিজিটাল সম্পদ লিঙ্ক সেট আপ করা হয়

সারণি 1.: অ-অনুমোদিত CORS শিরোনামগুলির ফিল্টারিং।

এই নিবন্ধটি দেখায় কিভাবে সার্ভার এবং ক্লায়েন্টের মধ্যে একটি যাচাইকৃত সংযোগ সেট আপ করতে হয় এবং অনুমোদিত এবং সেইসাথে অ-অনুমোদিত HTTP শিরোনাম পাঠাতে এটি ব্যবহার করে৷ আপনি কোডের জন্য কাস্টম ট্যাব ইন্টেন্টে অতিরিক্ত শিরোনাম যুক্ত করা এড়িয়ে যেতে পারেন।

পটভূমি

অনুমোদিত বনাম অ-অনুমোদিত CORS অনুরোধ শিরোনাম

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

হেডার বর্ণনা
গ্রহণ-ভাষা ক্লায়েন্ট বোঝে এমন প্রাকৃতিক ভাষার বিজ্ঞাপন দেয়
বিষয়বস্তু-ভাষা বর্তমান দর্শকদের জন্য অভিপ্রেত ভাষা বর্ণনা করে
বিষয়বস্তুর প্রকার সম্পদের মিডিয়া প্রকার নির্দেশ করে

সারণি 2.: উদাহরণ অনুমোদিত CORS হেডার।

অনুমোদিত শিরোনামগুলিকে নিরাপদ বলে মনে করা হয় কারণ এতে ব্যবহারকারীর সংবেদনশীল তথ্য থাকে না এবং সার্ভারের সম্ভাব্য ক্ষতিকারক ক্রিয়াকলাপগুলি সম্পাদন করার সম্ভাবনা নেই৷

অ-অনুমোদিত শিরোনামগুলির উদাহরণ নিম্নলিখিত সারণীতে দেখানো হয়েছে:

হেডার বর্ণনা
বহনকারী-টোকেন একটি সার্ভারে ক্লায়েন্টকে প্রমাণীকরণ করে
মূল অনুরোধের উত্স নির্দেশ করে
কুকি সার্ভার দ্বারা সেট করা কুকিজ রয়েছে

সারণি 3.: নন-অনুমোদিত CORS হেডারের উদাহরণ।

CORS অনুরোধে অ-অনুমোদিত শিরোনাম সংযুক্ত করা HTML মান দ্বারা নিরুৎসাহিত করা হয় এবং সার্ভারগুলি অনুমান করে যে ক্রস-অরিজিন অনুরোধগুলিতে শুধুমাত্র অনুমোদিত শিরোনাম রয়েছে৷ ক্রস-অরিজিন ডোমেনগুলি থেকে অ-অনুমোদিত শিরোনামগুলি পাঠানোর ফলে ক্ষতিকারক তৃতীয় পক্ষের অ্যাপগুলিকে শিরোনাম তৈরি করার অনুমতি দেবে যা ব্যবহারকারীর কুকিগুলিকে অপব্যবহার করে যা Chrome (বা অন্য ব্রাউজার) অনুরোধে সঞ্চয় করে এবং সংযুক্ত করে৷ কুকিজ দূষিত সার্ভার লেনদেন প্রমাণীকরণ করতে পারে যা অন্যথায় সম্ভব হবে না।

কাস্টম ট্যাব অনুরোধে CORS অনুমোদিত হেডার সংযুক্ত করা হচ্ছে

কাস্টম ট্যাবগুলি একটি কাস্টমাইজড ব্রাউজার ট্যাবে ওয়েব পৃষ্ঠাগুলি চালু করার একটি বিশেষ উপায়৷ CustomTabsIntent.Builder() ব্যবহার করে কাস্টম ট্যাব ইন্টেন্ট তৈরি করা যেতে পারে। আপনি Browser.EXTRA_HEADERS পতাকা সহ একটি Bundle ব্যবহার করে এই উদ্দেশ্যগুলির সাথে শিরোনামগুলি সংযুক্ত করতে পারেন:

CustomTabsIntent intent = new CustomTabsIntent.Builder(session).build();

Bundle headers = new Bundle();
headers.putString("bearer-token", "Some token");
headers.putString("redirect-url", "Some redirect url");   
intent.intent.putExtra(Browser.EXTRA_HEADERS, headers);

intent.launchUrl(Activity.this, Uri.parse("http://www.google.com"));

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

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

কাস্টম ট্যাব ইন্টেন্টে অতিরিক্ত হেডার যোগ করা হচ্ছে

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

একটি ডিজিটাল সম্পদ লিঙ্ক সেট আপ করতে অফিসিয়াল গাইড অনুসরণ করুন. লিঙ্ক সম্পর্কের জন্য "delegate_permission/common.use_as_origin"` ব্যবহার করুন যা নির্দেশ করে যে লিঙ্কটি যাচাই করা হলে উভয় অ্যাপই একই উৎসের।

অতিরিক্ত শিরোনাম সহ কাস্টম ট্যাব অভিপ্রায় তৈরি করুন

একটি কাস্টম ট্যাব অভিপ্রায় তৈরি করার একাধিক উপায় রয়েছে৷ আপনি বিল্ড নির্ভরতাগুলিতে লাইব্রেরি যোগ করে অ্যান্ড্রয়েডএক্সে উপলব্ধ বিল্ডার ব্যবহার করতে পারেন:

implementation 'androidx.browser:browser:1.2.0'

অভিপ্রায় তৈরি করুন এবং অতিরিক্ত শিরোনাম যোগ করুন:

CustomTabsIntent constructExtraHeadersIntent(CustomTabsSession session) {
    CustomTabsIntent intent = new CustomTabsIntent.Builder(session).build();

    // Example non-cors-approvelisted headers.
    Bundle headers = new Bundle();
    headers.putString("bearer-token", "Some token");
    headers.putString("redirect-url", "Some redirect url");
    intent.intent.putExtra(Browser.EXTRA_HEADERS, headers);
    return intent;
}

একটি কাস্টম ট্যাব সংযোগ অ্যাপ এবং Chrome ট্যাবের মধ্যে একটি CustomTabsSession সেট আপ করার জন্য ব্যবহৃত হয়৷ অ্যাপ এবং ওয়েব অ্যাপ একই উৎসের কিনা তা যাচাই করার জন্য আমাদের সেশনের প্রয়োজন। ডিজিটাল সম্পদের লিঙ্কগুলি সঠিকভাবে সেট আপ করা থাকলেই কেবলমাত্র যাচাইকরণ পাস হয়৷

CustomTabsClient.warmup() কল করতে উৎসাহিত করা হচ্ছে। এটি ব্রাউজার অ্যাপ্লিকেশনটিকে পটভূমিতে প্রাক-সূচনা করতে এবং URL খোলার প্রক্রিয়াটিকে গতিশীল করতে দেয়।

// Set up a connection that warms up and validates a session.
CustomTabsServiceConnection connection = new CustomTabsServiceConnection() {
    @Override
    public void onCustomTabsServiceConnected(@NonNull ComponentName name, 
        @NonNull CustomTabsClient client) {
        // Create session after service connected.
        mSession = client.newSession(callback);
        client.warmup(0);
        // Validate the session as the same origin to allow cross origin headers.
        mSession.validateRelationship(CustomTabsService.RELATION_USE_AS_ORIGIN, 
            Uri.parse(url), null);
    }
    @Override
    public void onServiceDisconnected(ComponentName componentName) { }
};

একটি কলব্যাক সেট আপ করুন যা বৈধকরণের পরে অভিপ্রায় চালু করে

সেশনে CustomTabsCallback পাস করা হয়েছে। আমরা এটির onRelationshipValidationResult() সেট আপ করি পূর্বে তৈরি করা CustomTabsIntent চালু করার জন্য একবার অরিজিন যাচাইকরণ সফল হয়।

// Set up a callback that launches the intent after session validated.
CustomTabsCallback callback = new CustomTabsCallback() {
    @Override
    public void onRelationshipValidationResult(int relation, @NonNull Uri requestedOrigin, 
        boolean result, @Nullable Bundle extras) {
        // Launch custom tabs intent after session was validated as the same origin.
        CustomTabsIntent intent = constructExtraHeadersIntent(mSession);
        intent.launchUrl(MainActivity.this, Uri.parse(url));
    }
};

কাস্টম ট্যাব পরিষেবা সংযোগ আবদ্ধ করুন

পরিষেবাটিকে আবদ্ধ করলে পরিষেবাটি চালু হয় এবং সংযোগের onCustomTabsServiceConnected() অবশেষে বলা হবে৷ পরিষেবাটি যথাযথভাবে আনবাইন্ড করতে ভুলবেন না। বাইন্ডিং এবং আনবাইন্ডিং সাধারণত onStart() এবং onStop() কার্যকলাপ জীবনচক্র পদ্ধতিতে করা হয়।

// Bind the custom tabs service connection.
// Call this in onStart()
CustomTabsClient.bindCustomTabsService(this,
    CustomTabsClient.getPackageName(MainActivity.this, null), connection);

// …
// Unbind the custom tabs service.
// Call this in onStop().
unbindService(connection);

ডেমো অ্যাপ্লিকেশন কোড

আপনি এখানে কাস্টম ট্যাব পরিষেবা সম্পর্কে আরও বিশদ জানতে পারেন৷ একটি কাজের উদাহরণ অ্যাপের জন্য অ্যান্ড্রয়েড-ব্রাউজার-হেল্পার গিটহাব রিপোজিটরি দেখুন।

সারাংশ

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