⚡ Shadow Academy
đŸ—ēī¸ Chapter 33

āĻāχ āĻ…āĻ§ā§āϝāĻžāϝāĻŧ⧇ āϕ⧀ āĻļāĻŋāĻ–āĻŦ⧇

⏱ āφāύ⧁āĻŽāĻžāύāĻŋāĻ• āϏāĻŽāϝāĻŧ: ā§§ā§Ģâ€“ā§¨ā§Ļ āĻŽāĻŋāύāĻŋāϟ ¡ āĻĒā§‚āĻ°ā§āĻŦāĻļāĻ°ā§āϤ: āφāϗ⧇āϰ āĻ…āĻ§ā§āϝāĻžāϝāĻŧ⧇āϰ āϧāĻžāϰāĻŖāĻž

ā§Ļ / ā§§ā§Ļā§Ļ āĻ…āĻ§ā§āϝāĻžā§ŸāϚāĻžāϞāĻŋāϝāĻŧ⧇ āϝāĻžāĻ“: āĻ…āĻ§ā§āϝāĻžāϝāĻŧ 34

āĻ…āĻ—ā§āϰāĻ—āϤāĻŋ āĻāχ browser-āĻ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧāĻ­āĻžāĻŦ⧇ āϏāĻ‚āϰāĻ•ā§āώāĻŋāϤ āĻšāĻŦ⧇āĨ¤

đŸ—ēī¸
GraphQL āχāĻ¨ā§āĻŸā§āϰ⧋āĻ¸ā§āĻĒ⧇āĻ•āĻļāύ — API-āϰ āϭ⧇āϤāϰ⧇āϰ āĻŽāĻžāύāϚāĻŋāĻ¤ā§āϰ!
GraphQL āĻ¸ā§āĻ•āĻŋāĻŽāĻž āĻĄāĻžāĻŽā§āĻĒāĻŋāĻ‚, āχāύāĻĢāϰāĻŽā§‡āĻļāύ āĻĄāĻŋāϏāĻ•ā§āϞ⧋āϜāĻžāϰ āĻ“ āĻšāĻŋāĻĄā§‡āύ āĻŽāĻŋāωāĻŸā§‡āĻļāύ āĻ…ā§āϝāĻžāϟāĻžāĻ•
🧭 āĻĻāĻ•ā§āώāϤāĻž āϝāĻžāϚāĻžāχ āĻ“ āĻĒā§āϰāϤāĻŋāϰāĻ•ā§āώāĻžāĻŽā§‚āϞāĻ• takeaway
Skill checkpoint: Local GraphQL schema-āϤ⧇ query/type āĻ“ resolver-āĻāϰ āĻ­ā§‚āĻŽāĻŋāĻ•āĻž āĻļāύāĻžāĻ•ā§āϤ āĻ•āϰ⧋āĨ¤
Defense checkpoint: āĻĒā§āϰāϤāĻŋ resolver-āĻ authorization, query depth limit āĻ“ rate limit āĻĒā§āĻ°ā§Ÿā§‹āĻ— āĻ•āϰ⧋.
Lab scope: āĻļ⧁āϧ⧁ āύāĻŋāĻœā§‡āϰ lab, synthetic data āĻŦāĻž āϞāĻŋāĻ–āĻŋāϤ āĻ…āύ⧁āĻŽāϤāĻŋāĻĒā§āϰāĻžāĻĒā§āϤ target-āĻ āĻ…āύ⧁āĻļā§€āϞāύ āĻ•āϰ⧋āĨ¤ Real credential, token āĻŦāĻž customer data āĻŦā§āϝāĻŦāĻšāĻžāϰ āϕ⧋āϰ⧋ āύāĻžāĨ¤
Portfolio proof: finding, impact, fix āĻ“ retest āύāĻŋā§Ÿā§‡ ā§Ģ-āϞāĻžāχāύ⧇āϰ redacted note āϰāĻžāĻ–ā§‹āĨ¤
đŸ—ēī¸ āĻ—āĻ˛ā§āĻĒ ā§§: GraphQL āϕ⧀? REST API-āϰ āĻšā§‡ā§Ÿā§‡ āϕ⧋āĻĨāĻžā§Ÿ āφāϞāĻžāĻĻāĻž?
āϏāĻžāϧāĻžāϰāĻŖ REST API-āϤ⧇ āĻĄā§‡āϟāĻž āĻĒ⧇āϤ⧇ āĻšāϞ⧇ āϤ⧋āĻŽāĻžāϕ⧇ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻĻāϰāϜāĻžā§Ÿ āϝ⧇āϤ⧇ āĻšā§Ÿ — āϝ⧇āĻŽāύ `/get_user`, `/get_orders`, `/get_wallet`āĨ¤ āĻ•āĻŋāĻ¨ā§āϤ⧁ GraphQL āĻšāϞ⧋ āĻāĻ•āϟāĻŋ āφāϞāϟāĻŋāĻŽā§‡āϟ āϏ⧁āĻĒāĻžāϰāĻļāĻĒ⧇āϰ āĻŽāϤ⧋! āĻāĻ•āϟāĻŋ āĻŽāĻžāĻ¤ā§āϰ āĻĻāϰāϜāĻž āĻĨāĻžāϕ⧇ (`/graphql`), āφāϰ āϤ⧁āĻŽāĻŋ āϚāĻŋāϰāϕ⧁āĻŸā§‡ āϞāĻŋāϖ⧇ āĻĻāĻžāĻ“ āϤ⧋āĻŽāĻžāϰ āϕ⧀ āϕ⧀ āĻĄā§‡āϟāĻž āϞāĻžāĻ—āĻŦ⧇ — āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻ āĻŋāĻ• āϤāϤāϟ⧁āϕ⧁āχ āĻŽā§‡āĻĒ⧇ āϤ⧋āĻŽāĻžāϕ⧇ āĻĢ⧇āϰāϤ āĻĻ⧇āĻŦ⧇!

āĻšā§āϝāĻžāĻ•āĻžāϰāĻĻ⧇āϰ āĻ•āĻžāϛ⧇ GraphQL āĻšāϞ⧋ āĻāĻ• āĻ¸ā§āĻŦāĻ°ā§āĻ—ā§‹āĻĻā§āϝāĻžāύ! āĻ•āĻžāϰāĻŖ āĻ āĻŋāĻ•āĻŽāϤ⧋ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āύāĻž āĻ•āϰāĻž āĻĨāĻžāĻ•āϞ⧇ āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰāĻĻ⧇āϰ āϏāĻŽāĻ¸ā§āϤ āϞ⧁āĻ•āĻžāύ⧋ āĻĄā§‡āϟāĻžāĻŦ⧇āϏ āĻŸā§‡āĻŦāĻŋāϞ āĻ“ āĻ•ā§ā§Ÿā§‡āϰāĻŋ āĻāĻ• āϏ⧇āϕ⧇āĻ¨ā§āĻĄā§‡ āĻĢāĻžāρāϏ āĻšā§Ÿā§‡ āϝāĻžā§Ÿ!
🔍 āĻ—āĻ˛ā§āĻĒ ā§¨: āχāĻ¨ā§āĻŸā§āϰ⧋āĻ¸ā§āĻĒ⧇āĻ•āĻļāύ āĻ•ā§ā§Ÿā§‡āϰāĻŋ (Introspection Query) — āĻĒ⧁āϰ⧋ āĻŽāĻžāύāϚāĻŋāĻ¤ā§āϰ āϚ⧁āϰāĻŋ!
GraphQL āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ āϭ⧇āϤāϰ⧇ āĻāĻ•āϟāĻŋ āĻŽāĻžāϰāĻžāĻ¤ā§āĻŽāĻ• āĻŦāĻŋāĻ˛ā§āϟ-āχāύ āĻĢāĻŋāϚāĻžāϰ āĻĨāĻžāϕ⧇, āϝāĻžāϰ āύāĻžāĻŽ IntrospectionāĨ¤ āĻāϟāĻž āĻ…āύ⧇āĻ•āϟāĻž āĻšā§‹āϰāϕ⧇ āĻŦā§āϝāĻžāĻ‚āϕ⧇āϰ āϏāĻŋāĻ¨ā§āĻĻ⧁āϕ⧇āϰ āĻĒ⧁āϰ⧋ āĻŦā§āϞ⧁-āĻĒā§āϰāĻŋāĻ¨ā§āϟ āĻŦāĻž āύāĻ•āĻļāĻž āĻĻāĻŋā§Ÿā§‡ āĻĻ⧇āĻ“ā§ŸāĻžāϰ āĻŽāϤ⧋!

āϤ⧁āĻŽāĻŋ āϝāĻĻāĻŋ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇ `__schema` āĻ•ā§ā§Ÿā§‡āϰāĻŋ āĻĒāĻžāĻ āĻŋā§Ÿā§‡ āĻĻāĻžāĻ“, āϤāĻŦ⧇ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻ­āĻĻā§āϰ āϛ⧇āϞ⧇āϰ āĻŽāϤ⧋ āĻŦāϞ⧇ āĻĻ⧇āĻŦ⧇ āϤāĻžāϰ āϭ⧇āϤāϰ⧇ āϕ⧀ āϕ⧀ āĻŸā§‡āĻŦāĻŋāϞ āφāϛ⧇, āĻ…ā§āϝāĻžāĻĄāĻŽāĻŋāύ āĻĒā§āϝāĻžāύ⧇āϞ⧇āϰ āύāĻžāĻŽ āϕ⧀, āϕ⧋āύ āĻ•ā§ā§Ÿā§‡āϰāĻŋ āĻĻāĻŋā§Ÿā§‡ āĻĒāĻžāϏāĻ“ā§ŸāĻžāĻ°ā§āĻĄ āĻĒāĻžāĻ“ā§ŸāĻž āϝāĻžā§Ÿ āĻāĻŦāĻ‚ āϕ⧀ āϕ⧀ āĻšāĻŋāĻĄā§‡āύ āĻŽāĻŋāωāĻŸā§‡āĻļāύ (Mutation) āĻ°ā§Ÿā§‡āϛ⧇!
# āϏāĻ°ā§āĻŦāύāĻžāĻļāĻž Introspection Query āϝāĻž āĻĻāĻŋā§Ÿā§‡ āĻĒ⧁āϰ⧋ āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ āĻ¸ā§āĻ•āĻŋāĻŽāĻž āĻĄāĻžāωāύāϞ⧋āĻĄ āĻšā§Ÿ:
query {
  __schema {
    types {
      name
      fields {
        name
        type { name kind }
        args { name type { name } }
      }
    }
  }
}

# Python āĻĻāĻŋā§Ÿā§‡ GraphQL āĻāĻ•ā§āϏāĻĒā§āĻ˛ā§Ÿā§‡āϟ:
import requests
url = "https://api.target.com/graphql"
payload = {"query": "{ allUsers { id username email passwordHash isAdmin } }"}
res = requests.post(url, json=payload)
print(res.json())
đŸ’Ĩ āĻ—āĻ˛ā§āĻĒ ā§Š: āĻšāĻŋāĻĄā§‡āύ āĻŽāĻŋāωāĻŸā§‡āĻļāύ āĻ“ āĻ…ā§āϝāĻžāĻĄāĻŽāĻŋāύ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻŸā§‡āĻ•āĻ“āĻ­āĻžāϰ
āχāĻ¨ā§āĻŸā§āϰ⧋āĻ¸ā§āĻĒ⧇āĻ•āĻļāύ āĻ¸ā§āĻ•ā§āϝāĻžāύ āĻ•āϰ⧇ āϤ⧁āĻŽāĻŋ āĻĒā§āϰāĻžā§ŸāĻļāχ āĻāĻŽāύ āĻ•āĻŋāϛ⧁ āĻŽāĻŋāωāĻŸā§‡āĻļāύ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāĻŦ⧇ āϝāĻž āϏāĻžāϧāĻžāϰāĻŖ āχāωāϜāĻžāϰāĻĻ⧇āϰ āĻŽā§‹āĻŦāĻžāχāϞ āĻ…ā§āϝāĻžāĻĒ⧇ āϕ⧋āĻĨāĻžāĻ“ āĻĻ⧇āĻ–āĻžāύ⧋ āĻšā§Ÿ āύāĻž! āϝ⧇āĻŽāύ:
- `updateUserRole(userId: 101, role: "SUPER_ADMIN")`
- `applyInstantRefund(orderId: 5542, amount: 50000)`

āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰāϰāĻž āĻšā§ŸāϤ⧋ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āĻŦāĻžāϟāύ āϞ⧁āĻ•āĻŋā§Ÿā§‡ āϰ⧇āϖ⧇āϛ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ āϏāĻžāĻ°ā§āĻ­āĻžāϰ-āϏāĻžāχāĻĄā§‡ āĻĒāĻžāϰāĻŽāĻŋāĻļāύ āĻšā§‡āĻ• āϰāĻžāϖ⧇āύāĻŋ! āĻĢāϞ⧇ āϤ⧁āĻŽāĻŋ āϏāϰāĻžāϏāϰāĻŋ āĻ•ā§ā§Ÿā§‡āϰāĻŋ āĻĒāĻžāĻ āĻŋā§Ÿā§‡ āύāĻŋāĻœā§‡āϰ āϏāĻžāϧāĻžāϰāĻŖ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟāϕ⧇ āĻāĻ• āύāĻŋāĻŽā§‡āώ⧇ SUPER_ADMIN āĻŦāĻžāύāĻŋā§Ÿā§‡ āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰ⧋!
💡 GraphQL āĻšā§āϝāĻžāĻ•āĻŋāĻ‚ āĻŸā§‡āĻ•āύāĻŋāĻ•
ā§§. āĻĒā§āϰāĻĨāĻŽā§‡ `__schema` āĻĒāĻžāĻ āĻŋā§Ÿā§‡ āĻ¸ā§āĻ•āĻŋāĻŽāĻž āĻĄā§āϰāĻžāĻŽā§āĻĒ āĻ•āϰ⧋āĨ¤ ⧍. `graphql-voyager` āĻĻāĻŋā§Ÿā§‡ āĻ­āĻŋāĻœā§āϝ⧁⧟āĻžāϞ āĻŽā§āϝāĻžāĻĒ āĻŦāĻžāύāĻžāĻ“āĨ¤ ā§Š. āĻšāĻŋāĻĄā§‡āύ āĻ…ā§āϝāĻžāĻĄāĻŽāĻŋāύ āĻŽāĻŋāωāĻŸā§‡āĻļāύ āϖ⧁āρāĻœā§‡ āĻŦ⧇āϰ āĻ•āϰ⧇ āĻāĻ•ā§āϏāĻĒā§āĻ˛ā§Ÿā§‡āϟ āĻ•āϰ⧋!

đŸ§Ē GraphQL Schema Inspector

GraphQL āĻ•ā§ā§Ÿā§‡āϰāĻŋ āĻĻāĻžāĻ“ — āĻĄā§‡āϟāĻžāĻŦ⧇āϏ āĻ¸ā§āĻ•āĻŋāĻŽāĻž āĻĢāĻžāρāϏ āĻ•āϰ⧇ āĻĻ⧇āĻ–āĻžāĻŦ⧇!

āĻ˛ā§āϝāĻžāĻŦ⧇āϰ āχāύāĻĒ⧁āϟ āĻĻāĻŋā§Ÿā§‡ "āϰāĻžāύ āĻ•āϰ⧋" āĻŦāĻžāϟāύ⧇ āĻ•ā§āϞāĻŋāĻ• āĻ•āϰ⧋...
❓ āĻĒā§āϰāĻļā§āύ 1: GraphQL Introspection āϕ⧀ āĻĻ⧇āϝāĻŧ?
❓ āĻĒā§āϰāĻļā§āύ 2: Introspection query āĻļ⧁āϰ⧁ āĻšāϝāĻŧ āϕ⧀āĻ­āĻžāĻŦ⧇?
❓ āĻĒā§āϰāĻļā§āύ 3: GraphQL IDOR āϕ⧀āĻ­āĻžāĻŦ⧇ āĻšāϝāĻŧ?
❓ āĻĒā§āϰāĻļā§āύ 4: Production-āĻ āϕ⧀ āĻ•āϰāĻž āωāϚāĻŋāϤ?
❓ āĻĒā§āϰāĻļā§āύ 5: GraphQL āϕ⧋āύ HTTP method āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇?
❓ āĻĒā§āϰāĻļā§āύ 6: adminQuery field āĻŽāĻžāύ⧇ āϕ⧀?
❓ āĻĒā§āϰāĻļā§āύ 7: GraphQL Mutation āϕ⧀ āĻ•āϰ⧇?
❓ āĻĒā§āϰāĻļā§āύ 8: costPrice field sensitive āϕ⧇āύ?
❓ āĻĒā§āϰāĻļā§āύ 9: GraphQL endpoint āϏāĻžāϧāĻžāϰāĻŖāϤ āϕ⧋āĻĨāĻžāϝāĻŧ?
❓ āĻĒā§āϰāĻļā§āύ 10: Introspection disabled āĻšāϞ⧇ schema āĻŦ⧇āϰ āĻ•āϰāĻŦ⧇ āϕ⧀āĻ­āĻžāĻŦ⧇?

āĻŦāĻŋāĻļā§āĻŦāĻ¸ā§āϤ reference

āφāϰāĻ“ āĻĒāĻĄāĻŧāĻžāϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāϤāĻŋāĻˇā§āĻ āĻŋāϤ security standards āĻ“ guidance āĻĻ⧇āĻ–ā§‹; āĻĒā§āϰāϤāĻŋāϟāĻŋ lab āĻ…āύ⧁āĻŽā§‹āĻĻāĻŋāϤ āĻŦāĻž synthetic environment-āĻ āĻ•āϰ⧋āĨ¤

Bristy Ma'am
āĻŦ⧃āĻˇā§āϟāĻŋ āĻŽā§āϝāĻžāĻŽ 👩‍đŸĢ
āϤ⧋āĻŽāĻžāϰ āĻĒāĻžāĻ°ā§āϏ⧋āύāĻžāϞ āĻšā§āϝāĻžāĻ•āĻŋāĻ‚ āĻŽā§‡āĻ¨ā§āϟāϰ â€ĸ āĻ…āύāϞāĻžāχāύ
āφāϰ⧇ āϏ⧌āϰāĻ­! āϕ⧇āĻŽāύ āφāϛ⧋? āϕ⧋āύ⧋ āĻ•āύāϏ⧇āĻĒā§āϟ āĻŦāĻž āϕ⧁āχāĻœā§‡ āφāϟāĻ•āĻžāϞ⧇ āφāĻŽāĻžāϕ⧇ āĻŦāϞ⧋, āφāĻŽāĻŋ āĻŦ⧁āĻāĻŋā§Ÿā§‡ āĻĻāĻŋāĻšā§āĻ›āĻŋ! â¤ī¸