본문 바로가기
컴퓨터

👨‍💻 [SQL] SQL Injection 을 방어하려면 어떻게 해야 하나요?

by 밝음의기둥 2024. 10. 16.
반응형

👨‍💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.

웹 방화벽 보고서 를 보다보니, SQL Injection 이란 말이 많이 나오더군요, 그래서, SQL Injection 을 방어하려면 어떻게 해야 하는지 찾아보았습니다.


질문 >

SQL Injection 을 방어하려면 어떻게 해야 하나요?

답변 >

SQL Injection을 방어하기 위해서는 웹 애플리케이션 개발 과정에서 입력 값의 검증과 데이터베이스와의 상호작용 방식을 신중히 처리해야 합니다. 다음은 SQL Injection을 방어하는 주요 방법들입니다:

1. Prepared Statements(준비된 쿼리)와 Parameterized Queries 사용

Prepared Statements를 사용하면 SQL 쿼리와 데이터 입력을 분리하여 SQL Injection 공격을 방지할 수 있습니다. 이 방법은 데이터베이스가 사용자 입력을 코드가 아닌 값으로 취급하게 만듭니다.

  • 예를 들어, PHP의 경우:이 방식은 쿼리와 데이터를 따로 처리하므로, 악의적인 SQL 코드가 포함된 입력을 방지합니다.
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();

2. Stored Procedures 사용

Stored Procedure는 서버에 미리 저장된 SQL 코드 블록으로, 애플리케이션에서 직접 SQL 쿼리를 작성하는 대신 서버에 있는 프로시저를 호출합니다. Stored Procedure를 사용하면 SQL Injection을 예방할 수 있는 경우가 많습니다.

  • 예를 들어, MySQL에서의 Stored Procedure:
CREATE PROCEDURE GetUser(IN username VARCHAR(50), IN password VARCHAR(50))
BEGIN
  SELECT * FROM users WHERE username = username AND password = password;
END;

3. 입력 값 검증 및 필터링

입력 값을 검증하고, 예상치 않은 입력을 처리하지 않도록 해야 합니다. 예를 들어, 입력 값에 알파벳과 숫자만 허용하거나, SQL 메타문자(예: --, ;, ', ")를 제거하는 필터를 사용할 수 있습니다. 하지만, 필터링은 완벽한 방법이 아니기 때문에 다른 보안 조치들과 병행해야 합니다.

4. ORM(Object-Relational Mapping) 도구 사용

ORM을 사용하면 SQL 쿼리를 직접 작성할 필요 없이 객체를 통해 데이터베이스 작업을 처리할 수 있습니다. ORM은 기본적으로 SQL Injection을 예방하는 기능을 제공합니다.

  • 예를 들어, Python의 SQLAlchemy 같은 ORM을 사용하면 SQL Injection에 대한 방어가 기본적으로 내장되어 있습니다:
user = session.query(User).filter_by(username=username).first()

5. 웹 애플리케이션 방화벽(WAF) 사용

WAF는 악의적인 SQL 코드를 자동으로 탐지하고 차단할 수 있는 솔루션입니다. WAF는 서버 앞단에서 요청을 분석하고 악성 패턴이 감지될 경우 이를 차단합니다.

6. 최소 권한의 데이터베이스 사용자 사용

애플리케이션이 데이터베이스와 상호작용할 때, 최소 권한을 가진 사용자 계정을 사용해야 합니다. 이를 통해 공격자가 SQL Injection을 통해 시스템에 접근하더라도 민감한 데이터나 중요한 데이터베이스 구조에 접근할 수 없게 됩니다.

  • 예를 들어, 애플리케이션에서 사용하는 데이터베이스 계정은 읽기와 쓰기 권한만 부여하고, 관리 권한은 부여하지 않는 방식입니다.

7. 에러 메시지 제한

애플리케이션에서 발생하는 SQL 오류 메시지에 자세한 정보(예: SQL 쿼리의 구문 오류나 테이블 이름 등)를 포함하지 않도록 합니다. 이는 공격자가 시스템을 탐색하고 공격의 범위를 확장하는 데 사용할 수 있기 때문입니다.

  • 예: "Database error"와 같은 일반적인 오류 메시지를 반환하고, 구체적인 정보는 로그에만 기록하는 방식.

8. ORM 또는 프레임워크 내장 보안 기능 사용

많은 현대적인 웹 프레임워크는 SQL Injection을 방지하는 기능을 기본적으로 제공합니다. 예를 들어, Django, Ruby on Rails, Laravel 등의 프레임워크는 SQL 쿼리 생성 시 사용자가 직접 SQL을 작성하지 않고도 안전하게 데이터베이스에 접근할 수 있는 기능을 제공합니다.


이러한 방법들을 적절히 결합하여 사용하면 SQL Injection의 위험을 효과적으로 줄일 수 있습니다. 특히 준비된 쿼리와 입력 값 검증은 가장 기본적이고 강력한 방어 수단입니다.


🎬 유튜브 채널 🎬

 

위로그@WiLog

📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리 입니다. 📢 위로그@WiLog 는 자기주도학습을 목적으로 라이브 스트리밍을 합니다. 📢 1인 게임 개발을 목표로 Unreal과 Blender를 학습 중입니

www.youtube.com

 

🎬 치지직 채널 🎬

 

위로그 채널 - CHZZK

지금, 스트리밍이 시작됩니다. 치지직-

chzzk.naver.com

 


반응형