악의적인 사용자가 웹 응용 프로그램의 입력 양식 또는 매개 변수에 악성 SQL 코드를 삽입
데이터베이스에 대한 공격을 시도하는 보안 취약점
공격자는 데이터베이스를 조작하거나 민감한 정보를 노출시킬 수 있음
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';
비효율적이거나 잘못된 SQL 쿼리 작성 방식
안티패턴은 성능 문제, 보안 취약점, 코드의 가독성 및 유지보수 문제를 초래
필요한 열만 명시적으로 조회하도록 하자.
-- 안티패턴: 모든 열을 선택
SELECT * FROM table_name;
SQL Injection 공격에 취약하다.
파라미터화된 쿼리나 저장 프로시저를 사용하자.
-- 안티패턴: 동적 쿼리 문자열 연결
DECLARE @sql NVARCHAR(MAX);
SET @sql = 'SELECT * FROM users WHERE username = ''' + @input + '''';
EXEC sp_executesql @sql;
정확성과 효율성이 떨어지니 데이터의 성격과 범위에 맞는 데이터 타입을 사용하자.
성능 문제를 초래
하나의 엔터티에 여러 개의 값을 칼럼으로 만들지말자.
이외에도 많은 안티패턴이 있다.
http://happily70.dothome.co.kr/?p=682 에서 더 많은 안티패턴을 소개한다.
매번 전체 데이터를 가져오면 데이터가 많을 시 매우 느려짐
따라서 데이터를 조금씩 나눠 가져오고 사용자가 원할 때 다음 데이터를 가져옴
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);