MYSQL

mysql 5.x 에서 mysqli 인젝션 방어 방법


mysql 5.x 에서 mysqli 인젝션 방어 방법


  2023-05-08  315 View 공개

MySQL 5.x에서 PHP와 MySQLi를 사용하여 SQL 인젝션을 방어하는 주요 방법은 데이터를 처리하기 전에 이를 정제하고 쿼리를 안전하게 작성하는 것이다. 이를 위해 사용할 수 있는 기본 방법은 다음과 같다.


1. 준비된 문장(Prepared Statements) 사용

준비된 문장은 SQL 인젝션 공격을 방지하는 가장 효과적인 방법 중 하나이다. 변수를 직접 쿼리에 삽입하지 않고, 바인딩된 매개변수를 사용하여 쿼리를 실행한다. 이 방식은 MySQL에서 쿼리를 해석하고 값이 삽입되기 전에 모든 데이터를 정제해야 한다.

php
<?php 
$servername = 'localhost'
$username = 'your_username'
$password = 'your_password'
$dbname = 'your_database_name'

$conn
 = new mysqli($servername$username$password$dbname); 

if
 ($conn->connect_error) { 
     die('Connection failed: ' . $conn->connect_error);


$stmt
 = $conn->prepare('INSERT INTO your_table_name (name, email) VALUES (?, ?)'); 
$stmt->bind_param('ss'$name$email); 
$name = 'John Doe'
$email = 'john@example.com'$stmt->execute(); 

echo
 'New record created successfully'

$stmt
->close(); 
$conn->close(); 
?>

위 예제에서, ?는 쿼리에서 사용할 매개변수 플레이스홀더이다. bind_param 메서드를 사용하여 이러한 매개변수를 바인딩하고, 적절한 데이터 유형을 지정한다. 여기서 ss는 두 매개변수 모두 문자열임을 나타낸다.


2. 사용자 입력 데이터 정제

사용자로부터 입력받은 데이터를 쿼리에 사용하기 전에 정제해야 한다. 이를 위해 mysqli::real_escape_string 메서드를 사용하여 특수 문자를 정제할 수 있다.

php
$unsafe_variable = $_POST['user_input']; 
$safe_variable = $conn->real_escape_string($unsafe_variable);

그러나 가능하면 준비된 문장을 사용하는 것이 더 좋다. real_escape_string은 문자열 데이터에 대해서만 효과적이며, 준비된 문장은 모든 데이터 유형에 대해 안전하게 작동한다.


3. 입력 유효성 검사

사용자 입력을 받을 때 입력 데이터의 유효성을 검사하는 것이 좋다. 이를 통해 예상되는 데이터 형식과 값이 올바른지 확인할 수 있다.

php
function validate_email($email
      return filter_var($email, FILTER_VALIDATE_EMAIL);
}

위의 예제에서는 validate_email 함수를 사용하여 전자 메일 주소의 유효성을 검사한다. 입력 값이 유효하지 않으면 예외를 발생시키거나 오류메시지를 표시하여 사용자에게 알릴 수 있다. 유효성 검사는 필드 유형에 따라 다양한 방법으로 수행될 수 있으며, 이를 통해 입력 데이터의 정확성과 안전성을 향상시킨다.


4. 최소 권한 원칙

애플리케이션에 사용되는 MySQL 계정에 최소 권한만 부여하는 것이 좋다. 이를 통해 공격자가 악용할 수 있는 영향을 최소화할 수 있다. 예를 들어, 애플리케이션이 데이터를 읽고 쓸 필요가 있다면 SELECT, INSERT, UPDATE, DELETE 권한만 부여하고, DROP, ALTER 등의 권한은 부여하지 않아야 한다.


5. 오류 메시지 관리

제한된 오류 메시지를 사용하여 공격자에게 데이터베이스 구조에 대한 정보를 노출하지 않는 것이 좋다. 오류 메시지를 일반화하여 사용자에게 표시하고, 자세한 오류 정보는 로그에 기록하거나 개발자에게 전달하는 것이 좋다.

php
try { 
     // ... Your database operations ... 
catch (Exception $e) { 
     error_log($e->getMessage()); 
     echo 'An error occurred. Please try again later.';
}

이러한 보안 방법을 사용하여 MySQL 5.x와 PHP MySQLi를 사용하는 애플리케이션에서 SQL 인젝션 공격을 예방할 수 있다. 항상 코드를 검토하고 최신 보안 취약점과 모범 사례를 따르는 것이 중요하다.



🚩 MYSQL 글 모음 (총 37 건)

[macOS] zsh: command not found: mysql 해결 방법

Last Updated : 2023-09-29
#MySql

Mysql DB생성 및 유저등록

Last Updated : 2023-09-29
#Mysql

Mysql 백업 및 복구

Last Updated : 2023-09-29
#MySql

MySql - POD 예제

Last Updated : 2023-09-29
#MySql

데이터베이스에서 작은따옴표(')를 다루는 방법 : SQL 인젝션 예방과 데이터 출력

Last Updated : 2023-09-29
#Mysql

[mySQL] 특정 레코드가 몇 번째인지 알아내는 방법

Last Updated : 2023-09-10
#mySQL #row_number