امنیت سمت کاربر در وب

تیم آرادتیم مهندسی

بحث امنیت معمولاً به سمت سرور محدود می‌شود. اما بخشی از حمله‌ها در مرورگر کاربر اتفاق می‌افتند و سرور شما هیچ‌وقت متوجه نمی‌شود.

و همهٔ آنها از یک اشتباه بنیادی می‌آیند: اعتماد به چیزی که در مرورگر اجرا می‌شود.

قاعدهٔ پایه

هر چیزی که در مرورگر است، قابل دیدن و تغییر است. کد شما، داده‌ای که می‌فرستید، اعتبارسنجی‌هایی که نوشته‌اید.

پس:

اعتبارسنجی سمت کاربر، تجربهٔ کاربری است نه امنیت. پیام «ایمیل معتبر نیست» برای کمک به کاربر است. سرور باید همان بررسی را دوباره انجام دهد.

هیچ کلید مخفی در کد فرانت‌اند نگذارید. قابل استخراج است.

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

XSS — تزریق اسکریپت

شایع‌ترین آسیب‌پذیری سمت کاربر.

چه اتفاقی می‌افتد: مهاجم کدی را در جایی وارد می‌کند که به کاربران دیگر نمایش داده می‌شود — نظر، نام پروفایل، پیام. آن کد در مرورگر قربانی اجرا می‌شود، با تمام دسترسی‌های او.

چه می‌تواند بکند: توکن را بدزدد، از طرف کاربر درخواست بفرستد، فرم جعلی نشان دهد، محتوای صفحه را عوض کند.

چه چیزی جلویش را می‌گیرد:

گریزدادن خروجی، همیشه. هر داده‌ای که از کاربر آمده و نمایش داده می‌شود باید به‌عنوان متن رندر شود نه HTML. فریمورک‌های امروزی این کار را پیش‌فرض انجام می‌دهند — مگر جایی که شما صریحاً دورش بزنید. آن توابع «تزریق مستقیم HTML» را فقط با محتوای کاملاً مطمئن استفاده کنید.

سیاست امنیت محتوا (CSP). سرصفحه‌ای که می‌گوید اسکریپت فقط از کجا اجازهٔ اجرا دارد. مؤثرترین لایهٔ دفاعی دوم — حتی اگر تزریقی رخ دهد، اجرا نمی‌شود.

پاک‌سازی HTML ورودی، اگر واقعاً باید HTML بپذیرید — با کتابخانهٔ معتبر، نه با فیلتر دست‌ساز.

CSRF — جعل درخواست

چه اتفاقی می‌افتد: کاربر در سایت شما وارد است. سایت دیگری او را وادار می‌کند درخواستی به سایت شما بفرستد — و مرورگر کوکی‌اش را خودکار همراه می‌کند.

چه چیزی جلویش را می‌گیرد:

  • SameSite روی کوکی نشست. مقدار Lax یا Strict. امروز پیش‌فرض بیشتر مرورگرهاست ولی صریح تنظیمش کنید.
  • توکن CSRF برای فرم‌ها.
  • عملیات تغییردهنده فقط با POST، نه GET.

کجا توکن را نگه داریم

سؤالی که جواب‌های اینترنتی‌اش متناقض است:

در localStorage: ساده، و در برابر XSS بی‌دفاع. هر اسکریپتی که در صفحه اجرا شود می‌خواندش.

در کوکی با HttpOnly: جاوااسکریپت دسترسی ندارد. باید Secure و SameSite هم داشته باشد.

توصیهٔ ما برای وب: کوکی. جزئیات کاملش در احراز هویت و SSO — و برای اپلیکیشن موبایل جواب متفاوت است، که در امنیت اپلیکیشن موبایل آمده.

چند مورد کمتر گفته‌شده

کلیک‌ربایی. سایت شما در قابی نامرئی روی سایت مهاجم قرار می‌گیرد و کاربر ناخواسته کلیک می‌کند. با سرصفحهٔ X-Frame-Options یا دستور frame-ancestors در CSP حل می‌شود.

نشت از طریق ارجاع‌دهنده. اگر آدرس صفحهٔ شما اطلاعات حساس دارد — توکن بازیابی، شناسه — هنگام کلیک روی لینک بیرونی، آن آدرس برای مقصد فرستاده می‌شود. اطلاعات حساس را در آدرس نگذارید، و Referrer-Policy تنظیم کنید.

کتابخانه‌های شخص ثالث. هر اسکریپتی که به صفحه اضافه می‌کنید، دسترسی کامل به آن صفحه دارد. ابزار تحلیل، چت آنلاین و ویجت تبلیغاتی، همه می‌توانند فرم شما را بخوانند. برای صفحات حساس — پرداخت، ورود — تعداد اسکریپت‌های بیرونی را به حداقل برسانید.

داده در حافظهٔ محلی. localStorage جای دادهٔ حساس نیست. پاک هم نمی‌شود مگر صریحاً پاکش کنید.

کش مرورگر روی صفحات حساس. کاربری که خارج شده و دکمهٔ برگشت را می‌زند، نباید داده ببیند.

سرصفحه‌های امنیتی

مجموعه‌ای که تنظیمشان کم‌هزینه‌ترین بهبود امنیتی ممکن است:

سرصفحه چه می‌کند
Content-Security-Policy محدود کردن منابع مجاز
Strict-Transport-Security اجبار HTTPS
X-Content-Type-Options: nosniff جلوگیری از حدس نوع فایل
X-Frame-Options جلوگیری از قاب‌شدن
Referrer-Policy کنترل اطلاعات ارسالی

بیشترشان یک خط تنظیم در سرور یا CDN‌اند. CSP سخت‌ترین است — چون معمولاً اول چیزهایی را می‌شکند — ولی بیشترین ارزش را دارد. با حالت گزارش‌دهی شروع کنید تا ببینید چه چیزی مسدود می‌شود، بعد اجباری‌اش کنید.

آپلود فایل

نقطه‌ای که هم فرانت و هم بک درگیرند و مکرر اشتباه می‌شود:

  • نوع فایل را در سرور بررسی کنید، بر اساس محتوا نه پسوند.
  • فایل‌های کاربران را از دامنهٔ دیگری سرو کنید، نه دامنهٔ اصلی — تا حتی اگر فایل مخربی آپلود شد، در بستر دامنهٔ شما اجرا نشود.
  • نام فایل را بازنویسی کنید.
  • حجم و تعداد را محدود کنید.

چک‌لیست

  • هیچ کلید مخفی در کد فرانت‌اند نیست
  • هر بررسی دسترسی در سرور تکرار می‌شود
  • خروجی داده‌های کاربر گریز داده می‌شود
  • CSP تنظیم شده
  • کوکی نشست: HttpOnly، Secure، SameSite
  • محافظت CSRF روی فرم‌ها
  • سرصفحه‌های امنیتی تنظیم شده‌اند
  • اطلاعات حساس در آدرس نیست
  • فایل‌های کاربران از دامنهٔ جدا سرو می‌شوند
  • وابستگی‌های آسیب‌پذیر بررسی می‌شوند

بند آخر باید خودکار باشد و در خط لولهٔ CI/CD بنشیند — چون وابستگی امنی که امروز نصب کرده‌اید، سال بعد آسیب‌پذیر شناخته می‌شود و کسی دستی متوجه نمی‌شود.

پروژه یا ایده‌ای دارید؟

متخصصین ما آماده برگزاری یک جلسه مشاوره رایگان هستند.

مشاوره رایگان

پروژه‌تان را با هم بررسی کنیم

جلسهٔ اول رایگان است و معمولاً همان یک جلسه روشن می‌کند پروژه چقدر کار دارد.

چطور با شما تماس بگیریم؟

برای هماهنگی سریع‌تر — اگر تماس تلفنی را ترجیح نمی‌دهید، همان شماره را در پیام‌رسان پیام می‌دهیم.

راه دوم برای رساندن پاسخ — اگر تلفن در دسترس نبود، ایمیل می‌زنیم.

در حال ارسال…

درخواست شما ثبت شد.

همکاران ما پیام شما را می‌بینند و با شما تماس می‌گیرند.