>데이터 베이스 >MySQL 튜토리얼 >준비된 문은 SQL 주입 공격을 어떻게 방지합니까?

준비된 문은 SQL 주입 공격을 어떻게 방지합니까?

Barbara Streisand
Barbara Streisand원래의
2025-01-23 20:48:11774검색

How Do Prepared Statements Prevent SQL Injection Attacks?

준비된 명령문을 사용한 SQL 주입 방지

준비된 명령문은 사용자 제공 데이터와 코드를 깔끔하게 분리하여 SQL 주입 취약점에 대한 강력한 방어 기능을 제공합니다.

SQL 주입 위협 이해

SQL 주입 공격은 신뢰할 수 없는 데이터가 SQL 쿼리에 직접 삽입될 때 발생합니다. 이러한 위험한 관행은 코드와 데이터 사이의 경계를 모호하게 만들어 공격자가 악의적인 명령을 주입할 수 있게 합니다. 간단한 예는 위험을 보여줍니다.

<code class="language-sql">$query = "SELECT * FROM users WHERE id = '" . $_GET['id'] . "'";</code>

$_GET['id']1; DROP TABLE users; --이 포함된 경우 결과 쿼리는 다음과 같습니다.

<code class="language-sql">SELECT * FROM users WHERE id = '1; DROP TABLE users; --';</code>

이 악성 입력은 DROP TABLE users 명령을 실행하여 잠재적으로 데이터베이스를 파괴합니다.

준비문의 메커니즘

준비된 문은 쿼리 구조를 데이터에서 분리하여 이 취약점을 해결합니다. 이 프로세스에는 두 단계가 포함됩니다.

  1. 쿼리 컴파일: 데이터베이스는 자리 표시자가 있는 쿼리 구조를 받습니다.
<code class="language-php">$stmt = $db->prepare("SELECT * FROM users WHERE id = ?");</code>

?은 데이터의 자리 표시자 역할을 합니다.

  1. 데이터 바인딩: 그런 다음 데이터가 별도로 전송됩니다.
<code class="language-php">$stmt->execute([$id]);</code>

데이터베이스는 제공된 데이터를 사용하여 사전 컴파일된 쿼리를 실행합니다. 결정적으로, 데이터는 실행 코드가 아닌 데이터로 처리되어 주입 공격을 방지합니다.

PHP/MySQL 구현

다음은 준비된 문을 사용한 이전 예의 보안 버전입니다.

<code class="language-php">$stmt = $db->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $expectedData); // "i" specifies integer data type
$stmt->execute();</code>

$expectedData에 악성 입력이 있어도 SQL 코드가 아닌 데이터 값으로 처리됩니다.

중요 고려사항

준비된 진술은 매우 효과적이지만 완전한 보호를 제공하지는 않습니다. 주로 데이터 리터럴 주입을 방지합니다. 쿼리 내에서 식별자(테이블 또는 열 이름)가 동적으로 생성되는 경우 추가 보안 조치가 중요합니다.

위 내용은 준비된 문은 SQL 주입 공격을 어떻게 방지합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.