הגדרת הגבלת קצב ועומק עבור GraphQL

API של GraphQL ללא הגבלות עומק ומורכבות הוא דלת פתוחה להתקפות DoS ולעומס יתר על השרת. אנו מגדירים rate limiting, depth limiting ו-query complexity כדי להגן על ה-API שלך מפני ניצול לרעה. הצוות שלנו מספק הגנה מלאה, תוך הבטחת פעילות יציבה ותמיכה מתמשכת.

פיתוח ותחזוקה של כל סוגי האתרים:

אתרי מידע או יישומי אינטרנט
אתרי תדמית, דפי נחיתה, אתרי חברה, קטלוגים מקוונים, חידונים, אתרי קידום, בלוגים, מקורות חדשות, פורטלי מידע, פורומים, אגרגטורים
אתרי מסחר אלקטרוני או יישומי אינטרנט
חנויות מקוונות, פורטלי B2B, שווקים, בורסות מקוונות, אתרי קאשבק, בורסות, פלטפורמות דרופשיפינג, מנתחי מוצרים
יישומי אינטרנט לניהול תהליכים עסקיים
מערכות CRM, מערכות ERP, פורטלים ארגוניים, מערכות ניהול ייצור, מנתחי מידע
אתרי שירות אלקטרוני או יישומי אינטרנט
פלטפורמות מודעות, בתי ספר מקוונים, בתי קולנוע מקוונים, בוני אתרים, פורטלים לשירותים אלקטרוניים, פלטפורמות אירוח וידאו, פורטלים נושאיים

אלה רק חלק מהסוגים הטכניים של אתרים שאנו עובדים איתם, ולכל אחד מהם יכולים להיות מאפיינים ופונקציונליות ספציפיים משלו, וכן ניתן להתאים אותם לצרכים ולמטרות הספציפיים של הלקוח.

השירותים שאנו מציעים
מציג 1 מתוך 1כל 2062 השירותים
הגדרת הגבלת קצב ועומק עבור GraphQL
בינוני
~2-3 ימים

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1365
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113
  • פיתוח אתר עבור SBH Partners
    פיתוח אתר עבור SBH Partners
    1201
  • פיתוח אתר עבור Red Pear
    פיתוח אתר עבור Red Pear
    619

GraphQL מעניק ללקוחות גמישות רבה, אך אותה גמישות הופכת את ה-API לפגיע. שאילתה אחת עם 50 רמות קינון ומאות כינויים יכולה לייצר מיליוני אובייקטים, ולהעמיס על המעבד ומסד הנתונים. נתקלנו במקרים שבהם נקודת קצה ללא הגבלות קרסה תחת מספר בקשות בודדות לדקה. לפי התיעוד הרשמי של GraphQL, הגנה מפני היבטים כאלה היא חובה עבור גרסאות production. הגנה מקיפה דורשת הגבלת עומק (הגבלת קינון), מורכבות שאילתה (עלות פעולה), והגבלת קצב (קצב בקשות) – שלושה מנגנונים מרכזיים שאנו מיישמים. הגבלת עומק יעילה פי 3 מהגבלות מבוססות זמן נאיביות. תוך 1-2 ימי עסקים, אנו מגדירים הגבלות אלה עבור ה-API שלך.

אילו בעיות אנו פותרים

ללא הגבלות, GraphQL API חשוף להתקפות DoS. תוקף יכול לשלוח שאילתה אחת עם קינון רקורסיבי (משתמש → חברים → חברים...) שמאלץ את מסד הנתונים לבצע אלפי JOIN. או דרך כינויים, הם מבקשים את אותו שדה 500 פעמים, ובכך מדמים DDoS. וקטור נוסף הוא פעולות יקרות כמו חיפוש או ייצוא שצורכות משאבים רבים. אנו פותרים בעיות אלה באופן מקיף באמצעות הגבלת עומק, מורכבות שאילתה והגבלת קצב. השילוב של שלוש שיטות אלה יעיל פי 10 נגד התקפות DoS מאשר כל שכבה בודדת. העלות של התקפות כאלה יכולה להגיע להפסד הכנסות עקב השבתה – לדוגמה, השבתה של 30 דקות עשויה לעלות $10,000 לאתר מסחר אלקטרוני, כך שההגנה משתלמת במהירות. עבור מערכת בגודל בינוני, הגדרה זו מפחיתה את עלויות האירוח בכ-$5,000 בשנה.

כיצד להגדיר הגבלת עומק?

הגבלת עומק מגבילה את רמת הקינון המקסימלית של עץ ה-AST של השאילתה. אנו קובעים סף של 7 רמות – מספיק עבור סכמות טיפוסיות אך חוסם שאילתות רקורסיביות. עבור רוב הסכמות, סף של 7 הוא אופטימלי: הוא מכסה 99% מהשאילתות הלגיטימיות.

import depthLimit from 'graphql-depth-limit'
import { ApolloServer } from '@apollo/server'

const server = new ApolloServer({
  typeDefs,
  resolvers,
  validationRules: [
    depthLimit(7)
  ]
})

התקפה ללא הגבלת עומק נראית כך:

{ user { friends { friends { friends { friends { friends { id name } } } } } } } 

מדוע בדיקת מורכבות שאילתה חשובה?

העומק אינו מתחשב ברוחב השאילתה: שאילתה בעומק 2 אך מבקשת 10,000 רשומות דרך פגינציה היא גם מסוכנת. מורכבות שאילתה מחשבת את העלות הכוללת באמצעות מכפילים עבור ארגומנטים של פגינציה. השווה בין שלוש גישות בטבלה:

שיטה מה היא מגבילה דוגמה יעילות נגד רקורסיה יעילות נגד רוחב
הגבלת עומק עומק קינון משתמש → חברים → פוסטים → תגובות גבוהה נמוכה
מורכבות שאילתה עלות כוללת פוסטים(ראשון: 100) × 2 (ילד) + ... בינונית גבוהה
הגבלת קצב מספר פעולות ותקציב מורכבות 200 בקשות/דקה, 10,000 מורכבות נמוכה (משלימה) בינונית (משלימה)

מורכבות שאילתה יעילה פי 5 עבור התקפות רוחב מאשר הגבלת עומק בלבד.

import { createComplexityLimitRule } from 'graphql-query-complexity'
import { fieldExtensionsEstimator, simpleEstimator } from 'graphql-query-complexity'

const complexityRule = createComplexityLimitRule(1000, {
  estimators: [
    fieldExtensionsEstimator(),
    ({ type, field, args, childComplexity }) => {
      if (args.limit) return args.limit * childComplexity
      if (args.first) return args.first * childComplexity
      return 1 + childComplexity
    },
    simpleEstimator({ defaultComplexity: 1 })
  ],
  onSuccess: (complexity) => console.log(`Query complexity: ${complexity}`),
  formatErrorMessage: (complexity) => `Query too complex (${complexity}). Max allowed: 1000`
})

השוואה של ספריות הגנה ל-GraphQL:

ספרייה עומק מורכבות כינויים זמן הגדרה
graphql-depth-limit + - - שעה
graphql-query-complexity - + - שעתיים
graphql-armor + + + 3 שעות

הגבלת קצב עם Redis

הגבלת קצב ב-GraphQL מתחשבת גם במספר הבקשות וגם במורכבות. אנו משתמשים ב-Redis עבור מונים: הגבלה על פעולות (200 פעולות/דקה) ועל מורכבות כוללת (10,000). עבור פעולות יקרות (SearchUsers, ExportData), אנו קובעים הגבלות נפרדות – עד 5 קריאות לדקה.

class GraphQLRateLimiter {
  constructor(redis) {
    this.r = redis
  }

  async checkRequest(userId, operationName, complexity) {
    const now = Math.floor(Date.now() / 1000)
    const minute = now - (now % 60)
    const opsKey = `gql:ops:${userId}:${minute}`
    const ops = await this.r.incr(opsKey)
    this.r.expire(opsKey, 120)
    if (ops > 200) {
      throw new GraphQLError('Too many requests', {
        extensions: {
          code: 'RATE_LIMITED',
          retryAfter: 60
        }
      })
    }
    const complexityKey = `gql:complexity:${userId}:${minute}`
    const totalComplexity = await this.r.incrby(complexityKey, complexity)
    this.r.expire(complexityKey, 120)
    if (totalComplexity > 10000) {
      throw new GraphQLError('Query complexity budget exceeded', {
        extensions: {
          code: 'COMPLEXITY_LIMITED',
          retryAfter: 60
        }
      })
    }
    const expensiveOps = ['SearchUsers', 'ExportData', 'GenerateReport']
    if (expensiveOps.includes(operationName)) {
      const expKey = `gql:expensive:${userId}:${minute}`
      const expCount = await this.r.incr(expKey)
      this.r.expire(expKey, 120)
      if (expCount > 5) {
        throw new GraphQLError(`Too many ${operationName} calls`, {
          extensions: {
            code: 'RATE_LIMITED'
          }
        })
      }
    }
    return {
      allowed: true,
      remainingOps: 200 - ops
    }
  }
}
דוגמה לתצורת graphql-armor
import { createArmor } from '@escape.tech/graphql-armor'

const armor = createArmor({
  maxAliases: { n: 15 },
  maxDirectives: { n: 50 },
  maxDepth: { n: 7 },
  maxTokens: { n: 1000 },
  costLimit: {
    maxCost: 5000,
    objectCost: 2,
    scalarCost: 1,
    depthCostFactor: 1.5,
    ignoreIntrospection: true
  }
})

const server = new ApolloServer({
  typeDefs,
  resolvers,
  plugins: [...armor.plugins],
  validationRules: [...armor.validationRules]
})

אנו גם מנטרלים introspection בסביבת production כך שהסכמה אינה ציבורית.

סקירת תהליך

  1. ניתוח – לימוד סכמת ה-GraphQL, זיהוי שדות יקרים ודפוסי שאילתות טיפוסיים. קביעת נקודות קריטיות.
  2. תכנון – קביעת ספי עומק, מורכבות ותדירות בהתאם לדפוסי התעבורה והעומסים בשיא שלך.
  3. יישום – פריסת הגבלת עומק, מורכבות שאילתה, הגבלת קצב עם Redis והגנת כינויים. הגדרת ניטור.
  4. בדיקות – הדמיית התקפות ואימות ששאילתות לגיטימיות עוברות. שימוש בכלי בדיקת עומס.
  5. פריסה – הגדרת התראות על חריגות מהגבלות ותיעוד התצורה.

מה כלול

  • הגדרת ספריות (graphql-depth-limit, graphql-query-complexity, graphql-armor)
  • אינטגרציה עם Redis להגבלת קצב
  • תצורת הגבלות מותאמת אישית לסכמה שלך
  • תיעוד פעולות
  • הדרכת צוות (שעה)
  • תמיכה לאחר פריסה (שבועיים)

לוח זמנים ותמחור

ההגדרה אורכת בין יום ל-2 ימי עסקים. התמחור הוא אישי – תלוי במורכבות הסכמה ובמספר נקודות הקצה. פרויקטים טיפוסיים נעים בין $1,500 ל-$4,000. הגנה יכולה לחסוך עד 30% מתקציב התשתית – לדוגמה, הפחתת עלויות שרת ב-$500 לחודש, או $6,000 בשנה. צור קשר לייעוץ חינמי וניתוח מפורט.

אנו מבטיחים: לאחר היישום, אף שאילתה לא תחרוג מההגבלות ללא שגיאה ברורה. מגובה בניסיון של שנים וב-50+ פרויקטים.