본문 바로가기
개념 노트장

[SQL] order by 0 과 order by if(1=1, 0, 0)의 차이

by jwcs 2024. 2. 10.
728x90

sql injection 쿼리를 분석하다가 공부한 내용이다.

 

먼저 `order by 0`에 대해 알아보겠다.

order by [상수(리터럴)]: 상수 번째 칼럼을 기준으로 정렬하겠다는 의미다. 이 값은 1부터 시작한다. 따라서 0을 넣게 되면 없는 칼럼을 검색하게 되어 에러가 나오게 된다.

select * from user order by 0;

사용 예시를들어보겠다.

SELECT name, age, address
FROM people
ORDER BY 2;

이 정렬은 age를 기준으로 정렬하는 것이다. 위의 예시가 올바른 사용 예시다.

 

그럼 `order by if(1=1, 0, 0)`에 대해 알아보자.

얼핏 봐서는 항상 참이기 때문에 `order by 0`과 같다고 생각된다. 실제로 사용해보면 정상적으로 수행되는 것을 확인해볼 수 있다.

안에 들어있는 값들은 다른 실습 때 사용한 것들이다. 무시해주길 바람

order by [표현식]: 여기서 표현식으로 정렬되는 값의 우선순위를 정해줄 수 있다. 예시를 들어보겠다.

SELECT name, age, address
FROM people
ORDER BY 
   CASE 
       WHEN age = 20 THEN 0
       WHEN age = 21 THEN 1
       ELSE 2
   END;

age가 20이면 0순위

age가 21이면 1순위

그 외는 2순위로 순서를 정해주는 예시다. 위 예시를 살짝 바꿔보겠다.

SELECT name, age, address
FROM people
ORDER BY 
   CASE 
       WHEN age = 20 THEN 0
       WHEN age = 21 THEN 0
       ELSE 0
   END;

모든 조건에서 0순위를 부여한다. 따라서 문법적 오류 없이 모든 경우가 0순위이다.

 

여기서 case문 대신 if문이 들어간 것이 `order by if(1=1, 0, 0)`으로 볼 수 있다.

728x90
반응형