PHP에서 SQL 주입 방지
- 준비된 문과 PDO를 사용하여 PHP에서 SQL 삽입 방지
-
매개 변수가있는 쿼리와 함께
준비된
문을 사용하여 PHP에서 SQL 삽입 방지 -
SQL 삽입을 방지하기 위해
PDO::ATTR_EMULATE_PREPARES
속성을false
로 설정합니다
준비된 문장과 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
,firstname
및lastname
을 표시합니다.
아래 예제는 준비된 명령문의 사용을 보여줍니다. 자격 증명이 일치하는지 확인하기 위해 변수에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
,firstname
및lastname
을 표시합니다.
예제 코드 :
#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 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