সত্যতা টোকেন ক্রস-সাইট অনুরোধ জালিয়াতি আক্রমণ (সিএসআরএফ) প্রতিরোধ করতে ব্যবহৃত হয়। সত্যতা টোকেন বুঝতে, আপনাকে প্রথমে সিএসআরএফ আক্রমণ বুঝতে হবে।
CSRF
মনে করুন আপনি এর লেখক bank.com
। আপনার সাইটে আপনার একটি ফর্ম রয়েছে যা একটি জিইটি অনুরোধের সাথে অন্য অ্যাকাউন্টে অর্থ স্থানান্তর করতে ব্যবহৃত হয়:
একজন হ্যাকার কেবল এইচটিটিপি অনুরোধটি সার্ভারে প্রেরণ করতে পেরেছিল GET /transfer?amount=$1000000&account-to=999999
, তাই না?
ভুল। হ্যাকারদের আক্রমণ কাজ করবে না। সার্ভারটি কি মূলত ভাববে?
তাই না? এই লোকটি কে হস্তান্তর শুরু করার চেষ্টা করছে? এটি অ্যাকাউন্টের মালিক নয়, এটি অবশ্যই।
সার্ভার এটি কীভাবে জানতে পারে? কারণ সেখানে কোনও session_id
কুকি নেই যাঁকে অনুরোধকারী প্রমাণীকরণ করে।
আপনি যখন আপনার ব্যবহারকারী নাম এবং পাসওয়ার্ড দিয়ে সাইন ইন করেন, সার্ভারটি session_id
আপনার ব্রাউজারে একটি কুকি সেট করে। এইভাবে, আপনাকে প্রতিটি ব্যবহারকারীর নাম এবং পাসওয়ার্ড দিয়ে প্রমাণীকরণ করতে হবে না। যখন আপনার ব্রাউজার session_id
কুকি পাঠায় , সার্ভারটি জানে:
ওহ, জন ড। আড়াই মিনিট আগে তিনি সফলভাবে সাইন ইন করেছেন। তিনি যেতে ভাল।
একজন হ্যাকার ভাবতে পারে:
হুম। একটি সাধারণ এইচটিটিপি অনুরোধ কাজ করবে না, তবে আমি যদি সেই session_id
কুকিতে হাত পেতে পারি , তবে আমি সোনালী হয়ে যাব।
ব্যবহারকারীদের ব্রাউজারে bank.com
ডোমেনের জন্য সেট কুকিজ রয়েছে । প্রতিবার ব্যবহারকারী ডোমেনটিতে একটি অনুরোধ জানান bank.com
, সমস্ত কুকিজই পাঠানো হয়। session_id
কুকি সহ ।
সুতরাং যদি কোনও হ্যাকার আপনাকে তার অ্যাকাউন্টে অর্থ স্থানান্তর করার জন্য জিইটি অনুরোধ করতে পারে তবে তিনি সফল হতে পারবেন। কীভাবে সে আপনাকে এমনভাবে চালিত করতে পারে? ক্রস সাইটের অনুরোধ জালিয়াতির সাথে।
এটা আসলে খুব সহজ। হ্যাকার আপনাকে কেবল তার ওয়েবসাইটে দেখার জন্য পেতে পারে। তার ওয়েবসাইটে, তিনি নিম্নলিখিত চিত্র ট্যাগ থাকতে পারে:
<img src="http://bank.com/transfer?amount=$1000000&account-to=999999">
যখন ব্যবহারকারীদের ব্রাউজারটি সেই চিত্র ট্যাগ জুড়ে আসে তখন এটি সেই ইউআরএলটিতে একটি জিইটি অনুরোধ জানাবে। এবং যেহেতু অনুরোধটি তার ব্রাউজার থেকে আসে, এটি এর সাথে সম্পর্কিত সমস্ত কুকিজ পাঠিয়ে দেবে bank.com
। যদি ব্যবহারকারী সম্প্রতি সাইন ইন করে থাকে bank.com
... session_id
কুকি সেট হয়ে যাবে, এবং সার্ভারটি মনে করবে যে ব্যবহারকারী মানে 999999 অ্যাকাউন্টে $ 1,000,000 স্থানান্তরিত করবে!
ঠিক আছে, কেবল বিপজ্জনক সাইটগুলি পরিদর্শন করবেন না এবং আপনি ভাল থাকবেন।
এটি যথেষ্ট নয়। কেউ যদি ছবিটি ফেসবুকে পোস্ট করে এবং এটি আপনার দেয়ালে উপস্থিত হয় তবে কী হবে? আপনি যদি কোনও এক্সএস আক্রমণে ভিজিট করছেন এমন কোনও সাইটে এটি ইনজেকশন দেওয়া হয় তবে কী হবে?
এটি অতটা খারাপ না. কেবল জিইটি অনুরোধগুলিই দুর্বল।
সত্য না. একটি ফর্ম যা একটি পোষ্ট অনুরোধ প্রেরণ করে তা গতিশীলভাবে উত্পন্ন করা যেতে পারে। সুরক্ষা সম্পর্কিত রেল গাইডের উদাহরণ এখানে :
<a href="http://www.harmless.com/" onclick="
var f = document.createElement('form');
f.style.display = 'none';
this.parentNode.appendChild(f);
f.method = 'POST';
f.action = 'http://www.example.com/account/destroy';
f.submit();
return false;">To the harmless survey</a>
সত্যতা টোকেন
যখন আপনার ApplicationController
এটি আছে:
protect_from_forgery with: :exception
এই:
<%= form_tag do %>
Form contents
<% end %>
এটিতে সংকলিত হয়:
<form accept-charset="UTF-8" action="/" method="post">
<input name="utf8" type="hidden" value="✓" />
<input name="authenticity_token" type="hidden" value="J7CBxfHalt49OSHp27hblqK20c9PgwJ108nDHX/8Cts=" />
Form contents
</form>
বিশেষত, নিম্নলিখিত উত্পন্ন হয়:
<input name="authenticity_token" type="hidden" value="J7CBxfHalt49OSHp27hblqK20c9PgwJ108nDHX/8Cts=" />
সিএসআরএফ আক্রমণ থেকে রক্ষা করতে, যদি রেলগুলি একটি অনুরোধের সাথে প্রেরিত সত্যতা টোকেন না দেখে, তবে এটি অনুরোধটিকে নিরাপদ মনে করবে না।
এই টোকেনটি কী তা কোনও আক্রমণকারীকে কীভাবে জানতে হবে? প্রতিটি সময় ফর্মটি তৈরি করার সময় এলোমেলোভাবে একটি আলাদা মান উত্পন্ন হয়:
একটি ক্রস সাইট স্ক্রিপ্টিং (এক্সএসএস) আক্রমণ - এটিই। তবে এটি একটি ভিন্ন দিনের জন্য একটি আলাদা দুর্বলতা।