예전에 작성한 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도 쓸 수있는 등 더 좋습니다.
'PHP' 카테고리의 다른 글
코드이그나이터 3에서 라이브러리 설치시 autoload 에러 (0) | 2020.11.10 |
---|---|
PHP 버전별 함수 선언과 클래스 선언방식 PHP5.3~ PHP 8.0 (0) | 2020.11.03 |
PHP 8.0 바뀐점 정리된곳 (0) | 2020.10.25 |
PHP 8.0 애트리뷰트 문법 논란 (0) | 2020.09.03 |
PHP 7 이하에서 == 연산자와 PHP8에서 변경되는 점 (0) | 2020.08.02 |