๐ฏ SQL Injection
SQL Injection์ ์ ์์ ์ธ ์ฌ์ฉ์๊ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ ฅ ํผ ๋ฑ์ ํตํด SQL ์ฟผ๋ฆฌ๋ฌธ์ ์กฐ์ํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ๋น์ธ๊ฐ๋ ์ ๊ทผ ๋ฐ ์กฐ์์ ์๋ํ๋ ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ ๋๋ค.
SQL Injection example
์น ์ ํ๋ฆฌ์ผ์ด์
์์ ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก SQL ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํ ๋, ์ฌ์ฉ์์ ์
๋ ฅ๊ฐ์ด ๊ทธ๋๋ก ์ฟผ๋ฆฌ๋ฌธ์ ํฌํจ๋๋ ๊ฒฝ์ฐ์ ๋ฐ์ํ ์ ์์ต๋๋ค. ์
์์ ์ธ ์ฌ์ฉ์๋ ์
๋ ฅ๊ฐ์ SQL ์ฟผ๋ฆฌ๋ฌธ์ ํฌํจ์์ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐ์ํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ๋ก๊ทธ์ธ ์ฟผ๋ฆฌ๋ฌธ์ด ์๋ค๊ณ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค.
SELECT * FROM users WHERE username = '์ฌ์ฉ์ ์
๋ ฅ๊ฐ1' AND password = '์ฌ์ฉ์ ์
๋ ฅ๊ฐ2'
์ด ๋, ์ฌ์ฉ์ ์
๋ ฅ๊ฐ1์ ' OR '1'='1'
์ ์
๋ ฅํ๋ฉด ์ฟผ๋ฆฌ๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝ๋ฉ๋๋ค.
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '์ฌ์ฉ์ ์
๋ ฅ๊ฐ2'
์ด ๊ฒฝ์ฐ, '1':'1'
์ ํญ์ ์ฐธ์ด๋ฏ๋ก WHERE ์ ์ด ํญ์ ์ฐธ์ด ๋์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ชจ๋ ์ฌ์ฉ์ ์ ๋ณด๊ฐ ๋ฐํ๋ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์
์์ ์ธ ์ฌ์ฉ์๋ ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ์ ์ ์์ต๋๋ค.
SQL Injection ๋ฐฉ์ด
- Prepared Statements ์ฌ์ฉ: Prepared Statements๋ ์
๋ ฅ๊ฐ์ ๋ํ SQL ์ฟผ๋ฆฌ๋ฌธ์ ๋ฏธ๋ฆฌ ์ปดํ์ผํ์ฌ ์บ์์ ์ ์ฅํ๋ ๋ฐฉ์์
๋๋ค. ์ด๋ฅผ ํตํด ์
๋ ฅ๊ฐ์ ๊ทธ๋๋ก ์ฟผ๋ฆฌ๋ฌธ์ ํฌํจ์ํค๋ ๋์ , ์ฟผ๋ฆฌ๋ฌธ๊ณผ ์
๋ ฅ๊ฐ์ ๋ณ๋๋ก ์ ๋ฌํ์ฌ ์ฟผ๋ฆฌ๋ฌธ ์กฐ์์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE username = ? AND password = ?");
stmt.setString(1, ์ฌ์ฉ์ ์
๋ ฅ๊ฐ1);
stmt.setString(2, ์ฌ์ฉ์ ์
๋ ฅ๊ฐ2);
ResultSet rs = stmt.executeQuery();
- ์
๋ ฅ๊ฐ ๊ฒ์ฆ: ์
๋ ฅ๊ฐ์ ๊ฒ์ฆํ์ฌ ์ฟผ๋ฆฌ๋ฌธ์ ์
์์ ์ธ ์ฝ๋๊ฐ ํฌํจ๋์ง ์๋๋ก ํ๋ ๋ฐฉ๋ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์ ์
๋ ฅ๊ฐ์ ๋ํด ์ ๊ท์ ๊ฒ์ฆ์ ์ํํ์ฌ ํน์๋ฌธ์ ๋ฑ์ ํํฐ๋งํ ์ ์์ต๋๋ค.
if(!Pattern.matches("[a-zA-Z0-9]+", ์ฌ์ฉ์ ์
๋ ฅ๊ฐ1)){
// ์ฌ์ฉ์ ์
๋ ฅ๊ฐ1์ ํน์๋ฌธ์๊ฐ ํฌํจ๋์ด ์์ ๊ฒฝ์ฐ ์ฒ๋ฆฌ
}
์ด ์ธ์๋, ์ฌ์ฉ์ ์ ๋ ฅ๊ฐ์ ์ธ์ฝ๋ฉํ๊ฑฐ๋ SQL ์ฟผ๋ฆฌ๋ฌธ์ ์คํ ๊ถํ์ ์ต์ํ์ผ๋ก ๋ถ์ฌํ๋ ๋ฑ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ SQL Injection์ ๋ฐฉ์ดํ ์ ์์ต๋๋ค.
'Database' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Database] ์ ๊ทํ(Normalization) (0) | 2023.03.26 |
---|---|
[Database] SQL vs NoSQL (0) | 2023.03.26 |
[Database] JOIN (0) | 2023.03.25 |
[Database] Key (0) | 2023.03.25 |
[Database] MySQL to Oracle (0) | 2021.07.31 |