Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GraphQL API を悪意あるクエリから守る手法

GraphQL API を悪意あるクエリから守る手法

GraphQL では容易にサーバーに負荷をかけるクエリを書けてしまいます。この発表では、そうした悪意あるクエリから GraphQL API を守る手法を紹介します。

本発表の内容は以下のブログ記事でも詳しく解説しています。
https://yigarashi.hatenablog.com/entry/graphql-query-analysis

Yuu Igarashi

May 14, 2020
Tweet

More Decks by Yuu Igarashi

Other Decks in Programming

Transcript

  1. ಋೖ(SBQI2- "1*ͷͨΊͷΫΤϦݴޠͱΫΤϦʹԠͨ͡σʔλΛฦ͢ϥϯλΠϜ ΫϥΠΞϯτ αʔόʔ ʢϥϯλΠϜʣ { me { name interests

    } } ΫΤϦ { "me": { "name": "yigarashi", "interests": [ "ϓϩδΣΫτϚωδϝϯτ", "GraphQL", "ϓϩάϥϛϯάݴޠཧ࿦", ] } } ฦΓ஋ʢ+40/ʣ
  2. ಋೖ(SBQI2- "1*ͷͨΊͷΫΤϦݴޠͱΫΤϦʹԠͨ͡σʔλΛฦ͢ϥϯλΠϜ ΫϥΠΞϯτ αʔόʔ ʢϥϯλΠϜʣ { me { name interests

    } } ΫΤϦ { "me": { "name": "yigarashi", "interests": [ "ϓϩδΣΫτϚωδϝϯτ", "GraphQL", "ϓϩάϥϛϯάݴޠཧ࿦", ] } } ฦΓ஋ʢ+40/ʣ ΫΤϦͱಉ͡ܗͷ +40/͕ฦ͞ΕΔ
  3. ಋೖ(SBQI2- ΋͏গ͠ෳࡶͳྫ ΫϥΠΞϯτ αʔόʔ ʢϥϯλΠϜʣ { countries(first: 1) { name

    cities(first: 2) { name } } } ΫΤϦ Ҿ਺Λड͚औΔ͜ͱ͕Ͱ͖Δɻ pSTU͸42-Ͱݴ͏MJNJU
  4. ಋೖ(SBQI2- ΋͏গ͠ෳࡶͳྫ ΫϥΠΞϯτ αʔόʔ ʢϥϯλΠϜʣ { countries(first: 1) { name

    cities(first: 2) { name } } } ΫΤϦ { "countries": [ { "name": "೔ຊ", "cities": [ { "name": "ژ౎ࢢ" }, { "name": "৽॓۠" }, ] }, ] } ฦΓ஋ʢ+40/ʣ Ҿ਺Λड͚औΔ͜ͱ͕Ͱ͖Δɻ pSTU͸42-Ͱݴ͏MJNJU
  5. ѱҙ͋ΔΫΤϦ  ΫϥΠΞϯτ αʔόʔ ʢϥϯλΠϜʣ { countries(first: 100) { name

    cities(first: 100) { name streets(first: 1000) { name } } } } ΫΤϦ
  6. ѱҙ͋ΔΫΤϦ  ΫϥΠΞϯτ αʔόʔ ʢϥϯλΠϜʣ { countries(first: 100) { name

    cities(first: 100) { name streets(first: 1000) { name } } } } ΫΤϦ
  7. ѱҙ͋ΔΫΤϦ  ΫϥΠΞϯτ αʔόʔ ʢϥϯλΠϜʣ { countries(first: 100) { name

    cities(first: 100) { name streets(first: 1000) { name } } } } ΫΤϦ ºº ສϊʔυ
  8. ѱҙ͋ΔΫΤϦ  ΫϥΠΞϯτ αʔόʔ ʢϥϯλΠϜʣ { countries(first: 100) { name

    cities(first: 100) { name streets(first: 1000) { name } } } } ΫΤϦ ºº ສϊʔυ
  9. ѱҙ͋ΔΫΤϦ  ΫϥΠΞϯτ αʔόʔ ʢϥϯλΠϜʣ { countries(first: 100) { cities(first:

    100) { superComplexStatistics } } } ΫΤϦ ඇৗʹॏ͍ܭࢉΛ ճ
  10. ѱҙ͋ΔΫΤϦ  ΫϥΠΞϯτ αʔόʔ ʢϥϯλΠϜʣ { countries(first: 100) { cities(first:

    100) { superComplexStatistics } } } ΫΤϦ ඇৗʹॏ͍ܭࢉΛ ճ
  11. ྫϊʔυ਺ʹൺྫ͢ΔDPNQMFYJUZ ϊʔυ਺DPVOUSJFT ºDJUJFT OPEFT ͜Ε͕ᮢ஋ҎԼͳΒ࣮ߦ͢Δ { countries(first: 50) { name

    cities(first: 100) { name } } } ࢀߟ(JU)VC(SBQI2-"1*Wͷ/PEFMJNJU ϊʔυ਺͸ ·Ͱ ϦετͷऔಘͰ͸Ҿ਺ʹpSTU͔MBTU͕ඞਢͰҎ಺
  12. ྫܭࢉίετʹൺྫ͢ΔDPNQMFYJUZ type City { name superComplexStatistics @cost(n: 10) } (SBQI2-ͷEJSFDUJWFΛར༻ͯ͠ɺ

    ܕఆٛʢεΩʔϚʣͷଆͰॏ͍ܭࢉʹίετΛ͚ͭΔɻ αʔόʔ͸͜ͷ৘ใΛࢀরͯ͠DPNQMFYJUZΛܭࢉ͢Δ
  13. ྫܭࢉίετʹൺྫ͢ΔDPNQMFYJUZ type City { name superComplexStatistics @cost(n: 10) } (SBQI2-ͷEJSFDUJWFΛར༻ͯ͠ɺ

    ܕఆٛʢεΩʔϚʣͷଆͰॏ͍ܭࢉʹίετΛ͚ͭΔɻ αʔόʔ͸͜ͷ৘ใΛࢀরͯ͠DPNQMFYJUZΛܭࢉ͢Δ { countries(first: 100) { cities(first: 100) { superComplexStatistics } } } ΫΤϦ
  14. ྫܭࢉίετʹൺྫ͢ΔDPNQMFYJUZ type City { name superComplexStatistics @cost(n: 10) } (SBQI2-ͷEJSFDUJWFΛར༻ͯ͠ɺ

    ܕఆٛʢεΩʔϚʣͷଆͰॏ͍ܭࢉʹίετΛ͚ͭΔɻ αʔόʔ͸͜ͷ৘ใΛࢀরͯ͠DPNQMFYJUZΛܭࢉ͢Δ { countries(first: 100) { cities(first: 100) { superComplexStatistics } } } ܭࢉίετ ºDJUJFT ºDPTU   ΫΤϦ
  15. ྫܭࢉίετʹൺྫ͢ΔDPNQMFYJUZ type City { name superComplexStatistics @cost(n: 10) } (SBQI2-ͷEJSFDUJWFΛར༻ͯ͠ɺ

    ܕఆٛʢεΩʔϚʣͷଆͰॏ͍ܭࢉʹίετΛ͚ͭΔɻ αʔόʔ͸͜ͷ৘ใΛࢀরͯ͠DPNQMFYJUZΛܭࢉ͢Δ { countries(first: 100) { cities(first: 100) { superComplexStatistics } } } ܭࢉίετ ºDJUJFT ºDPTU   ΫΤϦ %#ΞΫηεճ਺΋શ͘ಉ͡ΞΠσΟΞͰDPNQMFYJUZΛઃܭͰ͖Δɻ%#ΞΫ ηε͕ൃੜ͢ΔϑΟʔϧυʹDPTUΛ͚ͭΕ͹ɺ%#ΞΫηεճ਺ʹൺྫͯ͠ DPNQMFYJUZ͕૿Ճ͢ΔΑ͏ʹͰ͖Δɻ