[SQL] Injection 공격, 안티패턴, 페이징

Suzume·2023년 11월 15일
0

DataBase

목록 보기
11/16
post-thumbnail

🎆 SQL Injection 공격 (SQL 삽입 공격)

악의적인 사용자가 웹 응용 프로그램의 입력 양식 또는 매개 변수에 악성 SQL 코드를 삽입
데이터베이스에 대한 공격을 시도하는 보안 취약점
공격자는 데이터베이스를 조작하거나 민감한 정보를 노출시킬 수 있음

🧨 SQL Injection 예시

Error Based SQL Injection : 가장 대중적인 기법
SQL쿼리에 고의적으로 오류를 발생시키고 출력되는 에러의 내용으로 필요한 정보를 찾음

-- 사용자가 입력한 값을 이용한 로그인 SQL 쿼리
SELECT * FROM users WHERE uid = 'USER_ID' AND upw = 'INPUT_PW';

-- 공격자가 입력한 값을 이용한 SQL 쿼리 (SQL Injection)
SELECT user FROM users WHERE uid = '' OR 1 = 1 --' AND upw = 'INPUT_PW';
  • WHERE절에 있는 싱글 쿼터를 닫아주고 OR 1 = 1로 모두 True를 만들고 --를 이용해 그 뒤 모든 쿼리문을 주석처리
  • users 테이블의 모든 정보를 조회하며 가장 먼저 만들어진 관리자 계정으로 로그인해 관리자 계정 탈취

🎆 SQL 안티 패턴

비효율적이거나 잘못된 SQL 쿼리 작성 방식
안티패턴은 성능 문제, 보안 취약점, 코드의 가독성 및 유지보수 문제를 초래

🧨 SQL 안티 패턴 예시

1. SELECT * 사용

필요한 열만 명시적으로 조회하도록 하자.

-- 안티패턴: 모든 열을 선택
SELECT * FROM table_name;

2. 문자열 연결로 동적 쿼리 생성

SQL Injection 공격에 취약하다.
파라미터화된 쿼리나 저장 프로시저를 사용하자.

-- 안티패턴: 동적 쿼리 문자열 연결
DECLARE @sql NVARCHAR(MAX);
SET @sql = 'SELECT * FROM users WHERE username = ''' + @input + '''';
EXEC sp_executesql @sql;

3. 잘못된 데이터 타입 사용

정확성과 효율성이 떨어지니 데이터의 성격과 범위에 맞는 데이터 타입을 사용하자.

4. 비효율적인 JOIN 사용

성능 문제를 초래

5. 다중 칼럼 속성

하나의 엔터티에 여러 개의 값을 칼럼으로 만들지말자.


이외에도 많은 안티패턴이 있다.
http://happily70.dothome.co.kr/?p=682 에서 더 많은 안티패턴을 소개한다.

🎆 MySQL 페이지네이션

매번 전체 데이터를 가져오면 데이터가 많을 시 매우 느려짐
따라서 데이터를 조금씩 나눠 가져오고 사용자가 원할 때 다음 데이터를 가져옴

  • LIMIT: 행을 얼마나 가져올지
  • OFFSET: 어디서부터 가져올지
  • SELECT * FROM 테이블명 ORDERS LIMIT 숫자;: 숫자만큼의 행 출력
  • SELECT * FROM 테이블명 ORDERS LIMIT 숫자(A) OFFSET 숫자(B): (B+1)행부터 A행까지 출력
  • SELECT * FROM 테이블명 ORDER LIMIT 숫자(A), 숫자(B): (A+1)행부터 B개의 행 출력
SELECT * FROM USER orders LIMIT 10;
SELECT * FROM USER orders LIMIT 20;
SELECT * FROM USER ORDERS LIMIT 10 OFFSET 0;

🧨 인덱스를 태우는 페이징 처리 쿼리

  • 대용량 데이터의 경우 불필요한 행을 건너뛰고 원하는 범위의 행을 가져옴
SELECT * FROM 테이블명 
WHERE 숫자(A) < key 
LIMIT 숫자(B);
  • 숫자(A)값 보다 큰 인덱스 key를 기준으로 숫자(B)개만큼 행 선택
profile
미네르바의 부엉이는 황혼이 저물어야 그 날개를 편다.

0개의 댓글