

#목적 : 미션의 포인트, 지불할 금액, 미션이 주어진 가게 이름의 정보를 포인트, 미션의 생성 시간(유저 기준)을 기준으로 정렬하여 사용
SELECT
m.point,
m.payment,
s.name,
um.created_time,
concat(LPAD(m.point, 10, '0'), DATE_FORMAT(um.created_time, '%Y%m%d%H%i%s')) AS cursor
from
user_mission as um
join
mission as m on um.mission_id = m.id
join
store as s on m.store_id = s.id
where
CONCAT(LPAD(m.point, 10, '0'), '-', DATE_FORMAT(um.created_time, '%Y%m%d%H%i%s')) < '이전 커서값' #최근의 미션을 cursor로 새로 페이징
and
um.user_id = 3 #사용자의 아이디
and
um.is_completed = 1 # 미션의 진행중/진행완료 여부 (0 or 1)
order by
cursor DESC #cursor값을 사용해 정렬 (1. 포인트, 2. 최근 순 정렬)
limit 10; #한번에 보여질 개수
"SELECT Count(*) FROM Users WHERE Username=' " + txt.User.Text+" ' AND Password=' "+ txt.Password.Text+" ' ";
이때 해커가 다음과 같은 값을 입력하면(Magic String이라고 불립니다)
사용자 이름: admin
비밀번호: anything 'or'1'='1
"SELECT Count(*) FROM Users WHERE Username=' admin ' AND Password=' anything 'or'1'='1 ' ";
$id = $_GET['id']
(1) $id = Stripslashes($id)
(2) $id = mysql_real_escape_String($id)
이처럼 다양한 SQL 인젝션이 존재하는데,
- 대역 내 SQLi
- 추론(블라인드) SQLi
- 대역 외 SQLi
등의 인젝션이 존재하고,
방어의 방법으로는
- 입력 기능을 제한
- 필터링 및 검증
- SQL 명령 범위 제한
- 안전하지 않은 URL 매개 변수 방지
등이 존재합니다.

SELECT <열 목록>
FROM <첫 번째 테이블>
INNER JOIN <두 번째 테이블>
ON <조인 조건>
[WHERE 검색 조건]
SELECT <열 목록>
FROM <첫 번째 테이블(LEFT 테이블)>
<LEFT | RIGHT | FULL> OUTER JOIN <두 번째 테이블(RIGHT 테이블)>
ON <조인 조건>
[WHERE 검색 조건]
SELECT *
FROM <첫 번째 테이블>
CROSS JOIN <두 번째 테이블>
SELECT <열 목록>
FROM <테이블> 별칭A
INNER JOIN <테이블> 별칭B
[WHERE 검색 조건]