diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php
new file mode 100644
index 0000000..5bea0a5
--- /dev/null
+++ b/app/Http/Controllers/UserController.php
@@ -0,0 +1,105 @@
+route('login');
+ }
+
+ // ==========================================
+ // راهاندازی آزمایشگاه
+ // ==========================================
+ public function setupLab()
+ {
+ User::firstOrCreate(
+ ['email' => 'victim@webapp.kr-rezvan.ir'],
+ [
+ 'name' => 'کاربر قربانی',
+ 'password' => Hash::make('12345678')
+ ]
+ );
+
+ return "
+
آزمایشگاه آماده شد! 🧪
+
کاربر هدف (victim@webapp.kr-rezvan.ir) با رمز عبور (12345678) در دیتابیس ساخته شد.
+
رفتن به صفحه لاگین
+
";
+ }
+
+ // ==========================================
+ // نمایش فرم ورود
+ // ==========================================
+ public function showLogin()
+ {
+ return view('user.login');
+ }
+
+ // ==========================================
+ // پردازش ورود کاربر
+ // ==========================================
+ public function login(Request $request)
+ {
+ $credentials = $request->only('email', 'password');
+
+ if (Auth::attempt($credentials)) {
+ return redirect()->route('user.profile');
+ }
+
+ return back()->withErrors(['message' => 'اطلاعات ورود صحیح نیست.']);
+ }
+
+ // ==========================================
+ // خروج کاربر
+ // ==========================================
+ public function logout()
+ {
+ Auth::logout();
+ return redirect()->route('login');
+ }
+
+ // ==========================================
+ // نمایش پروفایل کاربری
+ // ==========================================
+ public function profile()
+ {
+ return view('user.profile', ['user' => Auth::user()]);
+ }
+
+ // ==========================================
+ // متد آسیبپذیر تغییر ایمیل (CSRF Target)
+ // ==========================================
+ public function updateEmail(Request $request)
+ {
+ // بررسی اعتبار کوکی نشست (آیا SameSite اجازه ارسال کوکی را داده است؟)
+ if (!Auth::check()) {
+ return response()->json([
+ 'error' => 'شما لاگین نیستید. مرورگر کوکی نشست را بلاک کرده است! (محافظت SameSite عمل کرد)'
+ ], 401);
+ }
+
+ $user = Auth::user();
+ $oldEmail = $user->email;
+
+ // اعمال تغییرات مخرب در دیتابیس
+ $user->email = $request->input('email');
+ $user->save();
+
+ return response()->json([
+ 'status' => 'success',
+ 'message' => 'حمله موفق! ایمیل کاربر در دیتابیس تغییر یافت.',
+ 'old_email' => $oldEmail,
+ 'new_email' => $user->email
+ ]);
+ }
+}
\ No newline at end of file
diff --git a/resources/views/user/login.blade.php b/resources/views/user/login.blade.php
new file mode 100644
index 0000000..9e7d2ac
--- /dev/null
+++ b/resources/views/user/login.blade.php
@@ -0,0 +1,39 @@
+
+
+
+
+ ورود به سیستم | آزمایشگاه امنیت
+
+
+
+
+
+
ورود به حساب کاربری
+
+ @if($errors->any())
+
{{ $errors->first() }}
+ @endif
+
+
+
+
برای تنظیم اولیه پایگاه داده اینجا کلیک کنید.
+
+
+
+
\ No newline at end of file
diff --git a/resources/views/user/profile.blade.php b/resources/views/user/profile.blade.php
new file mode 100644
index 0000000..f3f6ffa
--- /dev/null
+++ b/resources/views/user/profile.blade.php
@@ -0,0 +1,7 @@
+
+
پنل کاربری (سایت قربانی)
+
سلام {{ $user->name }} خوش آمدید.
+
ایمیل فعلی شما: {{ $user->email }}
+
+
خروج از سیستم
+
\ No newline at end of file
diff --git a/routes/web.php b/routes/web.php
index 476ec11..fdcc7b9 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -1,59 +1,41 @@
'victim@webapp.kr-rezvan.ir'],
- [
- 'name' => 'کاربر قربانی',
- 'password' => Hash::make('12345678')
- ]
- );
- return "آزمایشگاه آماده شد! کاربر هدف (victim@webapp.kr-rezvan.ir) در دیتابیس ساخته شد.";
+// ==========================================
+// صفحه اصلی
+// ==========================================
+Route::get('/', [UserController::class, 'home'])->name('home');
+
+
+// ==========================================
+// ۱. راهاندازی سریع آزمایشگاه (مرحله اول)
+// ==========================================
+Route::get('/setup-lab', [UserController::class, 'setupLab'])->name('setup.lab');
+
+
+// ==========================================
+// ۲. سیستم احراز هویت (Authentication)
+// ==========================================
+Route::get('/login', [UserController::class, 'showLogin'])->name('login');
+Route::post('/login', [UserController::class, 'login'])->name('login.submit');
+// نکته امنیتی: خروج در حالت استاندارد باید POST باشد اما برای راحتی تست در لابراتوار GET قرار دادیم
+Route::get('/logout', [UserController::class, 'logout'])->name('logout');
+
+
+// ==========================================
+// ۳. پنل کاربری (محافظت شده با نشست)
+// ==========================================
+Route::middleware(['web', 'auth'])->group(function () {
+ Route::get('/profile', [UserController::class, 'profile'])->name('user.profile');
});
-// ۲. شبیهسازی ورود کاربر به سیستم
-Route::get('/login-victim', function () {
- if (Auth::attempt(['email' => 'victim@webapp.kr-rezvan.ir', 'password' => '12345678'])) {
- return "هویت شما تایید شد. کوکی نشست صادر و در دیتابیس ثبت گردید.";
- }
- return "خطا در ورود.";
-});
-// ۳. بررسی وضعیت پروفایل (برای بررسی موفقیتآمیز بودن حمله)
-Route::get('/profile', function () {
- if (Auth::check()) {
- return "شما لاگین هستید. ایمیل فعلی شما: " . Auth::user()->email . "";
- }
- return "شما لاگین نیستید! (احتمالاً کوکی به درستی ارسال نشده است).";
-});
-
-// ۴. نقطه آسیبپذیر (هدف حمله CSRF)
-Route::post('/update-email', function (Request $request) {
- // اگر کوکی معتبر ارسال نشود، لاراول این کاربر را ناشناس میداند
- if (!Auth::check()) {
- return response()->json(['error' => 'دسترسی غیرمجاز. مرورگر کوکی نشست را ارسال نکرد.'], 401);
- }
-
- $user = Auth::user();
- $oldEmail = $user->email;
-
- // تغییر در دیتابیس واقعی
- $user->email = $request->input('email');
- $user->save();
-
- return response()->json([
- 'status' => 'success',
- 'message' => 'ایمیل در دیتابیس تغییر یافت!',
- 'old' => $oldEmail,
- 'new' => $user->email,
- 'session_id' => session()->getId()
- ]);
-})->withoutMiddleware([VerifyCsrfToken::class]);
\ No newline at end of file
+// ==========================================
+// ۴. هدف حمله CSRF (آسیبپذیر)
+// ==========================================
+Route::post('/update-email', [UserController::class, 'updateEmail'])
+ ->withoutMiddleware([VerifyCsrfToken::class])
+ ->name('vulnerable.update.email');
\ No newline at end of file