PHP

PHP SQL인젝션과 mysqli bind_param

마리오64 2020. 4. 6. 11:13

예전에 작성한 PHP코드를 살펴보니 mysqli 로만 되어있을 뿐 쿼리에 변수를 그대로 대입해서
SQL인젝션 공격에 취약했습니다.

$query = "insert into parktable (total,big,mid,small,date) values ($total,$big,$md,$sm, $today)";
$result = mysqli_query($dbConnect,$query);

공격자가 변수에 다른 SQL문을 보내서 테이블을 지우거나 계정을 바꿀 수도있는 보안에 심각한 상황입니다.

 

 

https://modernpug.github.io/php-the-right-way/#mysql_extension

 

PHP: The Right Way 한국어판

쉽게 읽을 수 있는 PHP의 베스트 프랙티스, 코딩 표준, 권위있는 튜토리얼로의 링크를 제공합니다.

modernpug.github.io

 

mysqli에는 prepare와 쿼리 파라미터를 바인딩하는 기능이 있습니다.

 

mysqli_stmt::bind_param 함수를 이용하여 바꾸면

 

	$query = $dbConnect->prepare('insert into parktable (total,big,mid,small,date) values (?, ?, ?, ?, ?)');
	$query->bind_param('iiiis', $total, $big, $md, $sm, $today);
	$query->execute();

파라미터 자리에 ? 를 두고

bind_param에 변수의 타입을 정합니다.. i는 int, s 는 string , b는 blob 과 패킷 , d 는 double 입니다.

바인딩함으로서 다른 문자열이 들어와도 쿼리의 일부가아닌 문자열이나 타입에 맞는 값으로 취급되서 인젝션 공격을 막을 수가 있습니다.

 

그런데 이거보다 PDO 쓸 수있으면 PDO를 쓰십쇼

PDO가 사용하기에 편리하고, 다른 DB도 쓸 수있는 등 더 좋습니다.