</>مدرسه زیب‌موجیاد بگیر، تمرین کن، بساز
مدرسهPHPدرس 53
درس 53 از 80 · ۷۰ دقیقه

XSS، CSRF و اصل اعتماد نکردن به ورودی

XSS داده را به کد قابل اجرا در مرورگر تبدیل می‌کند. CSRF از Session فعال قربانی برای ارسال عملیات ناخواسته استفاده می‌کند. دفاع این دو متفاوت است.

۰امتیاز شما
نقشه این درس

بعد از این درس دقیقاً چه بلدی؟

  • موضوع «Output escaping» را با زبان ساده برای فرد دیگری توضیح می‌دهی.
  • مثال همین درس را خط‌به‌خط می‌خوانی و خروجی آن را پیش‌بینی می‌کنی.
  • کد را تغییر می‌دهی، نتیجه یا ساختار آن را بررسی می‌کنی و خطا را مرحله‌ای اصلاح می‌کنی.
به زبان زندگی واقعی

متن نامه و دستور جعلی

XSS یعنی متن نامه داخل سیستم به‌اشتباه فرمان اجرا شود؛ CSRF یعنی کسی با هویت تو نامه عملیاتی بفرستد.

نکته مهم برای شروع PHP

XSS داده را به کد قابل اجرا در مرورگر تبدیل می‌کند. CSRF از Session فعال قربانی برای ارسال عملیات ناخواسته استفاده می‌کند. دفاع این دو متفاوت است.

چرا مهم است؟ این مفهوم یکی از آجرهای مسیر حرفه‌ای PHP است. فعلاً لازم نیست همه جزئیات را حفظ کنی؛ باید دلیل استفاده و اثر هر خط را بفهمی.

اولین تمرین تو: نام با htmlspecialchars نمایش داده می‌شود و فرم POST همراه Token غیرقابل حدس و بررسی زمان‌ثابت است.

مفهوم‌های اصلی

اول بفهم، بعد کد بنویس

Output escaping

داده را بر اساس زمینه HTML، Attribute یا URL امن می‌کند.

CSRF token

درخواست تغییر داده را به فرم و Session واقعی کاربر متصل می‌کند.

SameSite cookie

ارسال Cookie در بعضی درخواست‌های بین‌سایتی را محدود می‌کند.

سناریوی واقعی

ویرایش نام نمایشی

نام با htmlspecialchars نمایش داده می‌شود و فرم POST همراه Token غیرقابل حدس و بررسی زمان‌ثابت است.

ورودی روشنقانون قابل توضیحخروجی قابل بررسی
بازی ساختن کد

قطعه‌ها را به ترتیب درست بچین

روی هر قطعه بزن تا وارد پاسخ شود؛ برای برگرداندن دوباره روی آن بزن. با دکمه‌های جابه‌جایی هم می‌توانی بدون کشیدن و رهاکردن ترتیب را اصلاح کنی.

مرحله ۲ از ۳ · مرتب‌کردن کد
بانک قطعه‌هاقطعه مناسب را انتخاب کن
ترتیب پاسخ تواز بالا به پایین اجرا می‌شود

    هنوز پاسخی بررسی نشده است.

    کارگاه تعاملی

    کد را کامل کن و ساختار آن را بررسی کن

    این درس وارد قابلیت‌های سروری یا حرفه‌ای شده است. برای امنیت سایت، کد دلخواه روی سرور اجرا نمی‌شود؛ بررسی‌گر، وجود اجزای ضروری و منطق مورد انتظار را کنترل می‌کند و راهنمای اصلاح می‌دهد.

    lesson-53.php
    گزارش بررسیبررسی‌گر ساختار آماده است
    کد را کامل کن و «بررسی ساختار» را بزن.
    در مثال‌های پیشرفته، اجرای ناامن سروری نداریم؛ اجزای ضروری کد بررسی می‌شوند.
    کدخوانی استاد

    این مثال خط‌به‌خط چه می‌گوید؟

    فعلاً حفظ نکن؛ هر خط را به یک جمله ساده تبدیل کن.

    1. 1<?php

      از اینجا مفسر PHP شروع به خواندن کد می‌کند.

    2. 2$token = $_POST["csrf_token"] ?? "";

      یک مقدار با نام $token نگه‌داری می‌شود تا در خط‌های بعد دوباره استفاده شود.

    3. 3$stored = $_SESSION["csrf_token"] ?? "";

      یک مقدار با نام $stored نگه‌داری می‌شود تا در خط‌های بعد دوباره استفاده شود.

    4. 4if ($stored === "" || ! hash_equals($stored, $token)) {

      یک پرسش درست/نادرست بررسی می‌شود و مسیر اجرای بعدی را تعیین می‌کند.

    5. 5throw new RuntimeException("درخواست معتبر نیست");

      این خط بخشی از منطق اصلی مثال است؛ نام‌ها و علامت‌ها را از راست به چپ، بخش‌به‌بخش بخوان.

    6. 6}

      مرز یک بلوک یا فراخوانی در اینجا باز یا بسته می‌شود.

    7. 7echo htmlspecialchars($displayName, ENT_QUOTES, "UTF-8");

      نتیجه این عبارت به خروجی پاسخ فرستاده می‌شود.

    منبع رسمی همین درسمستندات اصلی PHP را ببین ←برای عمیق‌ترشدن؛ لازم نیست در شروع همه آن را بخوانی.
    حالا نوبت توست

    Token را با random_bytes بساز و Cookie را با Secure، HttpOnly و SameSite تنظیم کن.

    تمرین پلکانی

    از ساده به چالشی، بدون پرش

    ۱ · گرم‌کردن

    یکی از مقدارهای مثال را عوض کن، خروجی را روی کاغذ حدس بزن و سپس بررسی کن.

    ۲ · تثبیت

    Token را با random_bytes بساز و Cookie را با Secure، HttpOnly و SameSite تنظیم کن.

    ۳ · ساختن

    سناریوی «ویرایش نام نمایشی» را با نام‌های واضح‌تر و یک حالت تازه گسترش بده.

    دام‌های رایج

    این سه اشتباه را انجام نده

    1

    استفاده از یک Escape برای همه زمینه‌ها

    2

    Token ثابت برای همه کاربران

    3

    استفاده از GET برای عملیات تغییردهنده

    آزمون پایان درس

    5 پرسش کوتاه؛ مطمئن شو واقعاً یاد گرفته‌ای

    برای هر پرسش یک پاسخ انتخاب کن. بعد از هر انتخاب، دلیل پاسخ را همان‌جا می‌بینی.

    پرسش 1 از 5

    دفاع اصلی نمایش متن کاربر در HTML چیست؟

    پرسش 2 از 5

    کدام توضیح، «Output escaping» را دقیق‌تر بیان می‌کند؟

    پرسش 3 از 5

    بهترین قدم بعد از خواندن مثال این درس چیست؟

    پرسش 4 از 5

    کدام روش نشان می‌دهد این درس را واقعاً فهمیده‌ای؟

    پرسش 5 از 5

    کدام رفتار احتمال خطا را در همین موضوع بیشتر می‌کند؟

    پایان درس 53

    درس را فقط وقتی تمام کن که کد را تغییر داده‌ای

    دیدن آموزش کافی نیست؛ یک مقدار را تغییر بده، خروجی را پیش‌بینی کن و بعد اجرا بزن.