phpsafe 𝕏 GitHub
공식 CA 421DTkQ3TSG3n7F9SkNZj9NxvdFGbypwkctPd2uupump 이 주소만 공식 주소입니다.

변수로 만든 SQL (SQL 인젝션)

위험도: 치명적 CWE-89 OWASP A03:2021 Injection rule: sql

왜 위험한가요

입력값을 SQL에 직접 붙이면 공격자가 쿼리 자체를 바꿔서 DB의 모든 데이터를 읽거나 수정·삭제할 수 있습니다. prepared statement는 쿼리와 값을 따로 보내기 때문에 입력값이 SQL로 바뀔 수 없습니다.

✕ 취약한 코드
$id = $_GET['id'];
$rows = $db->query("SELECT * FROM users WHERE id = $id");
✓ 안전한 코드
$stmt = $db->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([$_GET['id']]);
$rows = $stmt->fetchAll();

해결 방법

prepared statement를 쓰세요: $db->prepare('... WHERE id = ?') 후 execute([$id]).

내 코드 검사하기

파일을 붙여넣으면 이 규칙에 걸리는 줄을 모두 찾아드립니다.

내 코드 검사하기 →