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

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

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

ابدأ الدورة

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



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



1. Cross-Site Scripting (XSS) عبر معالجة الإدخال غير الصحيحة



لا تزال XSS واحدة من أخطر الثغرات. لا يقوم TypeScript بتعقيم المخرجات تلقائيًا. إذا قمت بإدراج بيانات المستخدم في قالب HTML دون تعقيم، فإنك تفتح الباب للهجمات.



الكود الضعيف

function renderComment(comment: string): string {  return `<div>${comment}</div>`;}

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


الكود المُصحح

import { escape } from 'lodash';

function renderComment(comment: string): string { const safeComment = escape(comment); return `<div>${safeComment}</div>`;}


التوصية: استخدم دائمًا مكتبات التعقيم (DOMPurify, lodash.escape) أو محركات القوالب ذات التعقيم التلقائي (React JSX, Handlebars).



2. حقن SQL عبر القوالب النصية



يسمح TypeScript باستخدام القوالب النصية لبناء استعلامات SQL. هذا طريق مباشر لحقن SQL إذا قمت بإدراج بيانات المستخدم.



الكود الضعيف

async function getUser(id: string): Promise<User | null> {  const query = `SELECT * FROM users WHERE id = '${id}'`;  const result = await db.query(query);  return result.rows[0];}


الكود المُصحح

async function getUser(id: string): Promise<User | null> {  const query = 'SELECT * FROM users WHERE id = $1';  const result = await db.query(query, [id]);  return result.rows[0];}


التوصية: استخدم الاستعلامات المُعلمة أو ORM (TypeORM, Prisma, Sequelize). لا تقم أبدًا بدمج السلاسل النصية لـ SQL.



3. مقارنة كلمات المرور غير الآمنة



خطأ في تنفيذ مقارنة كلمات المرور يمكن أن يؤدي إلى هجمات التوقيت. غالبًا ما يستخدم مطورو TypeScript العامل === لمقارنة التجزئات، وهو غير آمن.



الكود الضعيف

async function verifyPassword(  inputPassword: string,   storedHash: string): Promise<boolean> {  const inputHash = await bcrypt.hash(inputPassword, 10);  return inputHash === storedHash; // ثغرة: هجوم توقيت}


الكود المُصحح

import bcrypt from 'bcrypt';

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


التوصية: استخدم دوال المقارنة المضمنة من مكتبات التجزئة (bcrypt.compare, argon2.verify). فهي محمية ضد هجمات التوقيت.



4. تلوث النموذج الأولي عبر الدمج التكراري للكائنات



غالبًا ما تستخدم تطبيقات TypeScript دوال النسخ العميق أو دمج الكائنات. إذا لم يتم التحكم في المفاتيح، يمكن للمهاجم تلويث النموذج الأولي Object.prototype.



الكود الضعيف

function merge(target: Record<string, any>, source: Record<string, any>) {  for (const key in source) {    if (typeof source[key] === 'object') {      target[key] = merge(target[key] || {}, source[key]);    } else {      target[key] = source[key];    }  }  return target;}

// المهاجم ي

المدونات

توصيات الكتب