PHP register_globals প্যারামিটার সক্রিয় করা কেন বিপজ্জনক? পিএইচপি এবং মাইএসকিউএল নৈর্ব্যক্তিক সূচক পিএইচপি রেজিস্টারে একটি সাধারণ ব্যবহারকারী নিবন্ধন সিস্টেম তৈরি করা

হ্যালো! এখন আমরা PHP + MySQL ব্যবহার করে সাইটে সহজতম নিবন্ধন বাস্তবায়ন করার চেষ্টা করব। এটি করার জন্য, অ্যাপাচি আপনার কম্পিউটারে ইনস্টল করা আবশ্যক। আমাদের স্ক্রিপ্টের কাজের নীতি নীচে দেখানো হয়েছে।

1. ডাটাবেসে একটি ব্যবহারকারী টেবিল তৈরি করে শুরু করা যাক। এতে ব্যবহারকারীর ডেটা (লগইন এবং পাসওয়ার্ড) থাকবে। আসুন phpmyadmin এ যাই (যদি আপনি আপনার পিসিতে একটি ডাটাবেস তৈরি করেন http://localhost/phpmyadmin/) আমরা একটি টেবিল ব্যবহারকারী তৈরি করি, এতে 3টি ক্ষেত্র থাকবে।

আমি এটি mysql ডাটাবেসে তৈরি করি, আপনি এটি অন্য ডাটাবেসে তৈরি করতে পারেন। এরপরে, চিত্রের মতো মানগুলি সেট করুন:

2. এই টেবিলের সাথে একটি সংযোগ প্রয়োজন৷ আসুন একটি bd.php ফাইল তৈরি করি। এর বিষয়বস্তু:

আমার ক্ষেত্রে এটি এই মত দেখায়:

bd.php সংরক্ষণ করুন।
দারুণ! আমাদের ডাটাবেসের একটি টেবিল এবং এটির সাথে একটি সংযোগ রয়েছে। এখন আপনি একটি পৃষ্ঠা তৈরি করা শুরু করতে পারেন যেখানে ব্যবহারকারীরা তাদের ডেটা ছেড়ে যাবে।

3. বিষয়বস্তু সহ একটি reg.php ফাইল তৈরি করুন (ভিতরের সমস্ত মন্তব্য):



নিবন্ধন


নিবন্ধন


আপনার লগইন:




আপনার পাসওয়ার্ড:








4. একটি ফাইল তৈরি করুন যা ডাটাবেসে ডেটা প্রবেশ করবে এবং ব্যবহারকারীকে সংরক্ষণ করবে। save_user.php (ভিতরে মন্তব্য):

5. এখন আমাদের ব্যবহারকারীরা নিবন্ধন করতে পারেন! এর পরে, ইতিমধ্যে নিবন্ধিত ব্যবহারকারীদের সাইটে প্রবেশ করার জন্য আপনাকে একটি "দরজা" তৈরি করতে হবে। index.php (ভিতরে মন্তব্য):




হোম পেজ


হোম পেজ


আপনার লগইন:


আপনার পাসওয়ার্ড:






নিবন্ধন



ঠিক আছে এখন সব শেষ! পাঠ বিরক্তিকর হতে পারে, কিন্তু খুব দরকারী. শুধুমাত্র রেজিস্ট্রেশনের ধারণাটি এখানে দেখানো হয়েছে, তারপরে আপনি এটিকে উন্নত করতে পারেন: নিরাপত্তা, নকশা, ডেটা ক্ষেত্র, অবতার লোড করা, আপনার অ্যাকাউন্ট থেকে লগ আউট করা (এটি করার জন্য, আনসেট ফাংশন সহ সেশন থেকে কেবল ভেরিয়েবলগুলি ধ্বংস করুন) এবং শীঘ্রই. শুভকামনা!

আমি সবকিছু পরীক্ষা করে দেখেছি, এটি সঠিকভাবে কাজ করে!

Reg.ru: ডোমেইন এবং হোস্টিং

রাশিয়ার বৃহত্তম রেজিস্ট্রার এবং হোস্টিং প্রদানকারী।

সেবায় 2 মিলিয়নেরও বেশি ডোমেইন নাম।

প্রচার, ডোমেইন মেল, ব্যবসা সমাধান.

বিশ্বজুড়ে 700 হাজারেরও বেশি গ্রাহক ইতিমধ্যে তাদের পছন্দ করেছেন।

* স্ক্রলিং বিরাম দিতে মাউস ওভার করুন।

পিছনে এগিয়ে

পিএইচপি এবং মাইএসকিউএল-এ একটি সাধারণ ব্যবহারকারী নিবন্ধন সিস্টেম তৈরি করা

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

এবং আপনি এই সব লেখার পরেও, ব্যবহারকারীরা নিবন্ধন করতে অনিচ্ছুক হবে, কারণ... এই তাদের পক্ষ থেকে কিছু প্রচেষ্টা প্রয়োজন.

এই টিউটোরিয়ালে, আমরা একটি খুব সাধারণ রেজিস্ট্রেশন সিস্টেম তৈরি করব যাতে পাসওয়ার্ডের প্রয়োজন হয় না বা সংরক্ষণ করা হয় না! ফলাফল পরিবর্তন করা এবং বিদ্যমান পিএইচপি সাইটে যোগ করা সহজ হবে। এটি কিভাবে কাজ করে তা জানতে চান? নীচের পড়া.



আমাদের অতি সাধারণ সিস্টেমটি কীভাবে কাজ করবে তা এখানে:

আমরা অনুমোদন ফর্ম এবং নিবন্ধন একত্রিত হবে. এই ফর্মটিতে আপনার ইমেল ঠিকানা এবং একটি নিবন্ধন বোতাম প্রবেশ করার জন্য একটি ক্ষেত্র থাকবে;
- একটি ইমেল ঠিকানা দিয়ে ক্ষেত্রটি পূরণ করার সময়, নিবন্ধন বোতামে ক্লিক করা একটি নতুন ব্যবহারকারী সম্পর্কে একটি রেকর্ড তৈরি করবে, তবে শুধুমাত্র যদি প্রবেশ করা ইমেল ঠিকানাটি ডাটাবেসে পাওয়া না যায়।

এর পরে, অক্ষরের একটি এলোমেলো অনন্য সেট (টোকেন) তৈরি করা হয়, যা ব্যবহারকারীর দ্বারা নির্দিষ্ট করা ইমেলে একটি লিঙ্ক আকারে পাঠানো হয় যা 10 মিনিটের জন্য প্রাসঙ্গিক হবে;
- লিঙ্কটি ব্যবহারকারীকে আমাদের ওয়েবসাইটে নিয়ে যায়। সিস্টেম একটি টোকেনের উপস্থিতি নির্ধারণ করে এবং ব্যবহারকারীকে অনুমোদন করে;

এই পদ্ধতির সুবিধা:

পাসওয়ার্ড সংরক্ষণ বা বৈধ ক্ষেত্র কোন প্রয়োজন নেই;
- আপনার পাসওয়ার্ড, নিরাপত্তা প্রশ্ন, ইত্যাদি পুনরুদ্ধার করার কোন প্রয়োজন নেই;
- যে মুহূর্ত থেকে একজন ব্যবহারকারী নিবন্ধন/লগ ইন করেন, আপনি সর্বদা নিশ্চিত হতে পারেন যে এই ব্যবহারকারী আপনার অ্যাক্সেস জোনে থাকবে (যে ইমেল ঠিকানাটি সত্য);
- অবিশ্বাস্যভাবে সহজ নিবন্ধন প্রক্রিয়া;

ত্রুটিগুলি:

ব্যবহারকারীর অ্যাকাউন্ট নিরাপত্তা। যদি কারো ব্যবহারকারীর মেইল ​​অ্যাক্সেস থাকে, তারা লগ ইন করতে পারে।
- ইমেল নিরাপদ নয় এবং বাধা দেওয়া যেতে পারে। মনে রাখবেন যে এই প্রশ্নটি সেই ক্ষেত্রেও প্রাসঙ্গিক যেখানে পাসওয়ার্ডটি ভুলে যাওয়া হয়েছে এবং পুনরুদ্ধার করা প্রয়োজন, বা যে কোনও অনুমোদন সিস্টেমে যেটি ডেটা স্থানান্তরের জন্য HTTPS ব্যবহার করে না (লগইন/পাসওয়ার্ড);
- যখন আপনি আপনার মেল সার্ভারটি সঠিকভাবে কনফিগার করেন, তখন একটি সুযোগ রয়েছে যে অনুমোদনের লিঙ্ক সহ বার্তাগুলি স্প্যামে পরিণত হবে;

আমাদের সিস্টেমের সুবিধা এবং অসুবিধাগুলির তুলনা করে, আমরা বলতে পারি যে সিস্টেমটির উচ্চ ব্যবহারযোগ্যতা রয়েছে (শেষ ব্যবহারকারীর জন্য সর্বাধিক সুবিধা) এবং একই সময়ে, একটি কম নিরাপত্তা সূচক রয়েছে।

তাই গুরুত্বপূর্ণ তথ্যের সাথে কাজ করে না এমন ফোরাম এবং পরিষেবাগুলিতে নিবন্ধনের জন্য এটি ব্যবহার করার পরামর্শ দেওয়া হচ্ছে।

কিভাবে এই সিস্টেম ব্যবহার করতে হয়

যদি আপনার সাইটে ব্যবহারকারীদের অনুমোদন করার জন্য আপনাকে কেবল একটি সিস্টেম ব্যবহার করতে হবে এবং আপনি এই পাঠটিকে টুকরো টুকরো করতে চান না, তাহলে আপনাকে যা করতে হবে তা এখানে:

আপনাকে পাঠের সাথে সংযুক্ত উত্সগুলি ডাউনলোড করতে হবে
- সংরক্ষণাগারে tables.sql ফাইলটি খুঁজুন৷ phpMyAdmin-এ আমদানি বিকল্প ব্যবহার করে এটি আপনার ডাটাবেসে আমদানি করুন৷ বিকল্প উপায়: একটি পাঠ্য সম্পাদকের মাধ্যমে এই ফাইলটি খুলুন, এসকিউএল ক্যোয়ারীটি অনুলিপি করুন এবং এটি চালান;
- অন্তর্ভুক্ত/main.php খুলুন এবং আপনার ডাটাবেসের সাথে সংযোগ করার জন্য সেটিংস পূরণ করুন (ডাটাবেসের সাথে সংযোগের জন্য ব্যবহারকারী এবং পাসওয়ার্ড উল্লেখ করুন, সেইসাথে ডাটাবেসের হোস্ট এবং নাম)। একই ফাইলে, আপনাকে অবশ্যই ইমেলটি নির্দিষ্ট করতে হবে, যা সিস্টেম দ্বারা প্রেরিত বার্তাগুলির জন্য আসল ঠিকানা হিসাবে ব্যবহার করা হবে। কিছু হোস্ট বহির্গামী ইমেলগুলি ব্লক করে যদি না ফর্মটিতে একটি আসল ইমেল ঠিকানা থাকে, যা হোস্টের নিয়ন্ত্রণ প্যানেল থেকে তৈরি করা হয়েছিল, তাই একটি আসল ঠিকানা প্রদান করুন;
- সমস্ত index.php , protected.php ফাইল এবং সম্পদ আপলোড করুন এবং FTP এর মাধ্যমে আপনার হোস্টে ফোল্ডার অন্তর্ভুক্ত করুন;
- প্রতিটি পিএইচপি পৃষ্ঠায় নীচের কোডটি যোগ করুন যেখানে আপনি লগইন ফর্মটি প্রদর্শন করতে চান;

Require_one "includes/main.php"; $user = নতুন ব্যবহারকারী(); if(!$user->loggedIn())( পুনঃনির্দেশ ("index.php"); )
- প্রস্তুত!

যারা এটি কিভাবে কাজ করে আগ্রহী তাদের জন্য, নীচে পড়ুন!

প্রথম ধাপ হল অনুমোদন ফর্মের জন্য HTM কোড লেখা। এই কোডটি index.php ফাইলে অবস্থিত। এই ফাইলটিতে পিএইচপি কোডও রয়েছে যা ফর্ম ডেটা এবং অন্যান্য দরকারী লগইন সিস্টেম ফাংশন পরিচালনা করে। আপনি পিএইচপি কোড পর্যালোচনার জন্য নিবেদিত নীচের বিভাগে এটি সম্পর্কে আরও জানতে পারেন।

index.php

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

উপরে আপনার ইমেল ঠিকানা লিখুন এবং আমরা পাঠাব
আপনি একটি লগইন লিঙ্ক.

লগইন/রেজিস্টার করুন

প্রধান বিভাগে (এবং ট্যাগগুলির মধ্যে) আমি প্রধান শৈলীগুলি অন্তর্ভুক্ত করেছি (সেগুলি এই টিউটোরিয়ালে কভার করা হয়নি, তাই আপনি নিজে সেগুলি দেখতে পারেন। ফোল্ডার সম্পদ/css/style.css)। ক্লোজিং ট্যাগের আগে, আমি jQuery লাইব্রেরি এবং script.js ফাইলটি অন্তর্ভুক্ত করেছি, যা আমরা নীচে লিখব এবং বিশ্লেষণ করব।


জাভাস্ক্রিপ্ট

jQuery ফাংশন ব্যবহার করে "রেজিস্টার/লগইন" বোতামের অবস্থা ট্র্যাক করে e.preventDefault()এবং AJAX অনুরোধ পাঠায়। সার্ভারের প্রতিক্রিয়ার উপর নির্ভর করে, এটি এক বা অন্য বার্তা প্রদর্শন করে এবং পরবর্তী কর্ম নির্ধারণ করে/

assets/js/script.js

$(function())( var form = $("#login-register"); form.on("submit", function(e)( if(form.is(."loading, .loggedIn"))( return false ; ) var ইমেইল = form.find("input").val(), messageHolder = form.find("span"); e.preventDefault(); $.post(this.action, (email: email), ফাংশন (m)( if(m.error)( form.addClass("error"); messageHolder.text(m.message); ) else( form.removeClass("error").addClass("loggedIn"); messageHolder লেখা ( ফর্ম। রিমুভ ক্লাস("লোডিং"); ));));

AJAX অনুরোধের বর্তমান অবস্থা প্রদর্শনের জন্য ফর্মটিতে যোগ করা হয়েছিল (এটি সম্ভব হয়েছে পদ্ধতিগুলির জন্য ধন্যবাদ ajaxStart()) এবং ajaxComplete(), যা আপনি ফাইলের শেষে খুঁজে পেতে পারেন)।

এই ক্লাসটি একটি ঘূর্ণায়মান অ্যানিমেটেড GIF ফাইল প্রদর্শন করে (যেন আমাদের কাছে অনুরোধটি প্রক্রিয়া করা হচ্ছে বলে ইঙ্গিত দেয়), এবং ফর্মটিকে আবার জমা হওয়া থেকে আটকাতে একটি পতাকা হিসাবে কাজ করে (যখন রেজিস্টার বোতামটি ইতিমধ্যে একবার ক্লিক করা হয়েছে)। .loggedIn ক্লাস হল আরেকটি পতাকা - এটি সেট করা হয় যখন ইমেল পাঠানো হয়েছিল। এই পতাকাটি অবিলম্বে ফর্মের সাথে আরও যেকোন ক্রিয়াকলাপকে ব্লক করে।

ডাটাবেস স্কিমা

আমাদের অবিশ্বাস্যভাবে সহজ লগিং সিস্টেম 2টি MySQL টেবিল ব্যবহার করে (এসকিউএল কোডটি tables.sql ফাইলে রয়েছে)। প্রথমটি ব্যবহারকারীর অ্যাকাউন্ট সম্পর্কে ডেটা সঞ্চয় করে। দ্বিতীয়টি লগইন প্রচেষ্টার সংখ্যা সম্পর্কে তথ্য সংরক্ষণ করে।


ব্যবহারকারীর টেবিল স্কিমা।

সিস্টেমটি পাসওয়ার্ড ব্যবহার করে না, যেমনটি ডায়াগ্রামে দেখা যায়। এটিতে আপনি token_validity কলামের সংলগ্ন টোকেন সহ টোকেন কলাম দেখতে পাবেন। ব্যবহারকারী সিস্টেমের সাথে সংযুক্ত হওয়ার সাথে সাথে টোকেনটি ইনস্টল করা হয় এবং একটি বার্তা পাঠানোর জন্য তার ইমেল সেট করে (পরবর্তী ব্লকে এটি সম্পর্কে আরও)। token_validity কলাম 10 মিনিট পরে সময় সেট করে, তারপর টোকেনটি আর বৈধ থাকে না।


সারণি স্কিমা যা অনুমোদনের প্রচেষ্টার সংখ্যা গণনা করে।

উভয় টেবিলেই, IP ঠিকানা প্রক্রিয়াকৃত আকারে সংরক্ষিত হয়, টাইপ পূর্ণসংখ্যার ক্ষেত্রে ip2long ফাংশন ব্যবহার করে।

এখন আমরা কিছু পিএইচপি কোড লিখতে পারি। সিস্টেমের প্রধান কার্যকারিতা User.class.php ক্লাসে বরাদ্দ করা হয়েছে, যা আপনি নীচে দেখতে পারেন।

এই শ্রেণী সক্রিয়ভাবে আইডরম (ডক্স) ব্যবহার করে, এই লাইব্রেরিগুলি ডাটাবেসের সাথে কাজ করার জন্য ন্যূনতম প্রয়োজনীয় সরঞ্জাম। এটি ডাটাবেস অ্যাক্সেস, টোকেন জেনারেশন এবং টোকেন বৈধতা পরিচালনা করে। এটি একটি সাধারণ ইন্টারফেস প্রদান করে যা PHP ব্যবহার করলে আপনার সাইটে একটি নিবন্ধন সিস্টেম সংযোগ করা সহজ করে তোলে।

User.class.php

ক্লাস ইউজার(// প্রাইভেট ORM কেস প্রাইভেট $orm; /** * টোকেন দ্বারা একজন ব্যবহারকারী খুঁজুন। শুধুমাত্র বৈধ টোকেন বিবেচনার জন্য গৃহীত হয়। টোকেনটি তৈরি হওয়ার মুহুর্ত থেকে শুধুমাত্র 10 মিনিটের জন্য তৈরি করা হয় * @param স্ট্রিং $token এটিই আমরা টোকেন খুঁজছি। = ORM::for_table("reg_users") ->কোথায় ("টোকেন", $টোকেন) ->where_raw("token_validity > NOW()") ->find_one(); if(!$result)( return false; ) নতুন ব্যবহারকারী ($ ফলাফল); ) /** * একজন ব্যবহারকারীকে অনুমোদন বা নিবন্ধন করুন * @param স্ট্রিং $ ইমেল ব্যবহারকারীর ইমেল ঠিকানা * @return User */ পাবলিক স্ট্যাটিক ফাংশন loginOrRegister($email)( // যদি এমন একজন ব্যবহারকারী ইতিমধ্যেই বিদ্যমান, ডাটাবেসে সংরক্ষিত নির্দিষ্ট ইমেল ঠিকানা থেকে ব্যবহারকারী ফাংশনের মান ফেরত দিন if(User::exists($email))( রিটার্ন new User($email); ) // অন্যথায়, ডাটাবেসে একটি নতুন ব্যবহারকারী তৈরি করুন এবং নির্দিষ্ট ইমেল থেকে User::create ফাংশনের মান ফেরত দিন User::create($email); ) /** * একটি নতুন ব্যবহারকারী তৈরি করুন এবং ডাটাবেসে সংরক্ষণ করুন * @param স্ট্রিং $email। ব্যবহারকারীর ইমেল ঠিকানা * @return User */ ব্যক্তিগত স্ট্যাটিক ফাংশন তৈরি করুন($email)( // একটি নতুন ব্যবহারকারী লিখুন এবং এই মানগুলি থেকে ব্যবহারকারীর ফাংশনের ফলাফল ফেরত দিন $result = ORM::for_table("reg_users")- >create(); $result->email = $email; $result->save(); রিটার্ন new User($result); ) /** * ডাটাবেসে এই ধরনের ইউজার আছে কিনা চেক করুন এবং এর বুলিয়ান মান ফেরত দিন ভেরিয়েবল * @param স্ট্রিং $email। ব্যবহারকারীর ইমেল ঠিকানা * @return বুলিয়ান */ পাবলিক স্ট্যাটিক ফাংশন বিদ্যমান($email)( // ব্যবহারকারী কি ডাটাবেসে বিদ্যমান? $result = ORM::for_table("reg_users") ->কোথায়("ইমেইল", $email ) ->count(); $result == 1; ) /** * একটি নতুন ব্যবহারকারী অবজেক্ট তৈরি করুন * @param উদাহরণ $param ORM , id, ইমেল বা 0 * @return User */ পাবলিক ফাংশন __construct($param = null) ( if($param instance of ORM)( // ORM চেক $this->orm = $param; ) অন্যথায় if(is_string($param))( // ইমেল চেক $this->orm = ORM:: for_table ("reg_users") -> where("email", $param) ->find_one(); ) else( $id = 0; if(is_numeric($param))( // ভেরিয়েবল $param এর মান হল ব্যবহারকারী শনাক্তকারীর কাছে পাঠানো হয়েছে $id = $param; ) অন্যথায় if(isset($_SESSION["loginid"]))( // অন্যথায়, $id = $_SESSION["loginid"]; ) $this->orm দেখুন = ORM::for_table( "reg_users") -> where("id", $id) ->find_one(); ) ) /** * একটি নতুন SHA1 অনুমোদন টোকেন তৈরি করুন, এটি ডাটাবেসে লিখে এবং এর মান প্রদান করে * @return string */ public function generateToken( )( // একজন অনুমোদিত ব্যবহারকারীর জন্য একটি টোকেন তৈরি করুন এবং ডাটাবেসে সংরক্ষণ করুন $token = sha1($this->email.time().rand(0, 1000000)); // টোকেনটি ডাটাবেসে সংরক্ষণ করুন // এবং এটিকে শুধুমাত্র পরবর্তী 10 মিনিটের জন্য বৈধ হিসেবে চিহ্নিত করুন $this->orm->set("token", $token); $this->orm->set_expr("token_validity", "ADDTIME(NOW(),"0:10")"); $this->orm->save(); ফেরত $token; ) /** * ব্যবহারকারীকে অনুমোদন করুন * @return void */ পাবলিক ফাংশন লগইন()) ( // ব্যবহারকারীকে $_SESSION["loginid"] = $this->orm->id-এ লগ ইন করা হিসাবে চিহ্নিত করুন; // আপডেট করুন last_login ডাটাবেস ক্ষেত্রের মান $this->orm->set_expr("last_login", "NOW()"); $this->orm->save(); ) /** * সেশনটি ধ্বংস করুন এবং ব্যবহারকারীকে লগ আউট করুন * @return void */ পাবলিক ফাংশন লগআউট ()( $_SESSION = array(); unset($_SESSION); ) /** * ব্যবহারকারী লগ ইন করেছেন কিনা পরীক্ষা করুন * @return boolean */ public function loggedIn())( রিটার্ন isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id; ) /** * ব্যবহারকারী একজন প্রশাসক কিনা তা পরীক্ষা করে * @return boolean */ public function isAdmin())( return $this->rank() = = "প্রশাসক"; ) /** * ব্যবহারকারীর ধরন খুঁজুন, হয় প্রশাসক বা নিয়মিত হতে পারে * @return string */ public function rank())( if ($this->orm->র্যাঙ্ক == 1)( ফেরত "প্রশাসক" "; ) ফেরত "নিয়মিত";) /** * পদ্ধতি যা আপনাকে ব্যবহারকারীর ব্যক্তিগত তথ্য * ব্যবহারকারী বস্তুর বৈশিষ্ট্য * @ হিসাবে পেতে দেয় প্যারাম স্ট্রিং $key সেই সম্পত্তির নাম যা অ্যাক্সেস পায় * @return mixed */ public function __get($key)( if(isset($this->orm->$key))( $this->orm-> ফেরত দিন $কী; ) রিটার্ন নাল; ))

টোকেন SHA1 অ্যালগরিদম ব্যবহার করে তৈরি করা হয় এবং ডাটাবেসে সংরক্ষণ করা হয়। আমি একটি টোকেনের বৈধতার জন্য 10-মিনিটের সময়সীমা সেট করতে MySQL এর টাইমিং ফাংশন ব্যবহার করছি।

যখন একটি টোকেন যাচাই করা হয়, আমরা সরাসরি হ্যান্ডলারকে বলি যে আমরা শুধুমাত্র সেই টোকেনগুলি বিবেচনা করছি যেগুলি এখনও মেয়াদ শেষ হয়নি, token_validity কলামে সংরক্ষিত৷

দয়া করে মনে রাখবেন যে আমি জাদু পদ্ধতি ব্যবহার করছি __পাওয়াফাইলের শেষে ডক্স লাইব্রেরি ইউজার অবজেক্টের বৈশিষ্ট্যগুলিতে অ্যাক্সেস আটকাতে।

এর জন্য ধন্যবাদ, $user->email, $user->টোকেন ইত্যাদি বৈশিষ্ট্যের জন্য ডাটাবেসে সংরক্ষিত তথ্য অ্যাক্সেস করা সম্ভব হয়েছে। পরবর্তী কোড ফ্র্যাগমেন্টে, আমরা উদাহরণ হিসেবে এই ক্লাসগুলি কীভাবে ব্যবহার করতে হয় তা দেখব। .


সুরক্ষিত পাতা

আরেকটি ফাইল যা দরকারী এবং প্রয়োজনীয় কার্যকারিতা সংরক্ষণ করে তা হল functions.php ফাইল। বেশ কয়েকটি তথাকথিত সাহায্যকারী রয়েছে - সহকারী ফাংশন যা আপনাকে অন্যান্য ফাইলগুলিতে পরিষ্কার এবং আরও পাঠযোগ্য কোড তৈরি করতে দেয়।

functions.php

ফাংশন send_email($from, $to, $subject, $message)( // সাহায্যকারী যে ইমেল পাঠায় $headers = "MIME-সংস্করণ: 1.0"। "\r\n"; $headers .= "কন্টেন্ট-টাইপ: টেক্সট /plain; charset=utf-8"। "\r\n"; $headers .= "থেকে: ".$from . "\r\n"; ফেরত মেইল($to, $subject, $message, $headers ) ); .$_SERVER ["SERVER_NAME"]; if(isset($_SERVER["REQUEST_URI"]) && $_SERVER["REQUEST_URI"] != "")( $url.= $_SERVER["REQUEST_URI"]; ) অন্য( $url. = $_SERVER["PATH_INFO"]; ) $url ফেরত দিন count_hour = ORM: :for_table("reg_login_attempt") ->কোথায়("ip", sprintf("%u", ip2long($ip))) ->where_raw("ts> SUBTIME(NOW(),"1:00 ")") ->count(); // এই IP ঠিকানায় গত 10 মিনিটে লগইন প্রচেষ্টার সংখ্যা $count_10_min = ORM::for_table("reg_login_attempt") ->কোথায়("ip", sprintf("%u) ", ip2long($ ip))) ->where_raw("ts > SUBTIME(NOW(),"0:10")") ->count(); if($count_hour > $limit_hour || $count_10_min > $limit_10_min)( নতুন ব্যতিক্রম নিক্ষেপ করুন("অনেকগুলি লগইন প্রচেষ্টা!"); ) ) ফাংশন rate_limit_tick($ip, $email)( // টেবিলে একটি নতুন রেকর্ড তৈরি করুন যেটি লগইন প্রচেষ্টার সংখ্যা গণনা করে $login_attempt = ORM::for_table("reg_login_attempt")->create(); $login_attempt->email = $email; $login_attempt->ip = sprintf("%u", ip2long($ip )); $login_attempt->সংরক্ষণ (); ) ফাংশন পুনঃনির্দেশ ($url)( শিরোনাম("অবস্থান: $url"); প্রস্থান করুন

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

নিচের কোডটি index.php ফাইল থেকে নেওয়া হয়েছে এবং এটি ফর্ম জমা দেওয়ার কাজ পরিচালনা করে। এটি একটি JSON প্রতিক্রিয়া প্রদান করে, যা jQuery দ্বারা assets/js/script.js ফাইলে প্রক্রিয়া করা হয় যা আমরা আগে দেখেছি।

index.php

চেষ্টা করুন( if(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))( // আউটপুট একটি JSON হেডার হেডার("কন্টেন্ট-টাইপ: অ্যাপ্লিকেশন/json"); // এই ইমেল ঠিকানাটি কি বৈধ যদি (!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))( নতুন ব্যতিক্রম নিক্ষেপ করুন("অনুগ্রহ করে একটি বৈধ ইমেল লিখুন।"); ) // চেক করুন। ব্যবহারকারীকে লগ ইন করার অনুমতি দেওয়া হয়েছে, সে কি অনুমোদিত সংযোগের সংখ্যা অতিক্রম করেছে? (আরও তথ্যের জন্য functions.php ফাইল) রেট_লিমিট($_SERVER["REMOTE_ADDR"]); // লগইন করার এই প্রচেষ্টা রেট_লিমিট_টিক ($_SERVER["REMOTE_ADDR"] লগ ইন করুন , $_POST["email"]); // ব্যবহারকারীকে একটি ইমেল পাঠান $message = ""; $email = $_POST["email"]; $subject = "আপনার লগইন লিঙ্ক"; if(!User:: বিদ্যমান($email) )( $subject = "নিবন্ধন করার জন্য আপনাকে ধন্যবাদ!"; $message = "আমাদের সাইটে নিবন্ধন করার জন্য আপনাকে ধন্যবাদ!\n\n"; ) // একজন ব্যবহারকারীকে অনুমোদন বা নিবন্ধন করার প্রচেষ্টা $user = ব্যবহারকারী ::loginOrRegister($_POST[ "email"]); $message.= "আপনি এই URL থেকে লগইন করতে পারেন:\n"; $message.= get_page_url()।"?tkn=".$user->generateToken()।"\n\n"; $message.= "লিঙ্কটি 10 ​​মিনিটের পরে স্বয়ংক্রিয়ভাবে শেষ হয়ে যাচ্ছে।"; $result = send_email($fromEmail, $_POST["email"], $subject, $message); if(!$result)( নতুন ব্যতিক্রম নিক্ষেপ করুন("আপনার ইমেল পাঠানোর সময় একটি ত্রুটি ছিল। অনুগ্রহ করে আবার চেষ্টা করুন।"); ) die(json_encode(array("message" =>"ধন্যবাদ! আমরা একটি লিঙ্ক পাঠিয়েছি) আপনার ইনবক্সে। আপনার স্প্যাম ফোল্ডারটিও পরীক্ষা করুন।"))); ) ) ক্যাচ(ব্যতিক্রম $e)( die(json_encode(array("error"=>1, "message" => $e->getMessage() )));)

সফল লগইন/রেজিস্ট্রেশনের পর, উপরের কোডটি ব্যবহারকারীকে একটি লগইন লিঙ্ক পাঠাবে। টোকেন পাওয়া যায় কারণ এটি পদ্ধতি দ্বারা উত্পন্ন লিঙ্কে একটি পরিবর্তনশীল হিসাবে পাস করা হয় $_GET tkn মার্কার সহ

index.php

If(isset($_GET["tkn"]))( // এই টোকেন কি অনুমোদনের জন্য বৈধ? ​​$user = User::findByToken($_GET["tkn"]); if($user)( // হ্যাঁ , হল৷ একটি সুরক্ষিত পৃষ্ঠায় পুনঃনির্দেশ করুন $user->login(); পুনঃনির্দেশ ("protected.php"); ) // না, টোকেন বৈধ নয়৷ একটি অনুমোদন/রেজিস্ট্রেশন ফর্ম পুনঃনির্দেশ ("index) সহ একটি পৃষ্ঠায় পুনঃনির্দেশ করুন৷ php ");)

$user->লগইন()

সেশনের জন্য প্রয়োজনীয় ভেরিয়েবল তৈরি করবে, যাতে ব্যবহারকারী, সাইটের পরবর্তী পৃষ্ঠাগুলি দেখছেন, সর্বদা অনুমোদিত থাকবেন।

সিস্টেম থেকে প্রস্থান করার জন্য ফাংশনের প্রক্রিয়াকরণ একইভাবে সাজানো হয়।

index.php

If(isset($_GET["logout"]))($user = new User(); if($user->loggedIn())($user->logout(); ) redirect("index.php") ;)

কোডের শেষে, আমি আবার index.php এ একটি পুনঃনির্দেশ সেট করেছি, তাই পরামিতি লগআউট=1 URL এর মাধ্যমে প্রেরণের প্রয়োজন নেই।

আমাদের index.php ফাইলের অতিরিক্ত প্রয়োজন। সুরক্ষা - আমরা চাই না যে লোকেরা সিস্টেমে লগ ইন করেছে তারা আবার নিবন্ধন ফর্মটি দেখুক। এই উদ্দেশ্যে, আমরা পদ্ধতিটি ব্যবহার করি $user->loggedIn().

index.php

$user = নতুন ব্যবহারকারী(); if($user->loggedIn())( redirect("protected.php"); )

অবশেষে, এখানে কোডের একটি অংশ রয়েছে যা আপনাকে আপনার সাইটের পৃষ্ঠাগুলিকে সুরক্ষিত করতে এবং অনুমোদনের পরেই এটি অ্যাক্সেসযোগ্য করে তুলতে দেয়৷

protected.php

// আপনার সাইটের প্রতিটি পৃষ্ঠা সুরক্ষিত করতে, একটি main.php ফাইল অন্তর্ভুক্ত করুন // এবং একটি নতুন ব্যবহারকারী অবজেক্ট তৈরি করুন। এটা কত সহজ! need_one "includes/main.php"; $user = নতুন ব্যবহারকারী(); if(!$user->loggedIn())( redirect("index.php"); )

এই চেক করার পরে, আপনি নিশ্চিত হতে পারেন যে ব্যবহারকারী সফলভাবে অনুমোদিত হয়েছে। আপনি অবজেক্ট বৈশিষ্ট্য ব্যবহার করে ডাটাবেসে সংরক্ষিত তথ্য অ্যাক্সেস করতে পারেন $ব্যবহারকারী. ব্যবহারকারীর ইমেল এবং স্থিতি প্রদর্শন করতে, এই কোডটি ব্যবহার করুন:

ইকো "আপনার ইমেল: ".$user->email; প্রতিধ্বনি "আপনার পদমর্যাদা: ".$ ব্যবহারকারী->র্যাঙ্ক();

পদ্ধতি পদমর্যাদা()এখানে ব্যবহার করা হয়েছে কারণ ডাটাবেস সাধারণত সংখ্যা সংরক্ষণ করে (একজন নিয়মিত ব্যবহারকারীর জন্য 0, একজন প্রশাসকের জন্য 1) এবং আমাদের এই ডেটাকে সেগুলির সাথে সম্পর্কিত স্ট্যাটাসে রূপান্তর করতে হবে, যা এই পদ্ধতিটি আমাদের সাহায্য করে।

একজন নিয়মিত ব্যবহারকারীকে প্রশাসক বানাতে, শুধুমাত্র phpMyAdmin (বা অন্য কোন প্রোগ্রাম যা আপনাকে ডাটাবেস পরিচালনা করতে দেয়) এর মাধ্যমে ব্যবহারকারীর এন্ট্রি সম্পাদনা করুন। প্রশাসকের অবস্থা কোন বিশেষাধিকার দেয় না; এই উদাহরণে, পৃষ্ঠাটি প্রদর্শন করবে যে আপনি একজন প্রশাসক - এবং এটিই।

তবে এটির সাথে কী করবেন তা আপনার বিবেচনার উপর ছেড়ে দেওয়া হয়েছে; আপনি নিজেই কোড লিখতে এবং রচনা করতে পারেন যা প্রশাসকদের জন্য নির্দিষ্ট সুবিধা এবং ক্ষমতা সেট করে।

সম্পন্ন করা হয়েছে!

আমরা এই অবিশ্বাস্যভাবে সুপার আধা সাধারণ আকৃতি দিয়ে সম্পন্ন করেছি! আপনি এটি আপনার পিএইচপি সাইটগুলিতে ব্যবহার করতে পারেন, এটি বেশ সহজ। আপনি নিজের জন্য এটি সংশোধন করতে পারেন এবং এটিকে আপনার পছন্দ মতো তৈরি করতে পারেন।

উপাদানটি ডেনিস মালিশোক বিশেষভাবে ওয়েবসাইটের জন্য প্রস্তুত করেছিলেন

পুনশ্চ. আপনি কি পিএইচপি এবং ওওপি আয়ত্তে আরও এগিয়ে যেতে চান? PHP-তে প্রোগ্রামিং সহ ওয়েবসাইট বিল্ডিংয়ের বিভিন্ন দিকের প্রিমিয়াম পাঠগুলিতে মনোযোগ দিন, সেইসাথে OOP ব্যবহার করে স্ক্র্যাচ থেকে PHP-তে আপনার নিজস্ব CMS সিস্টেম তৈরি করার একটি বিনামূল্যের কোর্স:

আপনি উপাদান পছন্দ এবং আমাকে ধন্যবাদ চান?
শুধু আপনার বন্ধু এবং সহকর্মীদের সাথে শেয়ার করুন!


বিশ্বব্যাপী ভেরিয়েবল এবং রেজিস্টার_গ্লোবাল নির্দেশিকা নিষ্ক্রিয় করার সাথে সম্পর্কিত সমস্যাগুলি সম্পর্কে প্রায়শই প্রশ্ন ওঠে, আমরা এই নিবন্ধে এই বিষয়টিকে একটু কভার করার চেষ্টা করব।

প্রথমে, বাহ্যিক ভেরিয়েবলগুলি কী তা সংজ্ঞায়িত করা যাক। এগুলি যে কোনও ভেরিয়েবল যা বাইরে থেকে প্রোগ্রামে আসে, যেমন প্রোগ্রাম নিজেই সংজ্ঞায়িত করা হয় না. একটি php স্ক্রিপ্টের জন্য, ব্রাউজার লাইনের মাধ্যমে বা ফর্মের মাধ্যমে পাস করা সমস্ত ভেরিয়েবল বাহ্যিক।
এগুলি কীভাবে তৈরি করা হয় তা দেখুন।

যদি register_globals = অন ডিরেক্টিভ সার্ভারে সক্রিয় করা হয় (php.ini-এ), তাহলে একটি ফর্ম বা ব্রাউজার লাইনের মাধ্যমে ভেরিয়েবলগুলি পাস করার সময়, এই ভেরিয়েবলগুলি যে স্ক্রিপ্টের উদ্দেশ্যে করা হয়েছে, সেগুলি স্বয়ংক্রিয়ভাবে তৈরি হবে। সেগুলো. যদি আপনার ব্রাউজার লাইনে নিম্নলিখিত লেখা থাকে: www.server.ru/index.php?var=1, তাহলে $var ভেরিয়েবলটি 1 এর সমান মান সহ index.php স্ক্রিপ্টে স্বয়ংক্রিয়ভাবে তৈরি হবে।

মন্তব্য করুন

এই নির্দেশটি পিএইচপি ভাষার সবচেয়ে বিতর্কিত পয়েন্টগুলির মধ্যে একটি। একদিকে, এটির ব্যবহার প্রকৃতপক্ষে পিএইচপি স্ক্রিপ্টগুলির সুরক্ষার সাথে প্রকৃত সমস্যাগুলির জন্ম দিতে পারে, যদি সম্ভাব্য ত্রুটির পরিস্থিতি সঠিকভাবে বিবেচনা না করা হয়, এবং অনেক বিকাশকারী ঠিকই মনে করেন যে গ্লোবাল ভেরিয়েবল ব্যবহার না করে স্ক্রিপ্টগুলি লেখার ফলে স্ক্রিপ্টগুলির দুর্বলতা হ্রাস পায়। 90% দ্বারা বিভিন্ন ধরনের আক্রমণ। অন্যদিকে, PHP-এর শুরুতে, এক হাজারেরও বেশি ব্যবহারকারী ভাষা বিকাশকারীদের বিশ্বাস করেছিল (পিএইচপি 4.3 পর্যন্ত এই নির্দেশটি ডিফল্টরূপে সক্ষম ছিল), যার কারণে বর্তমানে বিশ্বব্যাপী ভেরিয়েবল ব্যবহার করে লেখা লক্ষ লক্ষ প্রকৃত স্ক্রিপ্ট রয়েছে (এটি হল লক্ষণীয় যে শিক্ষাগত উদ্দেশ্যে কখনও কখনও গ্লোবাল ভেরিয়েবল ব্যবহার করে স্ক্রিপ্ট লেখা সম্পূর্ণরূপে সার্থক, যেহেতু সুপারগ্লোবাল অ্যারে দিয়ে তাদের প্রতিস্থাপন করা কোডের পাঠযোগ্যতাকে ব্যাপকভাবে ক্ষতিগ্রস্থ করে)।

বর্তমানে, বেশিরভাগ হোস্ট প্রদানকারীর এই নির্দেশিকা সক্ষম করা আছে এবং সম্ভবত এটি দীর্ঘ সময়ের জন্য সক্রিয় থাকবে, অন্যথায় এটি কোডের ধারাবাহিকতা ভঙ্গ করতে পারে।

যখন register_globals নির্দেশিকা নিষ্ক্রিয় করা হয়, তখন এই ধরনের ভেরিয়েবলগুলিতে অ্যাক্সেস দুটি উপায়ে সম্ভব:

  • সহযোগী অ্যারে HTTP_***_VARS (HTTP_POST_VARS, ইত্যাদি) এর মাধ্যমে
  • সুপারগ্লোবাল অ্যারের মাধ্যমে ($_ENV, $_GET, $_POST, $_SERVER, $_COOKIE, $_FILES, ইত্যাদি)

সুপারগ্লোবাল অ্যারে যেকোন সুযোগে পাওয়া যায়। PHP ডেভেলপাররা সার্ভারে register_globals নির্দেশিকা নিষ্ক্রিয় করার এবং সুপারগ্লোবাল অ্যারেগুলির মাধ্যমে ভেরিয়েবলের সাথে কাজ করার পরামর্শ দেয়। register_globals নির্দেশিকা সক্রিয় করা হলে নিরাপত্তা সংক্রান্ত সমস্যার কারণে এই সুপারিশ করা হয়েছে।

যদিও সম্প্রতি পর্যন্ত, register_globals নির্দেশিকা হোস্টিং সাইটগুলিতে সক্রিয় ছিল। পিএইচপি 5 প্রকাশের সাথে সাথে পরিস্থিতি পরিবর্তন হতে শুরু করে, যেখানে এই নির্দেশটি ডিফল্টরূপে অক্ষম করা হয় এবং হোস্টররা এটিকে সক্ষম করার জন্য কোন তাড়াহুড়ো করে না (হয়তো ঠিকই তাই)।

সুতরাং, ভেরিয়েবল পেতে আপনার ঠিক কি করা উচিত? আপনাকে সুপারগ্লোবাল অ্যারে থেকে সেগুলি নিতে হবে। উদাহরণস্বরূপ, ব্রাউজার লাইনের মধ্য দিয়ে ভেরিয়েবল পাস করতে, $_GET অ্যারে ব্যবহার করুন। ধরা যাক ব্রাউজার লাইন www.server.ru/index.php?var=1 বলে। তারপর index.php এ var ভেরিয়েবল পেতে আপনাকে লিখতে হবে:

$var=$_GET["var"];

এবং, উদাহরণস্বরূপ, POST পদ্ধতি ব্যবহার করে একটি ফর্ম থেকে স্থানান্তরিত ভেরিয়েবলগুলি পেতে, ফর্ম হ্যান্ডলার স্ক্রিপ্টে আপনাকে লিখতে হবে:

$var=$_POST["var"];

এই নিবন্ধে, আপনি শিখবেন কিভাবে HTML, JavaScript, PHP এবং MySql ব্যবহার করে একটি নিবন্ধন এবং লগইন ফর্ম তৈরি করতে হয়। এই ধরনের ফর্ম নির্বিশেষে প্রায় প্রতিটি ওয়েবসাইটে ব্যবহার করা হয়। এগুলি একটি ফোরাম, একটি অনলাইন স্টোর, সামাজিক নেটওয়ার্ক (যেমন Facebook, Twitter, Odnoklassniki) এবং অন্যান্য অনেক ধরণের সাইটের জন্য তৈরি করা হয়েছে।

যদি আপনার স্থানীয় কম্পিউটারে একটি ওয়েবসাইট থাকে, তাহলে আমি আশা করি আপনার কাছে ইতিমধ্যেই একটি স্থানীয় সার্ভার ইনস্টল এবং চলমান আছে। এটি ছাড়া, কিছুই কাজ করবে না।

ডাটাবেসে একটি টেবিল তৈরি করা

ব্যবহারকারী নিবন্ধন বাস্তবায়ন করার জন্য, প্রথমে আমাদের একটি ডেটাবেস প্রয়োজন। আপনার যদি এটি ইতিমধ্যেই থাকে তবে দুর্দান্ত, অন্যথায়, আপনাকে এটি তৈরি করতে হবে। নিবন্ধে, আমি বিস্তারিতভাবে ব্যাখ্যা করব কিভাবে এটি করতে হয়।

এবং তাই, আমাদের একটি ডেটাবেস আছে (সংক্ষেপে ডিবি), এখন আমাদের একটি টেবিল তৈরি করতে হবে ব্যবহারকারীদেরযেটিতে আমরা আমাদের নিবন্ধিত ব্যবহারকারীদের যুক্ত করব।

আমি নিবন্ধে একটি ডাটাবেসে একটি টেবিল তৈরি করার উপায় ব্যাখ্যা করেছি। একটি টেবিল তৈরি করার আগে, আমাদের নির্ধারণ করতে হবে এতে কী কী ক্ষেত্র থাকবে। এই ক্ষেত্রগুলি নিবন্ধন ফর্ম থেকে ক্ষেত্রগুলির সাথে মিলিত হবে৷

তাই, আমরা ভাবলাম, আমাদের ফর্মে কী কী ক্ষেত্র থাকবে তা আমরা কল্পনা করেছি এবং একটি টেবিল তৈরি করেছি ব্যবহারকারীদেরএই ক্ষেত্রগুলির সাথে:

  • আইডি- শনাক্তকারী। মাঠ আইডিডাটাবেসের প্রতিটি টেবিলে এটি থাকা উচিত।
  • নামের প্রথম অংশ- নাম বাঁচাতে।
  • নামের শেষাংশ- উপাধি সংরক্ষণ করতে।
  • ইমেইল- ডাক ঠিকানা সংরক্ষণ করতে. আমরা লগইন হিসাবে ই-মেইল ব্যবহার করব, তাই এই ক্ষেত্রটি অবশ্যই অনন্য হতে হবে, অর্থাৎ অনন্য সূচক থাকতে হবে।
  • email_status- মেইল ​​নিশ্চিত করা হয়েছে কিনা তা নির্দেশ করার জন্য ক্ষেত্র। যদি মেইলটি নিশ্চিত করা হয়, তাহলে এর মান 1 হবে, অন্যথায় মান 0 হবে।
  • পাসওয়ার্ড- পাসওয়ার্ড সংরক্ষণ করতে।


আপনি যদি আপনার নিবন্ধন ফর্মে অন্য কিছু ক্ষেত্র থাকতে চান তবে আপনি সেগুলি এখানে যোগ করতে পারেন।

এটা, আমাদের টেবিল ব্যবহারকারীদেরপ্রস্তুত. চলুন পরবর্তী পর্যায়ে চলুন.

ডাটাবেস সংযোগ

আমরা ডাটাবেস তৈরি করেছি, এখন আমাদের এটির সাথে সংযোগ করতে হবে। আমরা পিএইচপি এক্সটেনশন MySQLi ব্যবহার করে সংযোগ করব।

আমাদের সাইটের ফোল্ডারে নাম দিয়ে একটি ফাইল তৈরি করুন dbconnect.php, এবং এটিতে নিম্নলিখিত স্ক্রিপ্টটি লিখুন:

এই নথি dbconnect.phpফর্ম হ্যান্ডলারের সাথে সংযুক্ত হতে হবে।

পরিবর্তনশীল লক্ষ্য করুন $address_site, এখানে আমি আমার পরীক্ষার সাইটের নাম নির্দেশ করেছি যেটিতে আমি কাজ করব। সেই অনুযায়ী আপনার সাইটের নাম নির্দেশ করুন.

সাইটের গঠন

এখন আমাদের সাইটের এইচটিএমএল গঠন দেখুন।

আমরা সাইটের শিরোনাম এবং ফুটার আলাদা ফাইলে স্থানান্তর করব, header.phpএবং footer.php. আমরা তাদের সমস্ত পৃষ্ঠায় অন্তর্ভুক্ত করব। যথা প্রধান পৃষ্ঠায় (ফাইল index.php), নিবন্ধন ফর্ম সহ পৃষ্ঠায় (ফাইল form_register.php) এবং অনুমোদন ফর্ম সহ পৃষ্ঠায় (ফাইল form_auth.php).

আমাদের লিঙ্ক দিয়ে ব্লক করুন, নিবন্ধনএবং অনুমোদন, সেগুলিকে সাইটের শিরোনামে যুক্ত করুন যাতে সেগুলি সমস্ত পৃষ্ঠায় প্রদর্শিত হয়৷ একটি লিঙ্ক নিবন্ধন ফর্ম সহ পৃষ্ঠায় প্রবেশ করবে (ফাইল form_register.php) এবং অন্যটি অনুমোদনের ফর্ম সহ পৃষ্ঠায় (ফাইল form_auth.php).

header.php ফাইলের বিষয়বস্তু:

আমাদের সাইটের নাম

ফলস্বরূপ, আমাদের প্রধান পৃষ্ঠাটি এইরকম দেখায়:


অবশ্যই, আপনার সাইটের সম্পূর্ণ ভিন্ন কাঠামো থাকতে পারে, কিন্তু এটি এখন আমাদের জন্য গুরুত্বপূর্ণ নয়। মূল জিনিসটি নিবন্ধকরণ এবং অনুমোদনের জন্য লিঙ্ক (বোতাম) রয়েছে।

এখন রেজিস্ট্রেশন ফর্মে যাওয়া যাক। আপনি ইতিমধ্যে বুঝতে পেরেছেন, আমাদের কাছে এটি ফাইলে রয়েছে form_register.php.

ডাটাবেসে যান (phpMyAdmin-এ), টেবিলের কাঠামো খুলুন ব্যবহারকারীদেরএবং আমরা কি ক্ষেত্র প্রয়োজন তাকান. এর মানে হল যে আমাদের প্রথম এবং শেষ নাম প্রবেশের জন্য ক্ষেত্র, ডাক ঠিকানা (ইমেল) প্রবেশ করার জন্য একটি ক্ষেত্র এবং পাসওয়ার্ড প্রবেশের জন্য একটি ক্ষেত্র প্রয়োজন। এবং নিরাপত্তার উদ্দেশ্যে, আমরা একটি ক্যাপচা প্রবেশের জন্য একটি ক্ষেত্র যোগ করব।

সার্ভারে, নিবন্ধন ফর্ম প্রক্রিয়াকরণের ফলে, বিভিন্ন ত্রুটি ঘটতে পারে যার কারণে ব্যবহারকারী নিবন্ধন করতে পারবেন না। সুতরাং, ব্যবহারকারী কেন নিবন্ধন ব্যর্থ হয় তা বোঝার জন্য, এই ত্রুটিগুলি সম্পর্কে বার্তাগুলি প্রদর্শন করা প্রয়োজন৷

ফর্মটি প্রদর্শন করার আগে, সেশন থেকে ত্রুটি বার্তাগুলি প্রদর্শন করতে একটি ব্লক যুক্ত করুন৷

এবং আরও একটি জিনিস, যদি ব্যবহারকারী ইতিমধ্যে অনুমোদিত হয় এবং কৌতূহলের বাইরে তিনি ব্রাউজারের ঠিকানা বারে লিখে সরাসরি নিবন্ধন পৃষ্ঠায় যান site_address/form_register.php, তারপর এই ক্ষেত্রে, নিবন্ধন ফর্মের পরিবর্তে, আমরা একটি শিরোনাম প্রদর্শন করব যাতে বলা হয় যে তিনি ইতিমধ্যে নিবন্ধিত।

সাধারণভাবে, ফাইল কোড form_register.phpআমরা এটা পেয়েছি:

আপনি ইতোমধ্যে নিবন্ধিত

ব্রাউজারে, নিবন্ধন ফর্ম সহ পৃষ্ঠাটি এইরকম দেখায়:


প্রয়োজনীয় বৈশিষ্ট্য ব্যবহার করে, আমরা সমস্ত ক্ষেত্র বাধ্যতামূলক করেছি।

রেজিস্ট্রেশন ফর্মের কোডে মনোযোগ দিন যেখানে ক্যাপচা প্রদর্শিত হয়:


আমরা ইমেজের জন্য src অ্যাট্রিবিউটের মান দিয়ে ফাইলের পাথ নির্দিষ্ট করেছি captcha.php, যা এই ক্যাপচা তৈরি করে।

চলুন ফাইল কোড তাকান captcha.php:

কোডটি ভালভাবে মন্তব্য করা হয়েছে, তাই আমি শুধুমাত্র একটি পয়েন্টে ফোকাস করব।

একটি ফাংশন ভিতরে imageTtfText(), ফন্টের পথ নির্দিষ্ট করা আছে verdana.ttf. তাই ক্যাপচা সঠিকভাবে কাজ করার জন্য, আমাদের অবশ্যই একটি ফোল্ডার তৈরি করতে হবে ফন্ট, এবং সেখানে ফন্ট ফাইল রাখুন verdana.ttf. আপনি এটি খুঁজে পেতে এবং ইন্টারনেট থেকে ডাউনলোড করতে পারেন, অথবা এই নিবন্ধের উপকরণ সহ সংরক্ষণাগার থেকে নিতে পারেন।

আমরা এইচটিএমএল স্ট্রাকচার শেষ করেছি, এখন এগিয়ে যাওয়ার সময়।

jQuery ব্যবহার করে ইমেলের বৈধতা পরীক্ষা করা হচ্ছে

যেকোনো ফর্মের জন্য ক্লায়েন্ট সাইডে (জাভাস্ক্রিপ্ট, jQuery ব্যবহার করে) এবং সার্ভার সাইডে, প্রবেশ করা ডেটার বৈধতা পরীক্ষা করতে হবে।

আমাদের ইমেল ক্ষেত্রে বিশেষ মনোযোগ দিতে হবে। এটা খুবই গুরুত্বপূর্ণ যে প্রবেশ করা ডাক ঠিকানাটি বৈধ।

এই ইনপুট ক্ষেত্রের জন্য, আমরা ইমেলের ধরন সেট করি (type="email"), এটি আমাদেরকে ভুল বিন্যাসের বিরুদ্ধে সামান্য সতর্ক করে। তবে এটি যথেষ্ট নয়, কারণ ব্রাউজারটি আমাদের সরবরাহ করে এমন কোড পরিদর্শকের মাধ্যমে আমরা সহজেই বৈশিষ্ট্যের মান পরিবর্তন করতে পারি টাইপসঙ্গে ইমেইলচালু পাঠ্য, এবং এটাই, আমাদের চেক আর বৈধ হবে না।


এবং এই ক্ষেত্রে, আমাদের অবশ্যই আরও নির্ভরযোগ্য চেক করতে হবে। এটি করার জন্য, আমরা JavaScript থেকে jQuery লাইব্রেরি ব্যবহার করব।

ফাইলটিতে jQuery লাইব্রেরি সংযোগ করতে header.phpট্যাগের মধ্যে , ক্লোজিং ট্যাগের আগে , এই লাইন যোগ করুন:

এই লাইনের পরপরই, আমরা ইমেল যাচাইকরণ কোড যোগ করব। এখানে আমরা প্রবেশ করা পাসওয়ার্ডের দৈর্ঘ্য পরীক্ষা করার জন্য একটি কোড যোগ করব। এর দৈর্ঘ্য কমপক্ষে 6 অক্ষর হতে হবে।

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

এবং তাই, আমরা ক্লায়েন্ট পক্ষের ফর্ম বৈধতা দিয়ে সম্পন্ন করা হয়. এখন আমরা এটি সার্ভারে পাঠাতে পারি, যেখানে আমরা কয়েকটি চেক করব এবং ডাটাবেসে ডেটা যোগ করব।

বেবহারকারির রেজিস্ট্রেশান

আমরা প্রক্রিয়াকরণের জন্য ফাইলটিতে ফর্মটি পাঠাই register.php, POST পদ্ধতির মাধ্যমে। এই হ্যান্ডলার ফাইলের নাম অ্যাট্রিবিউট ভ্যালুতে নির্দিষ্ট করা আছে কর্ম. এবং পাঠানোর পদ্ধতিটি অ্যাট্রিবিউটের মানটিতে উল্লেখ করা হয়েছে পদ্ধতি.

এই ফাইলটি খুলুন register.phpএবং প্রথমে আমাদের যা করতে হবে তা হল একটি সেশন লঞ্চ ফাংশন লিখুন এবং আমরা আগে যে ফাইলটি তৈরি করেছি তা সংযুক্ত করুন dbconnect.php(এই ফাইলটিতে আমরা ডাটাবেসের সাথে একটি সংযোগ তৈরি করেছি)। এবং এছাড়াও, আসুন অবিলম্বে কোষগুলি ঘোষণা করি ভুল বার্তাএবং সফলতার_বার্তাগ্লোবাল সেশন অ্যারেতে। ভিতরে ত্রুটি_বার্তাআমরা ফর্ম প্রক্রিয়াকরণের সময় ঘটে যাওয়া সমস্ত ত্রুটি বার্তা রেকর্ড করব এবং এর মধ্যে succes_messages, আমরা আনন্দের বার্তা রেকর্ড করব।

আমরা চালিয়ে যাওয়ার আগে, ফর্মটি আদৌ জমা দেওয়া হয়েছে কিনা তা আমাদের পরীক্ষা করতে হবে। একজন আক্রমণকারী বৈশিষ্ট্য মান দেখতে পারেন কর্মফর্ম থেকে, এবং খুঁজে বের করুন কোন ফাইলটি এই ফর্মটি প্রক্রিয়া করছে৷ এবং ব্রাউজারের ঠিকানা বারে নিম্নলিখিত ঠিকানাটি টাইপ করে সরাসরি এই ফাইলটিতে যাওয়ার ধারণা থাকতে পারে: http://site_address/register.php

তাই আমাদের গ্লোবাল POST অ্যারেতে একটি ঘরের জন্য পরীক্ষা করতে হবে যার নাম ফর্ম থেকে আমাদের "রেজিস্টার" বোতামের নামের সাথে মেলে। এইভাবে আমরা পরীক্ষা করি যে "রেজিস্টার" বোতামটি ক্লিক করা হয়েছে কি না।

যদি কোনো আক্রমণকারী সরাসরি এই ফাইলে যাওয়ার চেষ্টা করে, তাহলে তারা একটি ত্রুটির বার্তা পাবে। আমি আপনাকে মনে করিয়ে দিই যে $address_site ভেরিয়েবলটিতে সাইটের নাম রয়েছে এবং এটি ফাইলে ঘোষণা করা হয়েছিল dbconnect.php.

সেশনের ক্যাপচা মানটি ফাইলে তৈরি করার সময় যোগ করা হয়েছিল captcha.php. একটি অনুস্মারক হিসাবে, আমি আপনাকে ফাইল থেকে কোডের এই অংশটি আবার দেখাব captcha.php, যেখানে ক্যাপচা মান সেশনে যোগ করা হয়:

এখন আসুন যাচাইকরণে এগিয়ে যাই। ফাইলে register.php, if ব্লকের ভিতরে, যেখানে আমরা পরীক্ষা করি যে "রেজিস্টার" বোতামটি ক্লিক করা হয়েছে কিনা, অথবা যেখানে মন্তব্যটি " নির্দেশিত হয়েছে" // (1) কোডের পরবর্তী অংশের জন্য স্থান"আমরা লিখি:

//প্রাপ্ত ক্যাপচা চেক করুন // লাইনের শুরু এবং শেষ থেকে স্পেস ট্রিম করুন $captcha = trim($_POST["captcha"]); if(isset($_POST["captcha"]) && !empty($captcha))( //সেশন থেকে প্রাপ্ত মানের সাথে তুলনা করুন। if(($_SESSION["rand"] != $captcha) && ($_SESSION ["rand"] !=""))( // যদি ক্যাপচা সঠিক না হয়, তাহলে আমরা ব্যবহারকারীকে নিবন্ধন পৃষ্ঠায় ফিরিয়ে দিই, এবং সেখানে আমরা তাকে একটি ত্রুটি বার্তা প্রদর্শন করব যে সে ভুল ক্যাপচা প্রবেশ করেছে৷ $error_message = "

ত্রুটি! আপনি ভুল ক্যাপচা প্রবেশ করেছেন

"; // সেশনে ত্রুটি বার্তাটি সংরক্ষণ করুন৷ $_SESSION["error_messages"] = $error_message; // ব্যবহারকারীকে নিবন্ধন পৃষ্ঠার শিরোনামে ফিরিয়ে দিন ("HTTP/1.1 301 স্থায়ীভাবে সরানো"); শিরোনাম("অবস্থান: " .$address_site ."/form_register.php"); // স্ক্রিপ্ট থেকে প্রস্থান বন্ধ করুন ("

ত্রুটি! কোন ভেরিফিকেশন কোড নেই, অর্থাৎ একটি ক্যাপচা কোড। আপনি মূল পৃষ্ঠায় যেতে পারেন.

"); }

পরবর্তী, আমাদের POST অ্যারে থেকে প্রাপ্ত ডেটা প্রক্রিয়া করতে হবে। প্রথমত, আমাদের গ্লোবাল POST অ্যারের বিষয়বস্তু পরীক্ষা করতে হবে, অর্থাৎ, সেখানে এমন কোন সেল আছে কি না যাদের নাম আমাদের ফর্ম থেকে ইনপুট ফিল্ডের নামের সাথে মিলে যায়।

যদি সেলটি বিদ্যমান থাকে, তাহলে আমরা এই ঘর থেকে লাইনের শুরু এবং শেষ থেকে স্পেস ট্রিম করি, অন্যথায়, আমরা ব্যবহারকারীকে রেজিস্ট্রেশন ফর্ম সহ পৃষ্ঠায় পুনঃনির্দেশ করি।

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

এই কোডটি নির্দিষ্ট স্থানে পেস্ট করুন" // (2) কোডের পরবর্তী অংশের জন্য স্থান".

/* গ্লোবাল অ্যারে $_POST-এ ফর্ম থেকে ডেটা পাঠানো হয়েছে কিনা তা পরীক্ষা করুন এবং জমা দেওয়া ডেটা নিয়মিত ভেরিয়েবলে মোড়ানো।*/ if(isset($_POST["first_name"]))( //শুরু থেকে স্পেস ট্রিম করুন এবং স্ট্রিং এর শেষ $first_name = trim($_POST["first_name"]); // শূন্যতার জন্য ভেরিয়েবল চেক করুন যদি(!empty($first_name))( // নিরাপত্তার জন্য, বিশেষ অক্ষরকে HTML সত্তায় রূপান্তর করুন $first_name = htmlspecialchars($first_name, ENT_QUOTES) ; )else( // সেশনে ত্রুটি বার্তা সংরক্ষণ করুন। $_SESSION["error_messages"] .= "

আপনার নাম প্রবেশ করুন

নাম ক্ষেত্র অনুপস্থিত

"; // ব্যবহারকারীকে রেজিস্ট্রেশন পৃষ্ঠার শিরোনামে ফেরত দিন("HTTP/1.1 301 স্থায়ীভাবে সরানো"); শিরোনাম("অবস্থান: ".$address_site."/form_register.php"); // স্ক্রিপ্ট প্রস্থান বন্ধ করুন(); ) if( isset($_POST["last_name"]))( // লাইনের শুরু এবং শেষ থেকে স্পেস ট্রিম করুন $last_name = trim($_POST["last_name"]); if(!empty($last_name)) ( // নিরাপত্তার জন্য, বিশেষ অক্ষরগুলিকে HTML সত্তায় রূপান্তর করুন $last_name = htmlspecialchars($last_name, ENT_QUOTES); ) অন্যথায়( // ত্রুটি বার্তাটি সেশনে সংরক্ষণ করুন। $_SESSION["error_messages"] .= "

তোমার নামের শেষ অংশ দাও

"; // ব্যবহারকারীকে রেজিস্ট্রেশন পৃষ্ঠার শিরোনামে ফেরত দিন("HTTP/1.1 301 স্থায়ীভাবে সরানো"); শিরোনাম("অবস্থান: ".$address_site."/form_register.php"); // স্ক্রিপ্ট প্রস্থান বন্ধ করুন(); ) )অন্যথা ( // সেশনে ত্রুটি বার্তা সংরক্ষণ করুন। $_SESSION["error_messages"] .="

পদবি ক্ষেত্র অনুপস্থিত

"; // ব্যবহারকারীকে রেজিস্ট্রেশন পৃষ্ঠার শিরোনামে ফেরত দিন("HTTP/1.1 301 স্থায়ীভাবে সরানো"); শিরোনাম("অবস্থান: ".$address_site."/form_register.php"); // স্ক্রিপ্ট প্রস্থান বন্ধ করুন(); ) if( isset($_POST["email"]))( // লাইনের শুরু এবং শেষ থেকে স্পেস ট্রিম করুন $email = trim($_POST["email"]); if(!empty($email)) ( $email = htmlspecialchars ($email, ENT_QUOTES); // (3) ইমেল ঠিকানার বিন্যাস এবং এর স্বতন্ত্রতা পরীক্ষা করার জন্য কোড অবস্থান) অন্যথায়( // ত্রুটি বার্তাটি সেশনে সংরক্ষণ করুন। $_SESSION["error_messages"] .="

তুমার ইমেইল প্রবেশ করাও

"; // ব্যবহারকারীকে রেজিস্ট্রেশন পৃষ্ঠার শিরোনামে ফেরত দিন("HTTP/1.1 301 স্থায়ীভাবে সরানো"); শিরোনাম("অবস্থান: ".$address_site."/form_register.php"); // স্ক্রিপ্ট প্রস্থান বন্ধ করুন(); ) )অন্যথা ( // সেশনে ত্রুটি বার্তা সংরক্ষণ করুন। $_SESSION["error_messages"] .="

"; // ব্যবহারকারীকে রেজিস্ট্রেশন পৃষ্ঠার শিরোনামে ফেরত দিন("HTTP/1.1 301 স্থায়ীভাবে সরানো"); শিরোনাম("অবস্থান: ".$address_site."/form_register.php"); // স্ক্রিপ্ট প্রস্থান বন্ধ করুন(); ) if( isset($_POST["password"]))( //স্ট্রিং এর শুরু এবং শেষ থেকে স্পেস ট্রিম করুন $password = trim($_POST["password"]); if(!empty($password)) ( $password = htmlspecialchars ($password, ENT_QUOTES); //পাসওয়ার্ডটি এনক্রিপ্ট করুন $password = md5($password."top_secret"); )অন্যথায়( // ত্রুটি বার্তাটি সেশনে সংরক্ষণ করুন। $_SESSION["error_messages"] .="

আপনার পাসওয়ার্ড লিখুন

"; // ব্যবহারকারীকে রেজিস্ট্রেশন পৃষ্ঠার শিরোনামে ফেরত দিন("HTTP/1.1 301 স্থায়ীভাবে সরানো"); শিরোনাম("অবস্থান: ".$address_site."/form_register.php"); // স্ক্রিপ্ট প্রস্থান বন্ধ করুন(); ) )অন্যথা ( // সেশনে ত্রুটি বার্তা সংরক্ষণ করুন। $_SESSION["error_messages"] .="

"; // ব্যবহারকারীকে রেজিস্ট্রেশন পৃষ্ঠার শিরোনামে ফেরত দিন("HTTP/1.1 301 স্থায়ীভাবে সরানো"); শিরোনাম("অবস্থান: ".$address_site."/form_register.php"); // স্ক্রিপ্ট প্রস্থান বন্ধ করুন(); ) // (4) ডাটাবেসে একজন ব্যবহারকারী যোগ করার জন্য কোডের জন্য স্থান

বিশেষ গুরুত্ব হল ক্ষেত্র ইমেইল. আমাদের অবশ্যই প্রাপ্ত ডাক ঠিকানার বিন্যাস এবং ডাটাবেসে এর স্বতন্ত্রতা পরীক্ষা করতে হবে। অর্থাৎ, একই ইমেল ঠিকানায় ইতিমধ্যে নিবন্ধিত কোনো ব্যবহারকারী আছে কি?

নির্দিষ্ট স্থানে" // (3) পোস্টাল ঠিকানার বিন্যাস এবং এর স্বতন্ত্রতা পরীক্ষা করতে কোড অবস্থান" নিম্নলিখিত কোড যোগ করুন:

//রেগুলার এক্সপ্রেশন $reg_email = "/^**@(+(*+)*\.)++/i" ব্যবহার করে প্রাপ্ত ইমেল ঠিকানার বিন্যাস চেক করুন; //যদি প্রাপ্ত ইমেল ঠিকানার বিন্যাস নিয়মিত অভিব্যক্তির সাথে মেলে না if(!preg_match($reg_email, $email))( // ত্রুটি বার্তাটি সেশনে সংরক্ষণ করুন। $_SESSION["error_messages"] .= "

আপনি একটি ভুল ইমেল প্রবেশ করান

"; // ব্যবহারকারীকে রেজিস্ট্রেশন পৃষ্ঠার শিরোনামে ফেরত দিন("HTTP/1.1 301 স্থায়ীভাবে সরানো"); শিরোনাম("অবস্থান: ".$address_site."/form_register.php"); // স্ক্রিপ্ট প্রস্থান বন্ধ করুন(); ) // আমরা এই ধরনের ঠিকানা ইতিমধ্যেই ডাটাবেসে আছে কিনা তা পরীক্ষা করি। $result_query = $mysqli->query("নির্বাচন করুন `ইমেল` ফ্রম `ব্যবহারকারী` যেখানে `ইমেল`="।"$ ইমেল।"""); / /যদি প্রাপ্ত সংখ্যা ঠিক একটি সারি থাকে, যার মানে এই ইমেল ঠিকানার ব্যবহারকারী ইতিমধ্যেই নিবন্ধিত যদি($result_query->num_rows == 1)( //যদি ফলাফলটি মিথ্যা না হয় যদি($row = $result_query->fetch_assoc()) != false) ( // ত্রুটি বার্তাটি সেশনে সংরক্ষণ করুন। $_SESSION["error_messages"] .="

এই ইমেল ঠিকানা সহ একটি ব্যবহারকারী ইতিমধ্যে নিবন্ধিত আছে

"; // ব্যবহারকারীকে নিবন্ধন পৃষ্ঠার শিরোনামে ফেরত দিন("HTTP/1.1 301 স্থায়ীভাবে সরানো"); শিরোনাম("অবস্থান: ".$address_site."/form_register.php"); )অন্যথায়(// ত্রুটি বার্তাটি সংরক্ষণ করুন অধিবেশনে। $_SESSION["error_messages"] .="

ডাটাবেস ক্যোয়ারীতে ত্রুটি

"; // ব্যবহারকারীকে নিবন্ধন পৃষ্ঠার শিরোনামে ফেরত দিন ("HTTP/1.1 301 স্থায়ীভাবে সরানো"); শিরোনাম ("অবস্থান: ".$address_site."/form_register.php"); ) /* নির্বাচন বন্ধ করা */ $ result_query-> ক্লোজ(); // স্ক্রিপ্ট প্রস্থান বন্ধ করুন(); ) /* নির্বাচন বন্ধ করুন */ $result_query->close();

এবং তাই, আমরা সমস্ত চেক সম্পন্ন করেছি, এটি ব্যবহারকারীকে ডাটাবেসে যুক্ত করার সময়। নির্দিষ্ট স্থানে" // (4) ডাটাবেসে একজন ব্যবহারকারী যোগ করার জন্য কোডের জন্য স্থান" নিম্নলিখিত কোড যোগ করুন:

//ডাটাবেসে একজন ব্যবহারকারী যোগ করার জন্য প্রশ্ন $result_query_insert = $mysqli->query("INSERT INTO `users` (first_name, last_name, email, password) VALUES ("".$first_name."", "".$last_name ." ", "।$ ইমেইল।", "।$ পাসওয়ার্ড।"")"); if(!$result_query_insert)( // ত্রুটি বার্তাটি সেশনে সংরক্ষণ করুন। $_SESSION["error_messages"] .= "

ডাটাবেসে ব্যবহারকারী যোগ করার অনুরোধে ত্রুটি

"; // ব্যবহারকারীকে রেজিস্ট্রেশন পৃষ্ঠার শিরোনামে ফেরত দিন("HTTP/1.1 301 স্থায়ীভাবে সরানো"); শিরোনাম("অবস্থান: ".$address_site."/form_register.php"); // স্ক্রিপ্ট প্রস্থান বন্ধ করুন(); )অন্যথায়( $_SESSION["success_messages"] = "

রেজিস্ট্রেশন সফলভাবে সম্পন্ন হয়েছে!!!
এখন আপনি আপনার ব্যবহারকারীর নাম এবং পাসওয়ার্ড ব্যবহার করে লগ ইন করতে পারেন।

"; // ব্যবহারকারীকে অনুমোদন পৃষ্ঠার শিরোনামে পাঠান("HTTP/1.1 301 স্থায়ীভাবে সরানো হয়েছে"); শিরোনাম ("অবস্থান: ".$address_site."/form_auth.php"); ) /* অনুরোধটি সম্পূর্ণ করা */ $ result_query_insert-> close(); //ডাটাবেসের সাথে সংযোগ বন্ধ করুন $mysqli->close();

যদি ডাটাবেসে একজন ব্যবহারকারীকে যুক্ত করার অনুরোধে একটি ত্রুটি ঘটে, আমরা সেশনে এই ত্রুটি সম্পর্কে একটি বার্তা যুক্ত করি এবং ব্যবহারকারীকে নিবন্ধন পৃষ্ঠায় ফিরিয়ে দিই।

অন্যথায়, সবকিছু ঠিকঠাক থাকলে, আমরা সেশনে একটি বার্তাও যোগ করি, কিন্তু এবার এটি আরও আনন্দদায়ক, যেমন আমরা ব্যবহারকারীকে বলি যে নিবন্ধন সফল হয়েছে। এবং আমরা অনুমোদনের ফর্ম সহ এটিকে পৃষ্ঠায় পুনঃনির্দেশ করি৷

ইমেল ঠিকানা বিন্যাস এবং পাসওয়ার্ডের দৈর্ঘ্য পরীক্ষা করার জন্য স্ক্রিপ্ট ফাইলটিতে রয়েছে header.php, তাই এটি এই ফর্ম থেকে ক্ষেত্রগুলিতেও প্রযোজ্য হবে৷

ফাইলে সেশনও শুরু হয় header.php, তাই ফাইলে form_auth.phpএকটি অধিবেশন শুরু করার কোন প্রয়োজন নেই, কারণ আমরা একটি ত্রুটি পেতে হবে.


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

ত্রুটিগুলি ঠিক করার পরে, বোতামটি আসতেসক্রিয় হয়ে ওঠে, এবং ব্যবহারকারী সার্ভারে ফর্মটি জমা দিতে সক্ষম হবে, যেখানে এটি প্রক্রিয়া করা হবে।

ব্যবহারকারীর অনুমোদন

মান বৈশিষ্ট্য কর্মঅনুমোদন প্রতিবন্ধকতা একটি নির্দিষ্ট ফাইল আছে auth.php, এর মানে হল যে ফর্মটি এই ফাইলে প্রক্রিয়া করা হবে।

এবং তাই, ফাইল খুলুন auth.phpএবং অনুমোদন ফর্ম প্রক্রিয়া করার জন্য কোড লিখুন। আপনাকে প্রথমে একটি সেশন শুরু করতে হবে এবং ফাইলটি সংযুক্ত করতে হবে dbconnect.phpডাটাবেসের সাথে সংযোগ করতে।

আপনি সাইট থেকে প্রস্থান লিঙ্কে ক্লিক করলে, আমরা একটি ফাইলে নিয়ে যাই logout.php, যেখানে আমরা সেশন থেকে ইমেল ঠিকানা এবং পাসওয়ার্ড সহ কোষগুলিকে ধ্বংস করি। এর পরে, আমরা ব্যবহারকারীকে সেই পৃষ্ঠায় ফিরিয়ে দিই যেখানে লিঙ্কটি ক্লিক করা হয়েছিল প্রস্থান.

ফাইল কোড logout.php:

এখানেই শেষ. এখন আপনি জানেন কিভাবে আপনার ওয়েবসাইটে ব্যবহারকারীর নিবন্ধন এবং অনুমোদনের ফর্মগুলি বাস্তবায়ন এবং প্রক্রিয়া করতে হয়৷ এই ফর্মগুলি প্রায় প্রতিটি ওয়েবসাইটে পাওয়া যায়, তাই প্রতিটি প্রোগ্রামারকে সেগুলি কীভাবে তৈরি করতে হয় তা জানা উচিত।

আমরা ক্লায়েন্ট সাইডে (ব্রাউজারে, জাভাস্ক্রিপ্ট, jQuery ব্যবহার করে) এবং সার্ভার সাইডে (PHP ব্যবহার করে) উভয় ক্ষেত্রে ইনপুট ডেটা যাচাই করতে শিখেছি। আমরা সাইট ছেড়ে যাওয়ার জন্য একটি পদ্ধতি কিভাবে বাস্তবায়ন করতে হয় তাও শিখেছি।

সমস্ত স্ক্রিপ্ট পরীক্ষা করা হয়েছে এবং কাজ করছে. আপনি এই লিঙ্ক থেকে এই ছোট সাইটের ফাইল সহ আর্কাইভ ডাউনলোড করতে পারেন।

ভবিষ্যতে আমি একটি নিবন্ধ লিখব যেখানে আমি বর্ণনা করব। এবং আমি একটি নিবন্ধ লেখার পরিকল্পনা করেছি যেখানে আমি ব্যাখ্যা করব (পৃষ্ঠাটি পুনরায় লোড না করে)। সুতরাং, নতুন নিবন্ধ প্রকাশ সম্পর্কে অবগত থাকার জন্য, আপনি আমার ওয়েবসাইটে সাবস্ক্রাইব করতে পারেন।

যদি আপনার কোন প্রশ্ন থাকে, আমার সাথে যোগাযোগ করুন, এবং আপনি যদি নিবন্ধে কোন ত্রুটি লক্ষ্য করেন, দয়া করে আমাকে জানান।

পাঠ পরিকল্পনা (অংশ 5):

  • অনুমোদন ফর্মের জন্য একটি HTML কাঠামো তৈরি করা
  • আমরা প্রাপ্ত ডেটা প্রক্রিয়া করি
  • আমরা সাইটের হেডারে ব্যবহারকারীর শুভেচ্ছা প্রদর্শন করি
  • আপনি নিবন্ধটি পছন্দ করেছেন?

    আমি জানি না কেন... না, আমি জানি কেন আপনি register_globals নির্দেশিকা সক্ষম করতে পারবেন না, কিন্তু আমি জানি না কেন সাহিত্যে, একটি নিয়ম হিসাবে, এই সম্পর্কে কিছুই বলা হয় না।

    এই নিবন্ধে আমি এটিতে বসে থাকা সবাইকে ট্যাঙ্ক থেকে বের করে আনার চেষ্টা করব এবং কী তা ব্যাখ্যা করব (বিশেষত সাঁজোয়া ট্রেনে যারা আছেন - সম্পাদকের নোট)। এটি কিছুর জন্য নয় যে কিছু হোস্টার এই নির্দেশটি অক্ষম করে। তাই…

    কিভাবে এটা কাজ করে

    পিএইচপি সেটিংসে (php.ini ফাইল) এমন একটি রেজিস্টার_গ্লোবালস নির্দেশিকা রয়েছে। এর অর্থ হল যদি এটি সক্ষম করা হয় (register_globals = চালু), তাহলে GET এবং POST এর মাধ্যমে পাস করা সমস্ত ভেরিয়েবল স্বয়ংক্রিয়ভাবে বিশ্বব্যাপী নিবন্ধিত হবে। এর মানে কী?

    উদাহরণস্বরূপ, আমরা GET পদ্ধতিটি index.php স্ক্রিপ্টে কিছু পৃষ্ঠা মান পাস করি: index.php?page=2। পাস করা মান একটি GET অ্যারেতে সংরক্ষণ করা হয় এবং $_GET["পৃষ্ঠা"] হিসাবে একটি স্ক্রিপ্টে ব্যবহার করা যেতে পারে। যাইহোক, যদি আমাদের register_globals সক্রিয় থাকে, তাহলে পাস করা মানের জন্য একটি $page ভেরিয়েবল তৈরি করা হবে, যা index.php স্ক্রিপ্টের যেকোনো অংশে পাওয়া যায়।

    একটি ছোট সারসংক্ষেপ এবং সংযোজন। যখন register_globals সক্ষম করা হয়, তখন ভেরিয়েবলের তিনটি কপি তৈরি করা হয়: GET অ্যারেতে, GLOBALS অ্যারেতে এবং কেবলমাত্র ভেরিয়েবলটি নিজেই ($_GET["page"], $GLOBALS["page"], $page), যখন যখন register_globals নিষ্ক্রিয় করা হয়, পাস করা মান শুধুমাত্র GET অ্যারে ($_GET["পৃষ্ঠা"]) এর মাধ্যমে অ্যাক্সেসযোগ্য হতে পারে। মনে রাখবেন।

    ব্যবহারের বিপদ

    আমাদের জন্য কী রয়েছে তা বোঝার জন্য আসুন একটি সাধারণ উদাহরণ দেখি (3 থেকে 5 বছর পর্যন্ত - সম্পাদকের মন্তব্য) এটি সহজ করার জন্য, আমি এখনই বলব যে $login এবং $password হল GET/POST পদ্ধতি দ্বারা পাস করা ভেরিয়েবল।

    স্ক্রিপ্টটি কী করে সে সম্পর্কে সংক্ষেপে:

      লাইন 2. ব্যবহারকারীর প্রবেশ করা লগইনের আসল পাসওয়ার্ড বের করার জন্য আমরা ডাটাবেসের কাছে একটি অনুরোধ করি।

      লাইন 3. আমরা এই পাসওয়ার্ডটি পাই এবং এটি $real_pass ভেরিয়েবলে বরাদ্দ করি।

      লাইন 4. আমরা আসল এবং প্রবেশ করা পাসওয়ার্ডের তুলনা করি এবং যদি সেগুলি মিলে যায়, তাহলে $চেক ভেরিয়েবলটিকে সত্য বরাদ্দ করা হবে।

      লাইন 5-8। যদি $চেক সত্য হয়, তাহলে আমরা লিখি যে অনুমোদন সফল হয়েছে, ইত্যাদি।

    প্রস্তাবিত দৃশ্যকল্প, সংজ্ঞা দ্বারা, বিশ্বের সবচেয়ে ফুটো, এবং এখন আমি এই গর্ত দেখাব. শর্ত: register_globals সক্ষম।

    ধরা যাক GET পদ্ধতি ব্যবহার করে স্থানান্তর করা হয়। তারপর url এই মত কিছু দেখাবে:
    www.site.com/index.php?login =admin&password =qwerty
    এটা স্পষ্ট যে বিশ্বব্যাপী ভেরিয়েবল $login এবং $password অবিলম্বে তৈরি করা হয়। এখন স্ক্রিপ্ট দেখুন। এটি $চেক ভেরিয়েবল ধারণ করে। আপনি যদি URL এর মাধ্যমে এটি পাস করেন?

    www.site.com/index.php?login =admin&password =qwerty&check =1
    তারপরে পাসওয়ার্ড ম্যাচিং চেকটি বাইপাস করা হয় এবং ব্যবহারকারীকে অবিলম্বে অনুমোদিত করা হয় (সবার পরে, আপনি কি মনে রাখবেন যে 1 সত্য, এবং 0 মিথ্যা?) আমরা লিখলে একই ফলাফল ঘটবে www.সাইটcom/সূচকphp?চেক =1 . এমনকি যদি আপনি POST পদ্ধতি ব্যবহার করেন, তবুও এই ধরনের সমস্ত জালিয়াতি কাজ করবে, যেহেতু register_globals সক্রিয় করা থাকে, আপনি কোন পদ্ধতি ব্যবহার করেন - GET বা POST তা বিবেচ্য নয়।

    আমি মনে করি কেউ একটি প্রশ্ন আছে, কিভাবে একটি ক্র্যাকার চেক ভেরিয়েবল সম্পর্কে জানতে পারে যে এটি সবকিছুর জন্য দায়ী? আপনি যদি কাউকে স্ক্রিপ্টটি না দেখিয়ে থাকেন তবে তাদের এটি জানার সম্ভাবনা নেই। যাইহোক, সবাই তাদের নিজস্ব স্ক্রিপ্ট, CMS, ইত্যাদি ব্যবহার করে না, কিন্তু নেটওয়ার্কে যা পাওয়া যায় তা ব্যবহার করে। এই ধরনের ক্ষেত্রে, একটি ক্র্যাকার, উদাহরণস্বরূপ, CMS কোড অধ্যয়ন করতে পারে এবং এর সাহায্যে তৈরি করা সাইটগুলিকে আক্রমণ করতে পারে।

    যাইহোক, সমস্ত হোস্টার রেজিস্টার_গ্লোবালগুলি অক্ষম করে না, এবং এমনকি যদি আপনার স্ক্রিপ্টগুলিকে রেজিস্টার_গ্লোবাল সক্ষম না করার জন্য ডিজাইন করা হয়, তবুও একটি ক্র্যাকার এই নির্দেশের দুর্বলতা ব্যবহার করে আপনার স্ক্রিপ্ট হ্যাক করতে পারে।

    আমাদের উদাহরণ নেওয়া যাক. লাইনের পরে রেজিস্টার_গ্লোবালস সক্ষম হলে এটি রক্ষা করতে যদি ($পাসওয়ার্ড==$বাস্তব_পাস)$চেক =সত্যনিম্নলিখিত যোগ করুন: অন্য $চেক =মিথ্যা. এই ক্ষেত্রে, এমনকি যদি একটির সমান চেক ভেরিয়েবল GET পদ্ধতিতে পাস করা হয়, তাহলেও যদি পাসওয়ার্ডটি ভুল হয় তাহলে স্ক্রিপ্টটি $check=false সেট করবে।

    হ্যাঁ, আমি আপনার দৃষ্টি আকর্ষণ করতে চাই যে আপনি যদি register_globals বন্ধ করে দেন, তাহলে আমাদের উদাহরণ কাজ করবে না। এবং এটি কাজ করার জন্য, আপনাকে লিখতে হবে $login = $_POST["login"]; $password = $_POST["পাসওয়ার্ড"];

    এর সংক্ষিপ্তসার করা যাক...

    এবং দুটি প্রধান উপসংহার আঁকুন:

    1) register_globals সক্রিয় করা হলে, আপনি বিভিন্ন ভেরিয়েবল পাস করতে পারেন, যে মানগুলির জন্য GET বা POST এর মাধ্যমে প্রাপ্ত করার জন্য গণনা করা হয়নি।

    2) Register_globals নিজেই একটি কুটিল লিখিত স্ক্রিপ্ট হিসাবে এতটা বিপজ্জনক নয়।

    আজ যে জন্য সব! আমি আপনার মন্তব্য, মন্তব্য, পরামর্শ এবং শুধু প্রতিক্রিয়া দেখতে খুব খুশি হবে. অতএব, লিখুন, লজ্জা পাবেন না!

    একটি সফল সপ্তাহের শুভেচ্ছা সহ,
    আলেকজান্ডার শুইস্কি