Skip to content

Files

Latest commit

e695e66 ยท Feb 3, 2022

History

History
242 lines (161 loc) ยท 8.95 KB

SQL.md

File metadata and controls

242 lines (161 loc) ยท 8.95 KB

๐Ÿฌ SQL

๐Ÿ“š Table of contents

SQL

JOIN

SQL injection

๐Ÿฌ SQL ์ด๋ž€?

SQL์€ Structured Query Language, ๊ตฌ์กฐ์  ์งˆ์˜ ์–ธ์–ด์˜ ์ค„์ž„๋ง๋กœ, ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ(RDBMS)์—์„œ ์ž๋ฃŒ๋ฅผ ๊ด€๋ฆฌ ๋ฐ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

SQL ๋ฌธ๋ฒ•์˜ ์ข…๋ฅ˜

  • DDL(Data Definition Language, ๋ฐ์ดํ„ฐ ์ •์˜ ์–ธ์–ด)
    • ๊ฐ ๋ฆด๋ ˆ์ด์…˜์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด(CREATE, ALTER, DROP)
  • DML(Data Manipulation Language, ๋ฐ์ดํ„ฐ ์กฐ์ž‘ ์–ธ์–ด)
    • ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€/์ˆ˜์ •/์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•œ, ์ฆ‰ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์–ธ์–ด(SELECT, INSERT, UPDATE)
  • DCL(Data Control Language, ๋ฐ์ดํ„ฐ ์ œ์–ด ์–ธ์–ด)
    • ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ๋ฐ ์‚ฌ์šฉ์ž๋ณ„๋กœ ๋ฆฐ๋ ˆ์ด์…˜ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์ ‘๊ทผํ•˜๋Š” ๊ถŒํ•œ์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ์–ธ์–ด(GRANT, REVOKE)

SQL ์–ธ์–ด์  ํŠน์ง•

  1. SQL์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ฐ€๋ฆฌ์ง€ ์•Š์Œ
  2. SQL ๋ช…๋ น์–ด ๋์— ;์„ ๋ถ™์—ฌ์•ผ ํ•œ๋‹ค.
  3. ๊ณ ์œ ์˜ ๊ฐ’์€ '' ๋”ฐ์˜ดํ‘œ๋กœ ๊ฐ์‹ผ๋‹ค. ex. SELECT * FRIM LAWYER WHERE NAME = 'steve';
  4. SQL์—์„œ ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ผ ๋•Œ๋Š” ๋ฐฑํ‹ฑ(``)์œผ๋กœ ๊ฐ์‹ผ๋‹ค. ex. SELECT COST`, `TYPE` FROM `INVOICE`;`
  5. ์ฃผ์„์€ ๋ฌธ์žฅ์•ž์— --์„ ๋ถ™์ž„
  6. ์—ฌ๋Ÿฌ ์ค„ ์ฃผ์„ /* */



๐Ÿฌ JOIN

JOIN์€ ๋‘๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์™ธ๋ž˜ํ‚ค๋ฅผ ํ†ตํ•˜์—ฌ ์—ฐ๊ฒฐํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•(์ ์–ด๋„ ํ•˜๋‚˜์˜ attribute๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.)

JOIN์˜ ์ข…๋ฅ˜

  • INNET JOIN
  • LEFT OURTER JOIN
  • RIGHT OUTER JOIN
  • FULL OUTER JOIN
  • CROSS JOIN
  • SELF JOIN

Table ์˜ˆ์‹œ

ANIMAL_INS

NAME TYPE NULLABLE
ANIMAL_ID VARCHAR(N) FALSE
ANIMAL_TYPE VARCHAR(N) FALSE
DATETIME DATETIME FALSE
INTAKE_CONDITION VARCHAR(N) FALSE
NAME VARCHAR(N) TRUE
SEX_UPON_INTAKE VARCHAR(N)

ANIMAL_OUTS table

NAME TYPE NULLABLE
ANIMAL_ID VARCHAR(N) FALSE
ANIMAL_TYPE VARCHAR(N) FALSE
DATETIME DATETIME FALSE
NAME VARCHAR(N) TRUE
SEX_UPON_OUTCOME VARCHAR(N) FALSE

์˜ˆ์ œ

INNER JOIN

IJ

=> ๊ต์ง‘ํ•ฉ์œผ๋กœ ๊ธฐ์ค€ ํ…Œ์ด๋ธ”๊ณผ join ํ…Œ์ด๋ธ”์˜ ์ค‘๋ณต๋œ ๊ฐ’์„ ๋ณด์—ฌ์ค€๋‹ค. Inner Join์€ ๊ณตํ†ต๋œ ์š”์†Œ๋“ค์„ ํ†ตํ•ด ๊ฒฐํ•ฉํ•˜๋Š” ์กฐ์ธ ๋ฐฉ์‹์œผ๋กœ sql์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” join์ž…๋‹ˆ๋‹ค.

query : ๋ณดํ˜ธ์†Œ์— ๋“ค์–ด์˜จ ์ •๋ณด์™€ ๋‚˜๊ฐ„ ์ •๋ณด๊ฐ€ ์žˆ๋Š” ๋™๋ฌผ์˜ id๋ฅผ ์ถœ๋ ฅํ•˜์‹œ์˜ค.

select ins.animal_id
from animal_ins as ins
join animal_outs as outs on ins.animal_id = outs.animal_id

LEFT OUTER JOIN

loj

=> ๊ธฐ์ค€ํ…Œ์ด๋ธ”๊ฐ’๊ณผ ์กฐ์ธ ํ…Œ์ด๋ธ”๊ณผ ์ค‘๋ณต๋œ ๊ฐ’์„ ๋ณด์—ฌ์ค€๋‹ค. ์™ผ์ชฝํ…Œ์ด๋ธ” ๊ธฐ์ค€์œผ๋กœ join์„ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•˜๋‹ค. ์™ผ์ชฝ ํ…Œ์ด๋ธ”์„ ๊ธฐ์ค€์œผ๋กœ joinํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์™ผ์ชฝ์—๋Š” id๊ฐ’์ด ์žˆ์ง€๋งŒ, ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์˜ id๊ฐ€ ๋„๊ฐ’๋„ ํฌํ•จํ•˜์—ฌ ์ถœ๋ ฅํ•œ๋‹ค.

select ins.animal_id
from animal_ins as ins
left outer join animal_outs as outs on ins.animal_id = outs.animal_id

์˜ˆ์ œ

๋ฌธ์ œ)๊ด€๋ฆฌ์ž์˜ ์‹ค์ˆ˜๋กœ ์ผ๋ถ€ ๋™๋ฌผ์˜ ์ž…์–‘์ผ์ด ์ž˜๋ชป ์ž…๋ ฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณดํ˜ธ ์‹œ์ž‘์ผ๋ณด๋‹ค ์ž…์–‘์ผ์ด ๋” ๋น ๋ฅธ ๋™๋ฌผ์˜ ์•„์ด๋””์™€ ์ด๋ฆ„์„ ์กฐํšŒํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ์ด๋•Œ ๊ฒฐ๊ณผ๋Š” ๋ณดํ˜ธ ์‹œ์ž‘์ผ์ด ๋น ๋ฅธ ์ˆœ์œผ๋กœ ์กฐํšŒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ •๋‹ต

SELECT ins.animal_id, ins.name
from animal_ins as ins
left outer join animal_outs as outs on ins.animal_id = outs.animal_id
where outs.datetime < ins.datetime
order by ins.datetime

RIGHT OUTER JOIN

roj

=> ๊ธฐ์ค€ํ…Œ์ด๋ธ”๊ฐ’๊ณผ ์กฐ์ธ ํ…Œ์ด๋ธ”๊ณผ ์ค‘๋ณต๋œ ๊ฐ’์„ ๋ณด์—ฌ์ค€๋‹ค. ์˜ค๋ฅธ์ชฝํ…Œ์ด๋ธ” ๊ธฐ์ค€์œผ๋กœ join์„ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•˜๋‹ค. ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์„ ๊ธฐ์ค€์œผ๋กœ join์„ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์™ผ์ชฝ ํ…Œ์ด๋ธ”์˜ id๊ฐ€ null์ธ ๊ฒƒ๋„ ํฌํ•จํ•˜์—ฌ ์ถœ๋ ฅํ•œ๋‹ค.

select ins.animal_id
from animal_ins as ins
right outer join animal_outs as outs on ins.animal_id = outs.animal_id

์˜ˆ์ œ

๋ฌธ์ œ) ์ฒœ์žฌ์ง€๋ณ€์œผ๋กœ ์ธํ•ด ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์‹ค๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ž…์–‘ ๊ฐ„ ๊ธฐ๋ก์€ ์žˆ๋Š”๋ฐ, ๋ณดํ˜ธ์†Œ์— ๋“ค์–ด์˜จ ๊ธฐ๋ก์ด ์—†๋Š” ๋™๋ฌผ์˜ id์™€ ์ด๋ฆ„์„ id ์ˆœ์œผ๋กœ ์กฐํšŒํ•˜๋Š” sql๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

์ •๋‹ต ์ฝ”๋“œ

SELECT a.animal_id, b.animal_id, b.name
from animal_ins as a right outer join animal_outs as b
on a.animal_id = b.animal_id
-- where a.animal_id is null
order by b.animal_id asc

FULL OUTER JOIN

loj

=> Ins์™€ Outs ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฒ€์ƒ‰๋œ๋‹ค.

select ins.animal_id
from animal_ins as ins
full outer join animal_outs as outs on ins.animal_id = outs.animal_id

CROSS JOIN

cj

=> ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ „๋ถ€ ํ‘œํ˜„ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค. A๊ฐ€ 3๊ฐœ, B๊ฐ€ 4๊ฐœ๋ผ๋ฉด ์ด 3*4 = 12๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฒ€์ƒ‰๋œ๋‹ค.

select ins.animal_id, outs.animal_id, hour(ins.datetime) as hour
from animal_ins as ins
cross join animal_outs as outs
where hour(ins.datetime) < 10
order by hour

SELF JOIN

sj

=> ์ž๊ธฐ ์ž์‹ ๊ณผ ์ž๊ธฐ ์ž์‹ ์„ ์กฐ์ธํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์„ ์—ฌ๋Ÿฌ๋ฒˆ ๋ณต์‚ฌํ•ด์„œ ์กฐ์ธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•˜๋‹ค. ์ž์‹ ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์นผ๋Ÿผ์„ ๋‹ค์–‘ํ•˜๊ฒŒ ๋ณ€ํ˜•์‹œ์ผœ ํ™œ์šฉํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉํ•œ๋‹ค. Self join์„ ์ด์šฉํ•  ๋•Œ๋Š” ๋ณ„์นญ์„ ํ•„์ˆ˜๋กœ ์ž…๋ ฅํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค. ๊ฐ™์€ ํ…Œ์ด๋ธ” 2๊ฐœ ๋˜๋Š” ๊ทธ ์ด์ƒ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๋ณ„์นญ์„ ์ •ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ํ˜ผ๋™๋˜๊ณ  ์—๋Ÿฌ๊ฐ€ ๋œจ๊ธฐ๋„ ํ•œ๋‹ค.

select ins1.animal_id, ins2.animal_id
from animal_ins as ins1
join animal_ins as ins2 on ins2.animal_id = ins1.animal_id



๐Ÿฌ SQL Injection

์•…์˜์ ์ธ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด์•ˆ์ƒ์˜ ์ทจ์•ฝ์ ์„ ์ด์šฉํ•˜์—ฌ ์ž„์˜์˜ SQL๋ฌธ์„ ์ฃผ์ž…ํ•˜๊ณ  ์‹คํ–‰๋˜๊ฒŒ ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋น„์ •์ƒ์ ์ธ ๋™์ž‘์„ ํ•˜๋„๋ก ์กฐ์ž‘ํ•˜๋Š” ํ–‰์œ„์ด๋‹ค. ์ธ์ ์…˜ ๊ณต๊ฒฉ์€ top10 ์ค‘ ์ฒซ ๋ฒˆ์งธ์— ์†ํ•ด ์žˆ์œผ๋ฉฐ, ๊ณต๊ฒฉ์ด ๋น„๊ต์  ์‰ฌ์šดํŽธ์ด๊ณ  ๊ณต๊ฒฉ์— ์„ฑ๊ณตํ•  ๊ฒฝ์šฐ ํฐ ํ”ผํ•ด๋ฅผ ์ž…ํž ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฒฉ์ด๋‹ค.

Injection ๊ณต๊ฒฉ ๋ฐฉ๋ฒ•

  1. ์ธ์ฆ ์šฐํšŒ

๋ณดํ†ต ๋กœ๊ทธ์ธ์„ ํ•  ๋•Œ, ์•„์ด๋””์™€ ํŒจ์Šค์›Œ๋“œ๋ฅผ input ์ฐฝ์— ์ž…๋ ฅํ•œ๋‹ค. ๊ทธ ๋•Œ ์ „์†ก๋˜๋Š” ์ฟผ๋ฆฌ์˜ ๋ชจ์–‘์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. id = loouserid, password = 1111์ผ ๋•Œ,

select * from user where id='loouserid' and password = '1111';

SQL injection์œผ๋กœ ๊ณต๊ฒฉํ•  ๋•Œ, input ์ฐฝ์— ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•จ๊ณผ ๋™์‹œ์— ๋‹ค๋ฅธ ์ฟผ๋ฆฌ๋ฌธ์„ ํ•จ๊ป˜ ์ž…๋ ฅํ•œ๋‹ค.

1111; delete * user from id = '1';

๋ณด์•ˆ์— ์ทจ์•ฝํ•˜๋‹ค๋ฉด ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ์•„์ด๋””๊ฐ€ ์ผ์น˜ํ•ด์„œ True๋กœ ๋ฆฌํ„ดํ•˜๊ณ  ๋’ค์— ์ž‘์„ฑํ•œ delete๋ฌธ๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

sqlinject

์œ„์˜ ์‚ฌ์ง„ ์ฒ˜๋Ÿผ ๋’ค์— where์ ˆ์— or๋ฌธ์„ ์ถ”๊ฐ€ํ•˜์—ฌ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฟผ๋ฆฌ๋กœ ๋งŒ๋“ค์–ด ๋ฌด์กฐ๊ฑด ์ ์šฉ๋˜๋„๋กํ•˜์—ฌ db๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

  1. ๋ฐ์ดํ„ฐ ๋…ธ์ถœ

์‹œ์Šคํ…œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ด์šฉํ•ด ๊ณต๊ฒฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๋ณดํ†ต ์—๋Ÿฌ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฉด์—์„œ ๋„์›€์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์กด์žฌ์ธ๋ฐ, ํ•ด์ปค๋“ค์€ ์ด๋ฅผ ์—ญ์ด์šฉํ•ด ์•…์˜์ ์ธ ๊ตฌ๋ฌธ์„ ์‚ฝ์ž…ํ•˜์—ฌ ์—๋Ÿฌ๋ฅผ ์œ ๋ฐœ์‹œํ‚จ๋‹ค.

ex) ํ•ด์ปค๊ฐ€ GET ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š” URL ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ๊ธฐํ‚จ๋‹ค. ์ด์— ํ•ด๋‹นํ•˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ด๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์›น์•ฑ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ๋ฅผ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๊ณ  ํ•ดํ‚น์— ํ™œ์šฉํ•œ๋‹ค.

Injection ๋ฐฉ์–ด๋ฐฉ๋ฒ•

  1. input ๊ฐ’์„ ๋ฐ›์„ ์‹œ ํŠน์ˆ˜ ๋ฌธ์ž ์—ฌ๋ถ€ ๊ฒ€์‚ฌ
  • ๋กœ๊ทธ์ธ ์ „์— ๊ฒ€์ฆ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํŠน์ˆ˜ ๋ฌธ์ž๋“ค์ด ํฌํ•จ๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ ์š”์ฒญ์„ ๊ฑฐ๋ถ€ํ•œ๋‹ค.
  1. SQL ์„œ๋ฒ„ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ํ•ด๋‹นํ•˜๋Š” ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๊ฐ์ถค
  • view๋ฅผ ํ™œ์šฉํ•ด์„œ ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์˜ ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋†’์ธ๋‹ค. ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋Š” view๋กœ๋งŒ ์ ‘๊ทผํ•˜์—ฌ ์—๋Ÿฌ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์—†๋„๋ก ๋งŒ๋“ ๋‹ค.
  1. Prepare statement ์‚ฌ์šฉ
  • prepare statement๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ˆ˜๋ฌธ์ž๋ฅผ ์ž๋™์œผ๋กœ escaping ํ•ด์ค€๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜๋ฉด ์„œ๋ฒ„ ์ธก์—์„œ ํ•„ํ„ฐ๋ง ๊ณผ์ •์„ ํ†ตํ•ด์„œ ๊ณต๊ฒฉ์„ ๋ฐฉ์–ดํ•œ๋‹ค.



๐Ÿ“š ์ฐธ๊ณ 

SQL์ด๋ž€?

JOIN1

JOIN2

SQL injection1

SQL injection2

๋ฉด์ ‘ ์งˆ๋ฌธ

  1. SQL injection์˜ ๊ณต๊ฒฉ ๋ฐฉ์‹์—๋Š” ๋ฌด์—‡์ด ์žˆ๋‚˜์š”?
  1. injection์„ ๋ฐฉ์–ดํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์€ ์–ด๋–ค๊ฒŒ ์žˆ๋‚˜์š”?
  1. join์—์„œ left์™€ right join์˜ ์ฐจ์ด์ ์„ ๋งํ•ด์ฃผ์„ธ์š”.
  1. SQL ๋ฌธ๋ฒ• ์ข…๋ฅ˜์™€ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด์ฃผ์„ธ์š”.