(php) Prepared Statement과 SQL Injection
1.SQL Injection
SQL Injection은 웹 애플리케이션 취약점 공격의 일종으로, 악의적인 사용자가 SQL 쿼리를 조작하여 비정상적인 데이터베이스 접근을 시도하는 공격 기법입니다.
SQL Injection 공격은 보통 웹 애플리케이션에서 사용되는 폼 등에서 입력값을 받아 데이터베이스 쿼리에 전달하는 경우에 발생합니다. 악의적인 사용자는 입력란에 악성 코드나 SQL 쿼리문을 입력하여, 입력받은 값이 데이터베이스에 그대로 전달되어 실행되도록 유도합니다. 이렇게 전달된 악성 코드나 SQL 쿼리는 데이터베이스에서 실행되어 보안상 중요한 데이터를 탈취하거나 삭제, 수정 등의 악의적인 행위를 일으키게 됩니다.
SQL Injection은 웹 애플리케이션에서 매우 흔한 보안 취약점으로, 악의적인 사용자가 데이터베이스에 대한 완전한 제어권을 얻어 낼 수 있어 매우 위험한 공격입니다. 따라서, 웹 애플리케이션 개발 시 SQL Injection을 예방하기 위한 적절한 보안 대책을 마련하여야 합니다.
2.Prepared Statement
mysqli_prepare()는 MySQL 서버에 대한 SQL 문장을 사전 컴파일하여 데이터베이스에 안전하게 전달할 수 있는 기능을 제공하는 PHP의 함수입니다. 이 함수는 SQL Injection 공격을 예방할 수 있도록 하며, 데이터베이스에서 실행할 SQL 문장을 사전 컴파일하여 해당 문장의 실행 플랜을 최적화할 수 있습니다.
mysqli_prepare() 함수는 SQL 문장을 준비하고, 데이터베이스 서버에 전송할 준비가 된 쿼리 객체(Prepared Statement Object)를 반환합니다. 이 객체는 mysqli_stmt_execute() 함수를 사용하여 실행될 수 있습니다. Prepared Statement 객체는 다양한 파라미터를 통해 동적으로 데이터를 바인딩할 수 있으며, 이를 통해 더욱 안전하고 효율적인 SQL 문장을 수행할 수 있습니다.
예를 들어, 아래 코드는 mysqli_prepare() 함수를 사용하여 SQL Injection 공격으로부터 보호되는 SQL 문장을 실행하는 예시입니다.
$stmt = mysqli_prepare($conn, "SELECT * FROM users WHERE username = ? AND password = ?");
mysqli_stmt_bind_param($stmt, "ss", $username, $password);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
위 코드에서 mysqli_prepare() 함수를 사용하여 SQL 문장을 준비하고, mysqli_stmt_bind_param() 함수를 사용하여 변수를 Prepared Statement 객체에 바인딩합니다.
이렇게 준비된 Prepared Statement 객체를 mysqli_stmt_execute() 함수를 사용하여 실행하고, 결과를 mysqli_stmt_get_result() 함수를 사용하여 받아옵니다.
이렇게 함으로써 SQL Injection 공격으로부터 보호받을 수 있습니다.