PHP에서 SQL 주입 방지

Subodh Poudel 2023년1월30일
  1. 준비된 문과 PDO를 사용하여 PHP에서 SQL 삽입 방지
  2. 매개 변수가있는 쿼리와 함께준비된문을 사용하여 PHP에서 SQL 삽입 방지
  3. SQL 삽입을 방지하기 위해PDO::ATTR_EMULATE_PREPARES속성을false로 설정합니다
PHP에서 SQL 주입 방지

준비된 문장과 PHP Data Objects (PDO)를 이용하여 PHP에서 SQL 삽입을 방지하는 방법을 소개합니다. 이 방법에서는 PDO를 사용하여 데이터베이스 통신을 설정합니다. 이 방법은 데이터와 쿼리를 별도로 데이터베이스 서버로 전송하여 데이터와 서버가 혼합되는 것을 방지합니다.

준비된 문과 매개 변수화 된 쿼리를 사용하여 PHP에서 SQL 삽입을 방지하는 방법을 소개합니다. 이 방법에서 데이터베이스 통신을 설정하기 위해mysqli를 사용합니다. 이 방법은 첫 번째 방법과 유사한 작동 메커니즘을 가지고 있습니다. 대조되는 점은 SQL 삽입을 방지하기 위해 사용하는mysqli함수뿐입니다.

준비된 명령문의 에뮬레이션을false로 설정하여 PHP에서 PDO를 사용하는 동안 SQL 주입으로부터 안전하게 보호하는 방법의 예를 보여줍니다.

준비된 문과 PDO를 사용하여 PHP에서 SQL 삽입 방지

PHP에서 SQL 주입을 방지하기 위해 PDO와 함께 준비된 문을 사용할 수 있습니다. SQL 주입은 데이터베이스로 전송하는 동안 쿼리와 데이터가 혼합되어있을 때 발생합니다. 이 방법에서는 SQL 문에있는 데이터의 정확한 값을 지정하지 않습니다. 대신 자리 표시자를 사용합니다. 이로 인해 매개 변수화 된 SQL 문이 첫 번째 요청으로 서버에 전송됩니다. 이를 위해prepare()함수를 사용합니다. 두 번째 요청의 정확한 매개 변수 값을 데이터베이스 서버에 바인딩합니다. 이를 위해bindValue()함수를 사용합니다. 이런 식으로 첫 번째 요청에서 프로그램을 보내고 두 번째 요청에서 데이터를 보냅니다. SQL 코드와 함께 데이터를 요청하면 사용자는 프로그램을 변경하고 악성 코드를 작성할 수 있습니다. 따라서 악성 SQL 코드가 서버에 주입되는 것을 방지합니다.

예를 들어,users테이블에는 다음 필드와 데이터가 포함됩니다.

+----+-----------+----------+------------+
| id | firstname | lastname | dob        |
+----+-----------+----------+------------+
|  1 | bruce     |  rose    | 1998-02-13 |
|  2 | jeff      |  james   | 2000-03-30 |
+----+-----------+----------+------------+

변수$firstname을 생성하고bruce라는 이름으로 할당합니다. 변수$sql을 만들고SELECT * FROM users WHERE firstname =:fname;쿼리를 작성합니다. 그 위에.

firstname에 대한 데이터의 정확한 값을 쓰지 마십시오. 대신:fname매개 변수를 사용하십시오. $pdo변수를 사용하여 쿼리 변수에서prepare()함수를 호출합니다. :fname값을firstname변수로 바꿉니다. execute()함수로 명령문을 실행하십시오. 자격 증명이 데이터베이스와 일치하면fetch()함수로 결과를 확인합니다. 그렇다면 선택한 행의id,firstnamelastname을 표시합니다.

아래 예제는 준비된 명령문의 사용을 보여줍니다. 자격 증명이 일치하는지 확인하기 위해 변수에firstname필드의 값을 저장합니다. 대신 변수에 악성 코드가 포함 된 경우Credentials do no match메시지가 표시됩니다. 이는prepared()함수가 매개 변수화 된 쿼리 만 사용하고 정확한 데이터를 허용하지 않기 때문입니다. $pdo변수는 데이터베이스 연결의 오브젝트를 포함합니다.

예제 코드 :

# php 7.*
<?php
$firstname = "bruce";
$sql = "SELECT * FROM users WHERE firstname =:fname ;";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(":fname", $firstname);
$stmt->execute();
if(!$result = $stmt->fetch(PDO::FETCH_OBJ)){
    echo "Credentials do no match";
} else {
    echo"Id: ".$result->id. " Name: ".$result->firstname." ".$result->lastname;
}
?>

출력:

Id: 1 Name: bruce rose

매개 변수가있는 쿼리와 함께준비된문을 사용하여 PHP에서 SQL 삽입 방지

PHP에서 SQL 삽입을 방지하기 위해 매개 변수가있는 쿼리와 함께 준비된 문을 사용할 수 있습니다. mysqli()함수의 객체를 사용하여 데이터베이스 연결을 만듭니다. 이 방법에서는 물음표 기호?를 사용합니다. 데이터의 자리 표시 자로 위의 방법으로prepare()함수를 사용합니다. 자리 표시 자에서 실제 데이터를 바인딩하기 위해bind_param()함수를 사용합니다. 이 방법은 위의 방법과 유사한 작동 메커니즘을 따릅니다.

예를 들어,mysqli()함수의 객체를 생성하는 데이터베이스 연결을 설정하고 변수$conn에 할당합니다. 이름jeff를 변수$firstname에 지정합니다. 변수$sql을 생성하고SELECT * FROM users WHERE first name =?;쿼리를 작성합니다. $conn변수를 사용하여 쿼리 변수에서prepare()함수를 호출합니다. 자리 표시 자?바꾸기 $firstname변수를 사용합니다. execute()함수로 명령문을 실행하십시오. 결과를$result변수에 저장하려면get_result()함수를 호출합니다. num_rows속성이있는 행이 있는지 확인하고 조건이 실패하면exit()함수를 사용하여행 없음메시지를 반환합니다. fetch_assoc()메소드를 호출하고 while 루프의$row변수에 저장합니다. 선택한 행의id,firstnamelastname을 표시합니다.

예제 코드 :

#php 7.x
<?php
$conn = new mysqli($host, $user, $pwd, $dbName);
$firstname = "jeff";
$sql = "SELECT * FROM users WHERE firstname = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("s", $firstname);
$stmt->execute();
$result = $stmt->get_result();
if($result->num_rows === 0) exit('No rows');
    while($row = $result->fetch_assoc()) {
    echo"Id: ".$row['id']. " Name: ".$row['firstname']." ".$row['lastname'];
}

출력:

Id: 2 Name: jeff james

SQL 삽입을 방지하기 위해PDO::ATTR_EMULATE_PREPARES속성을false로 설정합니다

PDO 속성을 올바르게 설정하지 않으면 PDO에서 준비된 문을 사용하는 것만으로는 SQL 주입을 방지 할 수 없습니다. 삽입을 방지하려면PDO::ATTR_EMULATE_PREPARES속성을false로 설정해야합니다. 속성을true로 설정하면 PDO는 준비된 명령문을 사용하는 대신 에뮬레이트합니다. 따라서 시스템은 SQL 주입에 취약합니다.

예를 들어, 변수$pdo에서 데이터베이스에 대한 PDO 연결을 만듭니다. 변수를 사용하여setAttribute()함수를 호출합니다. PDO::ATTR_EMULATE_PREPARES속성을 false로 설정하십시오.

코드 예 :

#php 7.x
<?php
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
?>
Subodh Poudel avatar Subodh Poudel avatar

Subodh is a proactive software engineer, specialized in fintech industry and a writer who loves to express his software development learnings and set of skills through blogs and articles.

LinkedIn