Webアプリケーションテストを用いた
SQLクエリのホワイトリスト自動作成手法@WSA2

 Webアプリケーションテストを用いた
SQLクエリのホワイトリスト自動作成手法@WSA2

野村孔命, 力武健次*, 松本亮介 / ペパボ研究所 / *力武健次技術士事務所
2018.05.12 第2回Web System Architecture研究会

Ec3fcf78fa2ad21dcc48478df80e0dc4?s=128

Komei Nomura

May 12, 2018
Tweet

Transcript

  1. ໺ଜ޸໋, ྗ෢݈࣍*, দຊ྄հ / ϖύϘݚڀॴ / *ྗ෢݈ٕ࣍ज़࢜ࣄ຿ॴ 2018.05.12 ୈ2ճWeb System

    Architectureݚڀձ WebΞϓϦέʔγϣϯςετΛ༻͍ͨ
 SQLΫΤϦͷϗϫΠτϦετࣗಈ࡞੒ख๏
  2. ໺ଜ ޸໋ / @komei 2 Komei Nomura ٕज़෦ ݚڀ։ൃνʔϜ ϖύϘݚڀॴ

    ݚڀһ GMOϖύϘגࣜձࣾ
  3. 1. ݚڀͷഎܠ 2. ैདྷͷෆਖ਼ΫΤϦݕ஌ͷ՝୊ 3. ఏҊख๏ 4. ·ͱΊͱࠓޙͷ՝୊ 3 ໨࣍

  4. 1. ݚڀͷഎܠ

  5. • WebΞϓϦέʔγϣϯʢWebΞϓϦʣͷ੬ऑੑΛར༻ͨ͠߈ܸ͸ޙΛઈͨͳ͍ • ߈ܸʹΑͬͯWebαʔϏε͕อ༗͢Δൿີ৘ใ͕࿙Ӯ͢Δඃ֐͕ൃੜ • WebΞϓϦ͕ར༻͢Δσʔλϕʔεʹෆਖ਼ΫΤϦΛൃߦ࣮͠ߦ͢Δ͜ͱͰ
 ߦΘΕΔ • 1ͭͷෆਖ਼ΫΤϦͷ࣮ߦ͕େن໛ͳ৘ใ࿙ӮΛҾ͖ى͜͢͜ͱ΋͋Δ •

    ෆਖ਼ΫΤϦΛݕ஌࣮͠ߦΛఀࢭ͢Δରࡦ͕ඞཁ 5 ݚڀͷഎܠ
  6. • ෆਖ਼ΫΤϦͷରࡦ͸ॏཁ͕ͩɼαʔϏεͷ։ൃ΍ӡӦʹӨڹΛ༩͑ͨ͘ͳ͍ • WebαʔϏεͷಛ௃Λߟྀ͢Δඞཁ͋Γ • WebαʔϏε͸සൟʹ࢓༷มߋ͞ΕWebΞϓϦͷվम͕ߦΘΕΔ • ։ൃϓϩηε΁ͷӨڹΛখ͘͞ • WebαʔϏεͷ࣮૷ʹ͸༷ʑͳݴޠʢPHP,

    RubyͳͲʣ͕༻͍ΒΕΔ • ͦΕͧΕʹରࡦΛ࣮૷͢Δ͜ͱ͸։ൃऀͷෛ୲ͱͳΔ • WebαʔϏεͷ࣮૷ʹґଘ͠ͳ͍ํ๏͕ඞཁ 6 WebαʔϏεʹ͓͚Δෆਖ਼ΫΤϦରࡦ
  7. 2. ैདྷͷෆਖ਼ΫΤϦݕ஌ͷ՝୊

  8. • WebΞϓϦ͕ൃߦ͢ΔΫΤϦͷϦετʢϗϫΠτϦετʣΛ࡞੒ͯ͠ෆਖ਼ΫΤϦ Λݕ஌͢Δํࣜ • WebΞϓϦͷେن໛Խ΍ෳࡶԽʹ൐͍WebΞϓϦ͕ൃߦ͢ΔΫΤϦ͕૿େ • WebαʔϏε͸࢓༷มߋʹΑΓWebΞϓϦ͕ൃߦ͢ΔΫΤϦ͕มԽ • ൃߦ͢ΔΫΤϦͱϗϫΠτϦετͷ੔߹ੑΛऔΔඞཁ͕͋Δ •

    WebαʔϏεӡ༻ऀͷෛ୲͕૿େ͢Δ܏޲͕͋Δ 8 ैདྷͷෆਖ਼ΫΤϦݕ஌ํࣜͱ՝୊
  9. • WebΞϓϦ͕ൃߦ͢ΔΫΤϦ͸࣮ࡍʹൃߦ͞ΕͨΫΤϦ΍ιʔείʔυ͔Β ݶఆͰ͖Δ • ϗϫΠτϦετΛࣗಈͰ࡞੒͢Δख๏͕ఏҊ͞Ε͍ͯΔ • WebΞϓϦՔಇ࣌ͷΫΤϦΛ༻͍ͯ࡞੒ • WebΞϓϦͷιʔείʔυΛղੳͯ͠࡞੒ 9

    ෆਖ਼ΫΤϦݕ஌ͷ՝୊ʹର͢Δैདྷख๏
  10. • WebΞϓϦՔಇ࣌ʹൃߦ͞ΕͨΫΤϦΛֶशͯ͠ϗϫΠτϦετΛ࡞੒͢Δ • WebΞϓϦͷ࣮૷ʹґଘͤͣϗϫΠτϦετΛ࡞੒Մೳ 10 WebΞϓϦՔಇ࣌ͷΫΤϦΛ༻͍ͨࣗಈ࡞੒ख๏ σʔλϕʔε 8FCΞϓϦ ΫΤϦ ϗϫΠτϦετ

    8FCΞϓϦՔಇ࣌
  11. • WebΞϓϦՔಇ࣌ʹϗϫΠτϦετ࡞੒ͱෆਖ਼ΫΤϦݕ஌͕ࠞࡏ • ϗϫΠτϦετ࡞੒த͸ෆਖ਼ΫΤϦͷݕ஌͕Ͱ͖ͳ͍ • WebαʔϏε͸සൟʹվम͞ΕΔ͜ͱ͔Βݕ஌Ͱ͖ͳ͍ظ͕ؒ૿େ • WebΞϓϦՔಈ࣌ʹ͸ෆਖ਼ΫΤϦΛݕ஌Ͱ͖Δঢ়ଶ͕ඞཁ • ϗϫΠτϦετͷ࡞੒͸WebΞϓϦՔಈલʹߦ͏ඞཁ͕͋Δ

    11 WebΞϓϦՔಇ࣌ͷΫΤϦΛ༻͍ͨࣗಈ࡞੒ख๏ͷ՝୊
  12. • WebΞϓϦͷιʔείʔυΛղੳͯ͠ϗϫΠτϦετΛ࡞੒͢Δ • WebΞϓϦՔಈલʹϗϫΠτϦετΛ࡞੒Ͱ͖Δ • WebΞϓϦՔಈޙɼଈ࣌ʹෆਖ਼ΫΤϦΛݕ஌Ͱ͖Δ 12 ιʔείʔυղੳΛ༻͍ͨࣗಈ࡞੒ख๏ ղੳث ιʔείʔυ

    ϗϫΠτϦετ 8FCΞϓϦՔಈલ
  13. • ιʔείʔυղੳ͕WebΞϓϦͷ࣮૷ʹґଘ͢Δ • WebαʔϏεͷ࣮૷ʹ͸༷ʑͳݴޠ͕༻͍ΒΕΔ • ͦΕͧΕͷWebαʔϏεʹରͯ͠ղੳثΛ࣮૷͢Δ͜ͱ͸։ൃऀͷෛ୲ͷ ૿େʹͭͳ͕Δ • WebΞϓϦͷ࣮૷ʹґଘ͠ͳ͍ํ๏͕ඞཁͱͳΔ 13

    ιʔείʔυղੳΛ༻͍ͨࣗಈ࡞੒ख๏ͷ՝୊
  14. • WebΞϓϦՔಇ࣌ʹൃߦ͞ΕΔΫΤϦΛֶशͯ͠࡞੒͢Δख๏ • WebΞϓϦՔಇޙɼଈ࣌ʹෆਖ਼ΫΤϦΛݕ஌Ͱ͖ͳ͍ • WebΞϓϦͷιʔείʔυΛղੳͯ͠࡞੒͢Δख๏ • WebΞϓϦͷ࣮૷ґଘͷͨΊɼ։ൃऀ΁ͷෛ୲ͷ૿େ͢Δ 14 ैདྷͷϗϫΠτϦετࣗಈ࡞੒ख๏ͷ՝୊·ͱΊ

  15. 3. ఏҊख๏

  16. • ैདྷख๏ͷ՝୊͔ΒఏҊख๏͸ҎԼͷཁ݅Λຬͨ͢ඞཁ͕͋Δ • WebΞϓϦՔಈલʹϗϫΠτϦετΛ࡞੒Ͱ͖Δ • WebΞϓϦͷ࣮૷ʹґଘͤͣϗϫΠτϦετΛ࡞੒Ͱ͖Δ • ಋೖ࣌ͷ։ൃϓϩηε΁ͷӨڹ͕খ͍͞ 16 ఏҊख๏ͷཁ݅

  17. • WebΞϓϦέʔγϣϯςετΛ༻͍ͨΫΤϦͷϗϫΠτϦετࣗಈ࡞੒ख๏ • ։ൃϓϩηεʹࣗಈςετ͕૊Έࠐ·Ε͍ͯΔલఏ • ςετ࣌ʹϗϫΠτϦετΛࣗಈͰ࡞੒͢ΔॲཧΛ௥Ճ • ςετ࣌ʹൃߦ͞ΕͨΫΤϦΛ༻͍ͯϗϫΠτϦετΛ࡞੒ 17 ఏҊख๏

  18. 18 લఏͱ͢ΔࣗಈςετΛ༻͍ͨ։ൃϓϩηε ։ൃ ςετίʔυهड़ αʔόʹ഑ஔ ࣗಈςετ /P :FT ӡ༻։࢝ ςετ੒ޭ

    w ৽ػೳͷ௥Ճ w طଘػೳͷमਖ਼ w 8FCΞϓϦΛಈ࡞ͤ͞Δखॱͱಈ࡞ͷ݁ՌΛهड़ w ςετίʔυΛݩʹࣗಈͰςετΛ࣮ߦ w 8FCΞϓϦͷಈ࡞͕࢓༷௨Γ͔Λ֬ೝ w ςετࣦഊɿ8FCΞϓϦͷιʔείʔυ΋͘͠͸
 ɹɹɹɹɹɹςετίʔυʹ໰୊͋Γ w ςετ੒ޭɿ8FCΞϓϦ͕࢓༷௨Γʹಈ࡞ w ৽͍͠8FCΞϓϦͷιʔείʔυΛαʔόʹ഑ஔ w ৽͍͠8FCΞϓϦͷӡ༻Λ։࢝
  19. 19 ։ൃ ςετίʔυهड़ αʔόʹ഑ஔ ࣗಈςετ ʴ ϗϫΠτϦετ࡞੒ /P :FT ӡ༻։࢝

    ςετ੒ޭ w ࣗಈςετ࣌ʹൃߦ͞ΕͨΫΤϦ͔ΒϗϫΠτϦετ Λࣗಈ࡞੒ w ҎԼΛͦΕͧΕαʔόʹ഑ஔ w ৽͍͠8FCΞϓϦͷιʔείʔυ w ৽͍͠8FCΞϓϦͷΫΤϦͷϗϫΠτϦετ ։ൃϓϩηεʹ͓͚ΔఏҊख๏ͷҐஔ෇͚ w ։ൃϓϩηε΁ͷӨڹ͕খ͍͞ w ӡ༻։࢝࣌ʹ͸ෆਖ਼ΫΤϦΛݕ஌Ͱ͖Δঢ়ଶ w ϗϫΠτϦετͷ໢ཏੑ͸ςετ࣌ʹൃߦ͞ΕͨΫ ΤϦʹґଘ w ߴ͍ςετΧόϨοδ͕ඞཁ
  20. 20 ఏҊख๏ͷઃܭ σʔλϕʔε σʔλϕʔεϓϩΩγ 8FCΞϓϦ ϗϫΠτϦετ • σʔλϕʔεͷલஈʹσʔλϕʔεϓϩΩγΛ഑ஔ • ςετ࣌ʹ͸ൃߦ͞ΕΔΫΤϦΛσʔλϕʔεϓϩΩγͰऩूͯ͠ϗϫΠτϦε

    τΛ࡞੒ɹˠɹWebΞϓϦͷ࣮૷ݴޠʹґଘ͠ͳ͍
  21. • WebΞϓϦ͕ൃߦ͢ΔΫΤϦ͸ϢʔβೖྗʹΑͬͯมԽ • ΫΤϦύλʔϯ͸๲େͱͳΔͨΊ͢΂ͯΛొ࿥͢Δͷ͸ࠔ೉ • ΫΤϦͷϦςϥϧΛϓϨʔεϗϧμʹஔ͖׵͑ͨΫΤϦߏ଄Λొ࿥ • ΫΤϦߏ଄͕ҟͳΔ΋ͷΛݕ஌Ͱ͖Δ 21 ϗϫΠτϦετͷొ࿥಺༰

    4&-&$5 '30.VTFST8)&3&JE 61%"5&VTFST4&5OBNFb5BJDIJ`8)&3&JE %&-&5&'30.VTFST8)&3&JE 4&-&$5 '30.VTFST8)&3&JE 61%"5&VTFST4&5OBNF 8)&3&JE %&-&5&'30.VTFST8)&3&JE Ϧςϥϧ
  22. • ΫΤϦߏ଄͕ಉҰͱͳΔ΋ͷ͸ݕ஌Ͱ͖ͳ͍ 22 ఏҊख๏Ͱݕ஌Ͱ͖ͳ͍ෆਖ਼ΫΤϦ ௨ৗɿSELECT * FROM users LIMIT 30

    ҟৗɿSELECT * FROM users LIMIT 1000 SELECT * FROM users LIMIT ?
  23. • ςετ࣌ʹൃߦ͞ΕΔΫΤϦ͸WebΞϓϦͷಈ࡞ͷաఔͰൃߦ͞ΕΔΫΤϦ • ఏҊख๏͸ςετ࣌ʹൃߦ͞ΕΔΫΤϦΛ༻͍ͯϗϫΠτϦετΛ࡞੒ • ݕ஌͞ΕΔΫΤϦ͸ςετ࣌ʹൃߦ͞Ε͍ͯͳ͍ΫΤϦ • ςετ͞Ε͍ͯͳ͍ΫΤϦͱෆਖ਼ΫΤϦؚ͕·ΕΔ 23 ఏҊख๏Ͱݕ஌Ͱ͖ΔΫΤϦͷߟ࡯

  24. 24 ΫΤϦͷ಺แؔ܎ શͯͷΫΤϦ ςετ͞Ε͍ͯΔΫΤϦྖҬ ʢϗϫΠτϦετʹొ࿥ʣ 8FCΞϓϦέʔγϣϯ͕ൃߦ͢ΔΫΤϦྖҬ ɿςετ͞Ε͍ͯΔΫΤϦྖҬ ɿෆਖ਼ΫΤϦྖҬ ɿςετ͞Ε͍ͯͳ͍ΫΤϦྖҬ

  25. 25 ςετΧόϨοδʹΑΔྖҬͷมԽ શͯͷΫΤϦ ςετ͞Ε͍ͯΔΫΤϦྖҬ ʢϗϫΠτϦετʹొ࿥ʣ 8FCΞϓϦέʔγϣϯ͕ൃߦ͢ΔΫΤϦྖҬ શͯͷΫΤϦ ςετ͞Ε͍ͯΔΫΤϦྖҬ ʢϗϫΠτϦετʹొ࿥ʣ 8FCΞϓϦέʔγϣϯ͕ൃߦ͢ΔΫΤϦྖҬ

    ςετΧόϨοδΛ޲্ͤ͞Δ͜ͱͰςετ͞Ε͍ͯΔΫΤϦྖҬΛ֦େ ˠɹෆਖ਼ΫΤϦͷݕ஌ਫ਼౓͕޲্ ɿςετ͞Ε͍ͯΔΫΤϦྖҬ ɿෆਖ਼ΫΤϦྖҬ ɿςετ͞Ε͍ͯͳ͍ΫΤϦྖҬ
  26. 4. ·ͱΊͱࠓޙͷ՝୊

  27. • WebΞϓϦέʔγϣϯςετΛ༻͍ͨΫΤϦͷϗϫΠτϦετࣗಈ࡞੒ख๏ ͷௐࠪɾݕ౼Λߦͬͨ • ఏҊख๏͸ҎԼͷཁ݅ΛຬͨͤΔͱߟ͑ΒΕΔ • WebΞϓϦՔಈલʹϗϫΠτϦετΛ࡞੒Ͱ͖Δ • WebΞϓϦͷ࣮૷ʹґଘͤͣϗϫΠτϦετΛ࡞੒Ͱ͖Δ •

    ಋೖ࣌ͷ։ൃϓϩηε΁ͷӨڹ͕খ͍͞ 27 ·ͱΊ
  28. • ఏҊख๏ͷ࣮૷ • ςετΧόϨοδʹର͢Δෆਖ਼ΫΤϦͷݕ஌ਫ਼౓ͷݕূ • ݕ஌ͨ͠ΫΤϦ͕ςετ͞Ε͍ͯͳ͍ΫΤϦ͔ෆਖ਼ΫΤϦ͔ͷ൑அํ๏ͷݕ౼ • ݱঢ়։ൃऀ೚ͤ • ΫΤϦͷϦςϥϧͷෆਖ਼Λݕ஌͢Δํ๏ͷݕ౼

    28 ࠓޙͷ՝୊