أمان تطبيقات TypeScript: أهم 10 ثغرات للمبتدئين

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا أمان تطبيقات TypeScript مهم من اليوم الأول

TypeScript هي طبقة فوق JavaScript تضيف الكتابة الثابتة. يعتقد العديد من المطورين المبتدئين خطأً أن الكتابة الثابتة تحل تلقائياً جميع مشاكل الأمان. في الواقع، يتم ترجمة TypeScript إلى JavaScript عادية، وتبقى جميع الثغرات المتأصلة في JS قائمة. في هذه المقالة، سنستعرض أهم 10 ثغرات يواجهها المبتدئون، ونوضح كيفية تجنبها.



1. XSS (البرمجة النصية عبر المواقع)

XSS هي واحدة من أكثر الهجمات شيوعاً. يقوم المهاجم بإدخال سكريبت ضار في الصفحة يتم تنفيذه في متصفح المستخدم.

مثال على كود ضعيف:

function renderUserInput(input: string): string {    return `<div>${input}</div>`;}

// المهاجم يرسل: <script>alert('XSS')</script>

كيفية الإصلاح:

قم دائماً بتشفير إدخال المستخدم. استخدم مكتبات مثل DOMPurify أو طرق التشفير المضمنة:

import DOMPurify from 'dompurify';

function safeRender(input: string): string { const clean = DOMPurify.sanitize(input); return `<div>${clean}</div>`;}


2. حقن SQL

إذا كنت تقوم بتكوين استعلامات SQL عن طريق دمج السلاسل مع إدخال المستخدم، فأنت تفتح الباب لحقن SQL.

كود ضعيف:

function getUser(username: string): Promise<User> {    const query = `SELECT * FROM users WHERE username = '${username}'`;    return db.execute(query);}

البديل الآمن:

function getUserSafe(username: string): Promise<User> {    const query = 'SELECT * FROM users WHERE username = $1';    return db.execute(query, [username]); // استعلام مع معلمات}


3. تخزين كلمات المرور غير الآمن

لا تقم أبداً بتخزين كلمات المرور كنص واضح. استخدم bcrypt أو argon2 للتجزئة.

import bcrypt from 'bcrypt';

async function hashPassword(password: string): Promise<string> { const saltRounds = 12; return bcrypt.hash(password, saltRounds);}

async function verifyPassword(password: string, hash: string): Promise<boolean> { return bcrypt.compare(password, hash);}


4. المراجع المباشرة غير الآمنة للكائنات (IDOR)

عندما يتمكن المستخدم من الوصول إلى بيانات الآخرين بمجرد تغيير المعرف في URL.

مثال:

// ضعيف: أي مستخدم يمكنه الحصول على أي طلبapp.get('/api/order/:id', (req, res) => {    const order = getOrderById(req.params.id);    res.json(order);});

// آمن: نتحقق من الملكيةapp.get('/api/order/:id', (req, res) => { const order = getOrderById(req.params.id); if (order.userId !== req.user.id) { return res.status(403).json({ error: 'Forbidden' }); } res.json(order);});


5. استخدام التبعيات القديمة

مشاريع TypeScript غالباً ما تستخدم حزم npm. الإصدارات القديمة قد تحتوي على ثغرات معروفة.

  • قم بتشغيل npm audit بانتظام
  • استخدم npm update لتحديث الحزم
  • قم بإعداد فحوصات تلقائية في CI/CD


6. التحقق غير الكافي من بيانات الإدخال

أنواع TypeScript لا يتم التحقق منها في وقت التشغيل. قم دائماً بالتحقق من البيانات على الخادم.

interface UserInput {    email: string;    age: number;}

// غير كافٍ: أنواع TypeScript لا تحمي في وقت التشغيلfunction processUser(input: UserInput) { // ...}

// صحيح: نستخدم Zod أو Joi للتحققimport { z } from 'zod';

const UserSchema = z.object({ email: z.string().email(), age: z.number().min(18).max(120)});

function processUserSafe(input: unknown) { const validate

المدونات

توصيات الكتب