কীভাবে সঠিকভাবে পিএইচপি ব্যবহার করে ক্রস-সাইট অনুরোধ জালিয়াতি (সিএসআরএফ) টোকেন যুক্ত করবেন


98

আমি আমার ওয়েবসাইটে ফর্মগুলিতে কিছু সুরক্ষা যুক্ত করার চেষ্টা করছি। ফর্মগুলির একটিতে এজেএক্স ব্যবহার করা হয় এবং অন্যটি একটি সোজা "আমাদের সাথে যোগাযোগ করুন" ফর্ম। আমি একটি সিএসআরএফ টোকেন যুক্ত করার চেষ্টা করছি। আমার যে সমস্যা হচ্ছে তা হ'ল টোকেনটি কেবলমাত্র কিছু সময় এইচটিএমএল "মান" এ প্রদর্শিত হচ্ছে। বাকি সময়, মান খালি। আমি আজ্যাক ফর্মটিতে যে কোডটি ব্যবহার করছি তা এখানে:

পিএইচপি:

if (!isset($_SESSION)) {
    session_start();
$_SESSION['formStarted'] = true;
}
if (!isset($_SESSION['token']))
{$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;

}

এইচটিএমএল

 <form>
//...
<input type="hidden" name="token" value="<?php echo $token; ?>" />
//...
</form>

কোনও পরামর্শ?


শুধু কৌতূহল, কি token_timeজন্য ব্যবহার করা হয়?
zerkms

@zerkms আমি বর্তমানে ব্যবহার করছি না token_time। আমি সেই সময়ের মধ্যে সীমাবদ্ধ করতে যাচ্ছিলাম যার মধ্যে একটি টোকেন বৈধ, তবে এখনও কোডটি পুরোপুরি প্রয়োগ করা হয়নি। স্পষ্টতার স্বার্থে, আমি এটি উপরের প্রশ্ন থেকে সরিয়েছি।
কেন

4
@ কেন: সুতরাং ব্যবহারকারী যখন কোনও ফর্ম খোলেন, পোস্ট করতে পারেন এবং অবৈধ টোকেন পাবেন তখন কেসটি পেতে পারেন? (যেহেতু এটি অবৈধ করা হয়েছে)
জের্কम्स

@ জারকিমস: আপনাকে ধন্যবাদ, তবে আমি একটু বিভ্রান্ত কোন সুযোগ আপনি আমাকে একটি উদাহরণ দিতে পারে?
কেন

4
@ কেন: নিশ্চিত ধরা যাক টোকেন সকাল 10:00 টায় শেষ হবে। এখন সকাল 09:59। ব্যবহারকারী একটি ফর্ম খোলেন এবং একটি টোকেন পান (যা এখনও বৈধ)। তারপরে ব্যবহারকারী 2 মিনিটের জন্য ফর্মটি পূরণ করে এবং প্রেরণ করে। যতক্ষণ না এখন সকাল ১০:১০ হয় - টোকেনটিকে অবৈধ হিসাবে বিবেচনা করা হয়, সুতরাং ব্যবহারকারী ফর্ম ত্রুটি পান।
zerkms

উত্তর:


298

সুরক্ষা কোডের জন্য, দয়া করে আপনার টোকেনগুলি এইভাবে উত্পন্ন করবেন না: $token = md5(uniqid(rand(), TRUE));

এটি ব্যবহার করে দেখুন:

একটি সিএসআরএফ টোকেন তৈরি করা হচ্ছে

পিএইচপি 7

session_start();
if (empty($_SESSION['token'])) {
    $_SESSION['token'] = bin2hex(random_bytes(32));
}
$token = $_SESSION['token'];

সিডিনোট: আমার নিয়োগকর্তার একটি ওপেন সোর্স প্রকল্প ব্যাকপোর্টের উদ্যোগ random_bytes()এবংrandom_int() পিএইচপি 5 প্রকল্পে প্রবেশের । এটি এমআইটি লাইসেন্সধারী এবং প্যারাগনি / র্যান্ডম_কম্প্যাট হিসাবে গিথুব এবং সুরকারে উপলভ্য

পিএইচপি 5.3+ (বা এক্সক্রিপশন সহ)

session_start();
if (empty($_SESSION['token'])) {
    if (function_exists('mcrypt_create_iv')) {
        $_SESSION['token'] = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));
    } else {
        $_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(32));
    }
}
$token = $_SESSION['token'];

সিএসআরএফ টোকেন যাচাই করা হচ্ছে

শুধু ব্যবহার করবেন না ==বা এমনকি ===, ব্যবহার hash_equals()(পিএইচপি 5.6+ শুধুমাত্র কিন্তু পূর্ববর্তী সংস্করণে উপলব্ধ হ্যাশ-compat গ্রন্থাগার)।

if (!empty($_POST['token'])) {
    if (hash_equals($_SESSION['token'], $_POST['token'])) {
         // Proceed to process the form data
    } else {
         // Log this as a warning and keep an eye on these attempts
    }
}

প্রতি-ফর্ম টোকেনের সাথে আরও এগিয়ে যাওয়া

আপনি টোকেনগুলি কেবলমাত্র নির্দিষ্ট ফর্মের জন্য ব্যবহার করে সীমাবদ্ধ রাখতে পারেন hash_hmac() । এইচএমএসি একটি নির্দিষ্ট কীড হ্যাশ ফাংশন যা ব্যবহার করা নিরাপদ এমনকি দুর্বল হ্যাশ ফাংশন (যেমন এমডি 5) সহ। যাইহোক, আমি পরিবর্তে SHA-2 পরিবার হ্যাশ ফাংশনগুলির ব্যবহার করার পরামর্শ দিচ্ছি।

প্রথমে এইচএমএসি কী হিসাবে ব্যবহারের জন্য দ্বিতীয় টোকেন তৈরি করুন, তারপরে এটি রেন্ডার করার জন্য এই জাতীয় যুক্তি ব্যবহার করুন:

<input type="hidden" name="token" value="<?php
    echo hash_hmac('sha256', '/my_form.php', $_SESSION['second_token']);
?>" />

এবং তারপরে টোকেন যাচাই করার সময় একটি সম্মিলিত অপারেশন ব্যবহার করুন:

$calc = hash_hmac('sha256', '/my_form.php', $_SESSION['second_token']);
if (hash_equals($calc, $_POST['token'])) {
    // Continue...
}

এক ফর্মের জন্য উত্পন্ন টোকেনগুলি না জেনে অন্য প্রসঙ্গে পুনরায় ব্যবহার করা যাবে না $_SESSION['second_token']আপনি কেবলমাত্র পৃষ্ঠায় যেটি ফেলেছেন তার চেয়ে আলাদা এইচএমএএসি কী হিসাবে আলাদা টোকেন ব্যবহার করা গুরুত্বপূর্ণ।

বোনাস: হাইব্রিড অ্যাপ্রোচ + টুইগ ইন্টিগ্রেশন

যে কেউ টুইগ টেম্পলেটিং ইঞ্জিন ব্যবহার করেন তারা এই টুইটার পরিবেশে এই ফিল্টারটি যুক্ত করে একটি সরল দ্বৈত কৌশল থেকে উপকৃত হতে পারেন:

$twigEnv->addFunction(
    new \Twig_SimpleFunction(
        'form_token',
        function($lock_to = null) {
            if (empty($_SESSION['token'])) {
                $_SESSION['token'] = bin2hex(random_bytes(32));
            }
            if (empty($_SESSION['token2'])) {
                $_SESSION['token2'] = random_bytes(32);
            }
            if (empty($lock_to)) {
                return $_SESSION['token'];
            }
            return hash_hmac('sha256', $lock_to, $_SESSION['token2']);
        }
    )
);

এই টুইগ ফাংশনটি দিয়ে আপনি সাধারণ উদ্দেশ্য টোকেন উভয়ই ব্যবহার করতে পারেন:

<input type="hidden" name="token" value="{{ form_token() }}" />

বা লকড ডাউন বৈকল্পিক:

<input type="hidden" name="token" value="{{ form_token('/my_form.php') }}" />

টুইগ কেবলমাত্র টেম্পলেট রেন্ডারিংয়ের সাথে সম্পর্কিত; আপনার এখনও টোকেনগুলি সঠিকভাবে বৈধ করতে হবে। আমার মতে, টুইগ কৌশলটি সর্বাধিক সুরক্ষার সম্ভাবনা বজায় রেখে বৃহত্তর নমনীয়তা এবং সরলতার প্রস্তাব দেয়।


একক-ব্যবহার সিএসআরএফ টোকেন

আপনার যদি কোনও সুরক্ষা প্রয়োজনীয়তা থাকে যে প্রতিটি সিএসআরএফ টোকেনকে ঠিক একবার ব্যবহার করার অনুমতি দেওয়া হয় তবে সহজতম কৌশলটি প্রতিটি সফল বৈধতার পরে এটি পুনরুত্থান করে। তবে এটি করার ফলে পূর্ববর্তী প্রতিটি টোকেন অকার্যকর হয়ে যায় যা একসাথে একাধিক ট্যাব ব্রাউজ করে এমন লোকদের সাথে ভাল মেশে না।

প্যারাগন ইনিশিয়েটিভ এন্টারপ্রাইজগুলি এই কোণার ক্ষেত্রে অ্যান্টি-সিএসআরএফ লাইব্রেরি বজায় রাখে । এটি একচেটিয়াভাবে প্রতি-ফর্ম টোকেনগুলির এক-ব্যবহারের সাথে কাজ করে। যখন পর্যাপ্ত টোকেনগুলি সেশন ডেটাতে সংরক্ষণ করা হয় (ডিফল্ট কনফিগারেশন: 65535), এটি প্রথমে পুরানো অবিশ্বাস্য টোকেনকে সরিয়ে ফেলবে।


দুর্দান্ত, তবে ব্যবহারকারী ফর্ম জমা দেওয়ার পরে কীভাবে টোকেন পরিবর্তন করবেন? আপনার ক্ষেত্রে, একটি টোকেন ব্যবহারকারী সেশনের জন্য ব্যবহৃত।
আকাম

4
কীভাবে github.com/paragonie/anti-csrf প্রয়োগ করা হয় তা নিবিড়ভাবে দেখুন । টোকেনগুলি একক-ব্যবহার, তবে এটি একাধিক সঞ্চয় করে।
স্কট আর্কিসজেউস্কি

@ স্কটআরকিসজেউসকি সেশন আইডি থেকে কোনও বার্তা একটি গোপনের সাথে ডাইজেস্ট উত্পন্ন করার বিষয়ে কী মনে করেন এবং তারপরে আমার পূর্ববর্তী গোপনীয়তার সাথে সেশন আইডি হ্যাশ করার সাথে সাথে প্রাপ্ত সিএসআরএফ টোকেন ডাইজেস্টের তুলনা করেন? আশাকরি আমি কি বলছি তুমি তা বুঝতে পারছ.
এমএনআর

4
সিএসআরএফ টোকেন যাচাই করা সম্পর্কে আমার একটি প্রশ্ন আছে। আমি যদি $ _POST ['টোকেন'] খালি থাকে তবে আমাদের এগিয়ে যাওয়া উচিত নয়, কারণ এই পোস্টের অনুরোধটি টোকেন ছাড়াই প্রেরণ করা হয়েছিল, তাই না?
হিরোকি

4
কারণ এটি এইচটিএমএল আকারে প্রতিধ্বনিত হতে চলেছে এবং আপনি এটি অনির্দেশ্য হতে চান যাতে আক্রমণকারীরা কেবল এটি তৈরি করতে পারে না। আপনি এখানে সত্যই চ্যালেঞ্জ-প্রতিক্রিয়া প্রমাণীকরণ বাস্তবায়ন করছেন, কেবল "হ্যাঁ এই ফর্মটি বৈধ" না কারণ কোনও আক্রমণকারী কেবল এটির ছলনা করতে পারে।
স্কট আর্কিসজেউস্কি

24

সুরক্ষা সতর্কতা : md5(uniqid(rand(), TRUE))এলোমেলো সংখ্যা উত্পন্ন করার নিরাপদ উপায় নয়। আরও তথ্যের জন্য এই উত্তরটি দেখুন এবং এমন কোনও সমাধানের জন্য যা কোনও ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত এলোমেলো নম্বর জেনারেটরকে সহায়তা করে।

দেখে মনে হচ্ছে আপনার যদি আপনার সাথে অন্য কোনও দরকার হয়।

if (!isset($_SESSION['token'])) {
    $token = md5(uniqid(rand(), TRUE));
    $_SESSION['token'] = $token;
    $_SESSION['token_time'] = time();
}
else
{
    $token = $_SESSION['token'];
}

11
দ্রষ্টব্য: আমি md5(uniqid(rand(), TRUE));সুরক্ষা প্রসঙ্গে বিশ্বাস করব না।
স্কট আর্কিজেসউস্কি

2

ভেরিয়েবলটি $tokenসেশনটিতে থাকাকালীন পুনরুদ্ধার করা হচ্ছে না

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