دسته: امنیت سایبری

  • ده اشتباه رایج در SQL که سرعت پایگاه داده شما را پایین می‌آورد

    ده اشتباه رایج در SQL که سرعت پایگاه داده شما را پایین می‌آورد

    SQL ستون فقرات تقریباً تمام اپلیکیشن‌های مدرن است؛ اما متأسفانه یکی از ابزارهایی است که بیش از هر چیز دیگر مورد سوءاستفاده توسعه‌دهندگان قرار می‌گیرد. از استفاده بی‌ملاحظه از SELECT * گرفته تا نادیده‌گرفتن ایندکس‌ها و محدودیت‌ها (constraints)، عادت‌های اشتباه در SQL می‌تواند بی‌سر و صدا عملکرد و سلامت داده‌های اپلیکیشن شما را نابود کند.

    در این مطلب با ۱۰ ضد‌الگوی رایج (Anti-Pattern) در SQL آشنا می‌شویم که باید از آن‌ها پرهیز کنید و مهم‌تر از آن، یاد می‌گیریم چطور آن‌ها را اصلاح کنیم.

    ۱. استفاده از SELECT *

    ضد‌الگو:

    SELECT * FROM users;
    

    چرا اشتباه است:

    • داده‌های غیرضروری واکشی می‌شود.
    • اگر ساختار جدول تغییر کند، کد می‌شکند.
    • حجم پاسخ زیاد شده و سرعت کوئری پایین می‌آید.

    راهکار درست:
    فقط ستون‌های موردنیاز را انتخاب کنید.

    SELECT id, username FROM users;
    

    ۲. ذخیره مقادیر جداشده با کاما در یک ستون

    ضد‌الگو:

    SELECT * FROM users WHERE hobbies LIKE '%swimming%';
    

    چرا اشتباه است:

    • نرمال‌سازی داده را از بین می‌برد.
    • جستجو و ایندکس‌گذاری سخت می‌شود.
    • سرعت جستجو و JOIN کاهش می‌یابد.

    راهکار درست:
    از جدول واسط (Junction Table) استفاده کنید:

    user_idhobby
    1reading
    1swimming

    ۳. استفاده نادرست از مدل EAV (Entity-Attribute-Value)

    ضد‌الگو:

    product_idattributevalue
    1colorred

    چرا اشتباه است:

    • کارایی پایین.
    • اعمال محدودیت‌ها دشوار است.
    • کوئری‌ها و گزارش‌گیری‌ها پیچیده می‌شوند.

    راهکار درست:
    از ستون‌های مشخص یا در صورت نیاز از JSON استفاده کنید، اما با طراحی دقیق.

    ۴. مشکل N+1 Query

    ضد‌الگو:

    SELECT * FROM orders;
    برای هر سفارش:
    SELECT * FROM order_items WHERE order_id = ?;
    

    چرا اشتباه است:

    • برای هر رکورد یک کوئری جدا ارسال می‌شود.
    • منجر به گلوگاه شدید در عملکرد می‌گردد.

    راهکار درست:

    از JOIN یا IN برای واکشی گروهی داده‌ها استفاده کنید.

    SELECT * FROM orders o
    JOIN order_items oi ON o.id = oi.order_id;
    

    ۵. نادیده گرفتن ایندکس‌ها

    ضد‌الگو:

    هیچ ایندکسی روی ستون‌های پرتکرار وجود ندارد.

    SELECT * FROM orders WHERE customer_id = 1001;
    

    چرا اشتباه است:

    • جستجوی کامل در جدول انجام می‌شود.
    • کوئری روی جداول بزرگ بسیار کند می‌شود.

    راهکار درست:

    ایندکس بسازید:

    CREATE INDEX idx_customer_id ON orders(customer_id);
    

    ۶. استفاده از OR به جای IN یا UNION

    ضد‌الگو:

    SELECT * FROM users WHERE city = 'London' OR city = 'Paris';
    

    چرا اشتباه است:

    • ممکن است ایندکس استفاده نشود.
    • کارایی پایین می‌آید.

    راهکار درست:

    SELECT * FROM users WHERE city IN ('London', 'Paris');
    

    ۷. نادیده‌گرفتن تراکنش‌ها (Transactions)

    ضد‌الگو:

    UPDATE accounts SET balance = balance - 100 WHERE id = 1;
    UPDATE accounts SET balance = balance + 100 WHERE id = 2;
    

    چرا اشتباه است:

    اگر یکی از کوئری‌ها شکست بخورد، داده‌ها ناهماهنگ می‌شوند.

    راهکار درست:

    BEGIN;
    -- عملیات
    COMMIT;
    

    ۸. استفاده بیش از حد از Subquery به جای JOIN

    ضد‌الگو:

    SELECT name FROM customers
    WHERE id IN (
    SELECT customer_id FROM orders WHERE total > 100
    );
    

    چرا اشتباه است:

    • بهینه‌سازی دشوارتر است.
    • سرعت پایین‌تر نسبت به JOIN دارد.

    راهکار درست:

    SELECT DISTINCT c.name
    FROM customers c
    JOIN orders o ON c.id = o.customer_id
    WHERE o.total > 100;
    

    ۹. استفاده نادرست از NULL

    ضد‌الگو:

    SELECT * FROM users WHERE last_login != NULL;
    

    چرا اشتباه است:

    چنین کوئری‌ای هیچ نتیجه‌ای برنمی‌گرداند (زیرا NULL با NULL قابل مقایسه نیست).

    راهکار درست:

    SELECT * FROM users WHERE last_login IS NOT NULL;
    

    ۱۰. نداشتن محدودیت‌ها (Constraints)

    ضد‌الگو:

    فقط به منطق برنامه اعتماد می‌شود و در پایگاه داده هیچ محدودیتی نیست.

    چرا اشتباه است:

    • احتمال داده‌های تکراری یا یتیم وجود دارد.
    • خطر خرابی داده بالا می‌رود.

    راهکار درست:

    از محدودیت‌ها استفاده کنید:

    PRIMARY KEY (id)
    FOREIGN KEY (user_id) REFERENCES users(id)
    UNIQUE (email)
    

    جمع‌بندی

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

    در دنیایی که سرعت و پایداری اپلیکیشن‌ها حرف اول را می‌زنند، نوشتن SQL بهینه دیگر یک مهارت لوکس نیست بلکه یک ضرورت است.

  • چرا ویندوز ۱۱ به ماژول TPM نیاز دارد و چطور می‌توان از آن عبور کرد؟

    چرا ویندوز ۱۱ به ماژول TPM نیاز دارد و چطور می‌توان از آن عبور کرد؟

    وقتی مایکروسافت در سال ۲۰۲۱ ویندوز ۱۱ را معرفی کرد، یکی از سخت‌گیرانه‌ترین پیش‌نیازهای سخت‌افزاری آن، وجود ماژول امنیتی TPM نسخه ۲.۰ بود. اما TPM دقیقاً چیست و چرا این‌قدر اهمیت دارد؟

    TPM چیست؟

    به‌طور ساده، TPM یا Trusted Platform Module یک پردازنده رمزنگاری امن است؛ تراشه‌ای اختصاصی که برای انجام وظایف امنیتی مانند مدیریت کلیدهای رمزنگاری طراحی شده است.
    ویندوز از این تراشه برای فعال‌سازی قابلیت‌هایی مانند Secure Boot، BitLocker و Windows Hello استفاده می‌کند.

    این ماژول وظایف ریاضی مرتبط با رمزگذاری و رمزگشایی داده‌ها، تولید عددهای تصادفی و تأیید امضاهای دیجیتال را انجام می‌دهد. همچنین، مکانی امن برای ذخیره‌ی گواهی‌های دیجیتال، کلیدهای رمزنگاری و داده‌های احراز هویت است — به شکلی که دستکاری در آن تقریباً غیرممکن باشد.

    استاندارد TPM بیش از بیست سال پیش توسط گروه Trusted Computing تدوین شد (ISO/IEC 11889) و بر مفاهیم «حفاظت از تمامیت، جداسازی و محرمانگی» تمرکز دارد.

    TPM چگونه پیاده‌سازی می‌شود؟

    TPM می‌تواند به‌صورت یک تراشه مجزا روی مادربرد نصب شود، یا در سخت‌افزار CPU و چیپ‌ست تعبیه شود. این رویکرد را شرکت‌هایی مانند Intel، AMD و Qualcomm طی دهه‌ی گذشته اتخاذ کرده‌اند.
    مایکروسافت نیز با پردازنده امنیتی Pluton وارد این حوزه شده که در تراشه‌های AMD و Qualcomm مجتمع شده است و می‌تواند نقش TPM یا یک پردازنده امنیتی مستقل را ایفا کند. حتی در ماشین‌های مجازی نیز می‌توان یک TPM مجازی ایجاد کرد.

    چرا ویندوز ۱۱ به TPM نیاز دارد؟

    مایکروسافت در سال ۲۰۲۴ اعلام کرد که TPM 2.0 استانداردی غیرقابل مذاکره برای آینده ویندوز است.
    در حوزه تجاری، این مهاجرت عملاً از سال‌ها پیش آغاز شده بود: برنامه صدور گواهی سخت‌افزار مایکروسافت الزام داشت که هر رایانه‌ای با ویندوز ۱۰ دارای TPM 2.0 باشد.

    در نتیجه، تقریباً تمام رایانه‌های امروزی از این استاندارد پشتیبانی می‌کنند و تنها دستگاه‌های خانگی قدیمی‌تر (بیش از ده سال عمر) فاقد آن هستند.

    TPM در کنار قابلیت Secure Boot تضمین می‌کند که تنها کدهای تأییدشده در زمان بوت اجرا شوند. اگر کسی بخواهد فایل‌های سیستم را با روت‌کیت آلوده کند، TPM با بررسی امضاها مانع از اجرای کدهای ناشناخته می‌شود.
    علاوه بر این، TPM کلیدهای رمزگذاری BitLocker را نگهداری کرده و امکان احراز هویت بیومتریک با Windows Hello را فراهم می‌سازد.

    چطور بفهمیم سیستم ما TPM دارد؟

    اگر رایانه‌ی شما بعد از سال ۲۰۱۶ با ویندوز ۱۰ عرضه شده باشد، تقریباً قطعی است که TPM 2.0 فعال دارد.
    از همان سال، اینتل فناوری PTT و AMD قابلیت fTPM را در پردازنده‌های خود گنجاندند. سیستم‌های قدیمی‌تر ممکن است دارای TPM 1.2 باشند که ویندوز ۱۱ به‌طور رسمی از آن پشتیبانی نمی‌کند.

    گاهی TPM در تنظیمات BIOS یا UEFI غیرفعال است. برای بررسی آن، می‌توانید ابزار System Information (Msinfo32.exe) را اجرا کنید و در صورت نیاز از تنظیمات UEFI آن را فعال کنید.

    TPM فقط مخصوص ویندوز نیست

    علاوه بر ویندوز، لینوکس و حتی بسیاری از دستگاه‌های IoT نیز از TPM برای امنیت استفاده می‌کنند.
    در دنیای اپل هم تراشه‌ای مشابه با نام Secure Enclave همین وظایف را انجام می‌دهد، یعنی نگهداری ایمن داده‌های حساس و کلیدهای رمزنگاری کاربر.

    راه‌های دور زدن محدودیت TPM

    اگر سیستم شما ویندوز ۱۰ دارد و هر نوع TPM (حتی ۱.۲) در آن فعال است، می‌توانید با ویرایش ساده رجیستری به ویندوز ۱۱ ارتقا دهید.
    همچنین ابزار Rufus این امکان را می‌دهد که بررسی سخت‌افزار را دور بزنید و نصب ویندوز ۱۱ را انجام دهید (البته به‌صورت غیررسمی و با پذیرش ریسک‌های امنیتی).

    جمع‌بندی

    TPM بخشی حیاتی از امنیت مدرن ویندوز است. این تراشه تضمین می‌کند سیستم شما هنگام بوت، رمزگذاری و احراز هویت در بالاترین سطح ایمن باقی بماند. اگرچه ممکن است برای کاربران قدیمی دردسر ایجاد کند، اما در دنیای پرتهدید امروز، امنیت سخت‌افزاری دیگر یک گزینه نیست، بلکه ضرورت است.