[SQL Injection] 프리페어드 스테이트먼트

 프리페어드 스테이트먼트 




SQL 인젝션 취약점 제거 방법 중 가장 이상적인 방법입니다 . 

프리페어드 스테이트먼트는 데이터베이스 관리 시스템에서 동일하거나 비슷한 데이터베이스 문을 높은 효율성으로 반복적으로 실행하기 위해 사용되는 기능입니다.





지금까지 진행한 실습은 스테이트먼트 방식을 사용한 방식입니다 .
 
스테이트먼트 방식의 진행은 다음과 같습니다. 








그러나 프리페어드 스테이트먼트 방식은 쿼리 분석과 최적화 단계를 1번만 거치고 실행될 때마다 재컴파일 없이 바로 실행되기 때문에 컴파일 된 쿼리 구문의 구조 변경이 불가능 합니다 . 
그러므로 쿼리 조작을 방지할 수 있습니다 .

 

실습


앞서 실습한 숫자형 데이터의 소스코드에 프리페어드 스테이트먼트 방식을 적용해보겠습니다 . 


<?php

if (!$link = mysql_connect('localhost', 'root', 'root')) {
    echo 'Could not connect to mysql';
    exit;
}

if (!mysql_select_db('northwind', $link)) {
    echo 'Could not select database';
    exit;
}

$_empid  = (int)$_GET['empid'];
$sql    = 'SELECT * FROM Employees WHERE EmployeeID=' . $_empid;
$result = mysql_query($sql, $link);

if (!$result) {
    echo "DB Error, could not query the database\n";
    echo 'MySQL Error: ' . mysql_error();
    exit;
}

print "<table border=1 cellpadding=5 cellspacing=0>\n";
print "\t<tr>\n\t\t<td>Employee ID</td><td>First Name</td><td>Title</td>
    <td>Hire Date</td>\n\t</tr>";



while ($stmt->fetch()){
    print "\t<tr>\n\t\t<td>". $empid . "</td><td>" . $fname . "</td><td>" .
$title . "</td><td>" . $hdate . "</td>\n\t</tr>\n";
}


print "</table>\n"
$conn->close();


?>



while 구문을 다음과 같이 수정했습니다 . 
다음과 같이 수정하면 다양한 공격구문을 주입해도 취약점이 발생하지 않습니다 .




댓글