SELECT m.content, m.point, u.status, m.store_id
FROM (
SELECT * FROM user_missions
WHERE status IN ('SUCCESS', 'PROGRESS')
) u
JOIN (
SELECT mission_id, content, point, store_id FROM missions
) m ON u.mission_id = m.mission_id
WHERE (u.start_at, u.mission_id) > (#{cursorStartAt}, #{cursorMissionId})
ORDER BY m.point DESC ,u.start_at DESC
LIMIT #{size};
SQL Injection은 사용자가 데이터를 입력하는 부분에서, 유효성을 검사하지 못하는 부분을 활용하여 데이터베이스에 접근하기 위한 SQL 명령을 악의적으로 전달하는 것이다. 데이터베이스 권한을 획득하거나, 정보를 직접 검색함으로써 사용자의 데이터를 무단 침해할 수 있다.
사용자의 정보를 입력하는 로그인 부분을 예로 들어 볼 수 있다.
username, password를 입력하고 로그인 버튼을 클릭하면 실행되는 쿼리를 다음과 같이 작성할 수 있다.
"SELECT Count(*) FROM WHERE username =' " + txt.User.Text+" ' AND Password=' " + txt.Password.Text+" ' ";
사용자 이름을 admin으로
입력한 유저가 존재하는지 확인하는 쿼리이다. 해커들은 Magical String이라는 문자열을 사용해서 접근 권한을 획득한다.
"SELECT Count(*) FROM Users WHERE Username=' admin ' AND Password=' anything 'or'1'='1 ' ";
1=1이 항상 true이기 때문에 admin 권한을 얻을 수 있다.
| JOIN 종류 | 설명 | 결과 예시 |
|---|---|---|
INNER JOIN | 두 테이블에서 일치하는 값만 반환 | A와 B 테이블 모두에 존재하는 공통된 행만 보여줌 |
LEFT JOIN | 왼쪽 테이블의 모든 행과, 오른쪽 테이블에서 일치하는 값 반환 | 왼쪽 테이블에 있는 데이터는 모두 보이고, 오른쪽 테이블에 없으면 NULL로 채움 |
RIGHT JOIN | 오른쪽 테이블의 모든 행과, 왼쪽 테이블에서 일치하는 값 반환 | 오른쪽 테이블 데이터는 모두 보이고, 왼쪽 테이블에 없으면 NULL로 채움 |
FULL JOIN | 양쪽 테이블의 모든 행 반환, 일치하지 않는 행은 NULL로 채움 | INNER + LEFT + RIGHT 조합, 양쪽 모두 포함 |
CROSS JOIN | 두 테이블의 모든 조합(곱집합) 반환 |