2023. 2. 11. 15:47ใDatabase/DB ์คํฐ๋
์ด์ ์ NodeJS Express์ MySql2๋ฅผ ์ฐ๋ํ์ฌ ํ ์ด ํ๋ก์ ํธ๋ฅผ ์งํํ ์ ์ด ์๋ค.
๊ทธ๋ ์ฌ์ฉ์์ ์ด๋ฉ์ผ์ ๊ฐ์ง๊ณ ํด๋น ์ด๋ฉ์ผ์ ๊ฐ๋ ๊ณ์ ์ด ์กด์ฌํ๋์ง์ ๋ํ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ํจ์๋ฅผ ์์ฑํ ์ผ์ด ์๋๋ฐ, ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑํ๋ค.
๋น์ ์๋ก ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ํด์ฃผ๋ ๊ทธ๋ฃน์ด ์์๋๋ฐ, ํ๋ถ๊ป์ ์ ์ฝ๋๋ฅผ ๋ณด์๊ณ ๋ "SQL Injection ๊ณต๊ฒฉ์ ์ทจ์ฝํด ๋ณด์ธ๋ค"๋ผ๊ณ ํผ๋๋ฐฑ์ ํด์ฃผ์ ๊ธฐ์ต์ด ์๋ค.
์ง๊ธ์ด์ผ ์ ๋ฐ ์์ผ๋ก ์ฝ๋๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ์ด ์ํํ๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ๋น์์๋ ์๋ ๊ฒ์ด ๋ณ๋ก ์์๊ธฐ ๋๋ฌธ์ SQL Injection์ ๋ฐ๋ก ๊ณต๋ถํ๋ ๊ธฐ์ต์ด ์๋ค.
SQL Injection ์ด๋?
SQL Injection์ ํด์ปค๊ฐ ํ๋ก๊ทธ๋๋จธ์ ์๋์ ๋ฒ์ด๋ ๋ฐฉ๋ฒ์ ํตํด SQL๋ฌธ์ ์ฌ๊ตฌ์ฑ, DB์ ์ง์ํ์ฌ ์ฌ์ฉ์์ ๋น๋ฐ๋ฒํธ๋ ์ ์ฉ์นด๋ ์ ๋ณด ๋ฑ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ๋ฝ์๋ด๋ ๊ฒ์ ์๋ฏธํ๋ค.
์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด SQL๋ฌธ์ด ์์ฑ๋์ด ์๋ค.
SELECT * FROM `account` WHERE email='${email}'
์ด ๋ ๊ณต๊ฒฉ์๊ฐ ์ด๋ฉ์ผ์ด ์ ๋ ฅ๋์ด์ผ ํ๋ ๋์ ๋ค์์ ๋ฌธ์์ด์ ์ ๋ ฅํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
email = "' OR 1=1 --"
๊ฒฐ๋ก ์ ์ผ๋ก ๋ค์์ SQL๋ฌธ์ด ์์ฑ๋๋ค.
SELECT * FROM `account` WHERE email = '' OR 1 = 1 -- '
๊ณต๊ฒฉ์๊ฐ ์ ๋ ฅํ ๋ฌธ์์ด ๋ด ๊ตฌ๋ฌธ์ ๋ถ์ํด ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- ์์ ๋ถ๋ถ์ ' : ์ด๋ฏธ ์กด์ฌํ๋ email ์กฐ๊ฑด์ ๋น๋ฌธ์์ด์ ์ ๊ณตํ์ฌ email ์กฐ๊ฑด์ ์ ์ข ๋ฃ์ํด.
- OR : OR์ ํตํด ์ด์ ์ ์์ฑ๋ ์กฐ๊ฑด๋ฌธ์ ์ฐธ, ๊ฑฐ์ง๊ณผ ๊ด๊ณ์์ด ์ดํ ์กฐ๊ฑด์ ํตํด ์ฟผ๋ฆฌ๋ฅผ ์ ์ดํ ์ ์๋๋ก ๋ง๋ฆ.
- 1 = 1 : ํญ์ ์ฐธ์ด ๋๋ ์กฐ๊ฑด์ OR๊ณผ ํจ๊ป ์ถ๊ฐํ์ฌ ์ ์ฒด WHERE ์ ์ด ์ฐธ์ด ๋๋๋ก ๋ง๋ฆ.
- -- : ์ดํ ๋์ค๋ SQL ๊ตฌ๋ฌธ์ ๋ชจ๋ ์ฃผ์์ฒ๋ฆฌํจ. ์ฆ, ๋ค์ ์ด๋ค ์ ์ด ๊ธฐ์ ๋์ด ์๋๋ผ๋ ๋จ์ ์ฃผ์์ผ๋ก ๊ฐ์ฃผ๋์ด ์๋ํ์ง ์๋๋ก ๋ง๋ฆ.
์ฆ, ์ด๋ฉ์ผ ๋์ ์ ๋ฌธ์์ด์ ์ ๋ ฅํ์ฌ ๊ณต๊ฒฉ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ account ํ ์ด๋ธ ๋ด ๋ชจ๋ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ์ง์ํ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค.
์ด๋ ๋ช ๋ฐฑํ ํ๋ก๊ทธ๋๋จธ์ ์๋์๋ ๋ค๋ฅด๋ฉฐ ์๋น์ค์ ํฐ ์ํ์ด ๋ ์ ์๋ค.
SQL Injection ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๋ ๋ฐฉ๋ฒ
1. Prepared Statement ์ฌ์ฉ
Prepared Statement๊ฐ ๋ฌด์์ธ์ง ์ดํด๋ฅผ ๋๊ธฐ ์ํด, DBMS์ ์ฟผ๋ฆฌ ์๋ ๊ณผ์ ๊ณผ ํ์ฑ์ ๋ํด ์์๋ ํ์๊ฐ ์๋ค.
DBMS ์ฟผ๋ฆฌ ์๋ ๊ณผ์ ๊ณผ ํ์ฑ
DBMS์์ ์ฟผ๋ฆฌ๊ฐ ์๋๋๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ฟผ๋ฆฌ ์ ๋ ฅ : ํด๋ผ์ด์ธํธ๊ฐ ์์ฑํ SQL์ DBMS์ ์ ์ก
- ํ์ฑ (Parsing) : DBMS๋ ์ ๋ ฅ๋ฐ์ ์ฟผ๋ฆฌ์ ๋ํ ๊ตฌ๋ฌธ ๋ถ์์ ์งํํ๊ณ , ๊ตฌ๋ฌธ ํธ๋ฆฌ๋ฅผ ์์ฑ
- ์ต์ ํ (Optimization): DBMS๊ฐ ์ฟผ๋ฆฌ๋ฅผ ์คํ์ํฌ ์ต์ ์คํ ๊ณํ์ ๊ฒฐ์
- ์คํ (Execution) : ์ต์ ์คํ ๊ณํ์ ํตํด DB์์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์
- ๊ฒฐ๊ณผ ๋ฐํ (Fetching) : ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์ธํธ์ ์ ๋ฌ
์ด ์ค ํ์ฑ ๊ณผ์ ์ ๋๋ค์ ๋ค์์ผ๋ก ๋๋๋ค.
- ๋ฌธ๋ฒ ๊ฒ์ฌ : ์ฟผ๋ฆฌ์ ๊ฐ ๊ตฌ๋ฌธ(ex. SELECT, WHERE, FROM ๋ฑ)์ด ์ ํจํ๊ฒ ์์ฑ๋์๋์ง ๊ฒ์ฌ.
- ๊ตฌ๋ฌธ ๋ถ์ : ์ฟผ๋ฆฌ์์ ๊ฐ ๊ตฌ๋ฌธ์ ์๋ฏธ๋ฅผ ํ์ ํ๊ณ ๊ตฌ๋ฌธ ํธ๋ฆฌ๋ฅผ ์์ฑ. ์ด๋ ๊ตฌ๋ฌธ ํธ๋ฆฌ๋ ์ฟผ๋ฆฌ์ ๊ฐ ๊ตฌ๋ฌธ์ ์ํธ ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ ๊ตฌ์กฐ.
- ๋ถ์ ๊ฒฐ๊ณผ ์ ์ฅ : ํ์ฑ๋ ๊ตฌ๋ฌธ ํธ๋ฆฌ๋ฅผ DBMS์ ์ ์ฅ. ํฅํ ์ด๋ ์ต์ ํ์ ์คํ์ ์ด์ฉ๋จ.
ํ์ฑ์๋ ํ๋ ํ์ฑ๊ณผ ์ํํธ ํ์ฑ์ด ์กด์ฌํ๋๋ฐ,
ํ๋ ํ์ฑ์ ์์์ ์ค๋ช ํ ๋ชจ๋ ํ์ฑ ๊ณผ์ ์ ์ํํ๋ ๊ฒ์ ์๋ฏธํ๋ค. ๋ณดํต SQL ์ฟผ๋ฆฌ๋ฅผ ์ฒ์ ์คํํ ๋ ์ด์ฉ๋๋ค.
๋ฐ๋ฉด ์ํํธ ํ์ฑ์ ์ด๋ฏธ DBMS์ ์กด์ฌํ๋ ๊ตฌ๋ฌธ ํธ๋ฆฌ๋ฅผ ์ด์ฉํ๋ ๋ฐฉ์์ผ๋ก, ์๋ก ๋ค์ด์จ ํ๋ผ๋ฏธํฐ ์ ๋๋ง์ ์ฒจ๊ฐํ๋ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
Prepared Statement
Prepared Statement๋ ์์์ ์ธ๊ธํ ํ์ฑ๋ค ์ค ์ํํธ ํ์ฑ์ ์ด์ฉํ๋ ๋ฐฉ์์ด๋ค.
๋ฌผ๋ก ํ๋ ํ์ฑ์ ์์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ์๋๋ฉฐ, Prepared Statement์ ์๋ฏธ๋๋ก ์ค์ ์ฟผ๋ฆฌ๊ฐ ์ ๋ ฅ๋๊ธฐ ์ ์ ์ด๋ฏธ ํ๋ ํ์ฑ์ด ์๋ฃ๋์ด ๊ตฌ๋ฌธ ๋ถ์์ ์๋ฃํด ๋๋ค. ๊ทธ ํ ์ฌ์ฉ์๊ฐ ์ถ๊ฐํ ํ๋ผ๋ฏธํฐ๋ค์ ํด๋น ๊ตฌ๋ฌธ์ ์ฒจ๊ฐํ์ฌ ์ด๋ฅผ ๋ฐ๋ก ์ง์์ ํ์ฉํ๋ค.
์ด๋ฅผ ํตํ๋ฉด ํ๋ก๊ทธ๋๋จธ๊ฐ ์๋๋๋ก ์ฌ์ ์ ๊ตฌ๋ฌธ ๋ถ์์ ์๋ฃํด ๋ ์ ์์ผ๋ฉฐ, ์ ์์์ฒ๋ผ SQL๋ฌธ์ด ์ ๋ ฅ์ผ๋ก ๋ค์ด์จ๋ค ํด๋ ์๋กญ๊ฒ ๊ตฌ๋ฌธ ๋ถ์์ ์ํํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๋ ๋จ์ ๋ฌธ์์ด๋ก๋ง ์ธ์๋๋ค.
์ฆ SQL Injection ๊ณต๊ฒฉ์ ํจ๊ณผ์ ์ผ๋ก ๋ฐฉ์งํ ์ ์๋ค. ๋ํ ํด๋น ๋ฐฉ์์ ์ด์ฉํ๋ฉด ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ํ๋ ํ์ฑ์ ์ค์ฌ ์ฑ๋ฅ ์์ ์ด์ ๋ ์กด์ฌํ๋ค.
NodeJS์์ Prepared Statement ํ์ฉ
NodeJS์์๋ MySql2 ํจํค์ง๋ฅผ ํตํด ๋ค์๊ณผ ๊ฐ์ด Prepared Statement๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๊ธฐ์กด์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑ๋์ด ์๋ ์ฝ๋๋ฅผ
const sql = `SELECT * FROM account WHERE email='${email}'`;
await dbConnection.query(sql);
์๋์ ๊ฐ์ด ์์ ํ๋ฉด ๋๋ค.
const sql = 'SELECT * FROM account WHERE email = ?';
await dbConnection.execute(sql,[email]);
๊ทธ๋ฌ๋ฉด ? ๊ฐ ๋ค์ด๊ฐ ์๋ฆฌ๋ฅผ ๋น์๋ ์ฑ ๊ตฌ๋ฌธ ๋ถ์์ ์ํํ ๋ค์, ์ดํ ํด๋น ์๋ฆฌ์ ๋ค์ด๊ฐ ๊ฐ๋ง ๋ฐ๊พธ๋ ์์ผ๋ก ์๋ํ๊ฒ ๋๋ค.
2. User Input์ ๋ํ ์ถ๊ฐ์ ์ธ ๊ฒ์ฆ ์ํ
์ฌ์ฉ์์ ์ ๋ ฅ ๊ฐ์ด ํ๋ก๊ทธ๋๋จธ์ ์๋์ ๋ถํฉํ๋์ง ์ฟผ๋ฆฌ ์คํ ์ ๊ฒ์ฆํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
๊ฐ๋ น ์ ์์์์๋ ์ฌ์ฉ์์ ์ ๋ ฅ์ผ๋ก ์ด๋ฉ์ผ ํ์ (xxxxxxxxx@xxxxx.xxx)์ด ๋ค์ด์์ผ ํ๋ค.
์ด๋ฅผ ์ ๊ท์์ ํตํด ์ฌ์ ์ ๊ฒ์ฆํ๋ค๋ฉด SQL Injection ๊ณต๊ฒฉ์ ๋์ํ๋๋ฐ ๋์์ด ๋๋ค.
'Database > DB ์คํฐ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DB ์คํ๊ณํ ํ์ธ๋ฒ(in PostgreSQL) (1) | 2023.11.11 |
---|---|
RDB vs NoSQL (0) | 2023.02.18 |
ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค (0) | 2023.02.17 |
์๋ฃ๊ตฌ์กฐ in DB ์ธ๋ฑ์ค (0) | 2023.02.11 |
DB ์คํฐ๋(4์ฃผ์ฐจ) (0) | 2022.12.24 |