설명
사용자 입력을 SQL 문자열에 직접 연결해 mysqli_query, query, exec 같은 API로 실행하면 SQL 인젝션이 발생할 수 있습니다.
잠재적 영향
인증 우회, 데이터 유출, 데이터 변조 또는 삭제가 가능합니다.
해결 방법
PDO 또는 mysqli prepared statement를 사용하고, 값은 바인드 파라미터로 전달합니다. 동적 테이블명이나 컬럼명은 허용 목록으로 제한합니다.
예시
변경 전
php
<?php
$id = $_REQUEST['id'];
$query = "SELECT * FROM users WHERE user_id = '$id'";
mysqli_query($db, $query);
변경 후
php
<?php
$id = intval($_REQUEST['id']);
$stmt = $pdo->prepare('SELECT * FROM users WHERE user_id = :id');
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->execute();
설명:
- 변경 전: PHP 요청 입력이 원시 SQL 실행 API에 도달합니다.
- 변경 후: PDO 또는 mysqli prepared statement를 사용하고, 값은 바인드 파라미터로 전달합니다.