Skip to content

Latest commit

ย 

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 ๋ฌธ๋ฒ• ์ข…๋ฅ˜์™€ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด์ฃผ์„ธ์š”.