본문 바로가기

개발/PHP

Secure Coding - SQL Injection

PHP SQL Injection 방지 방법에 대해 작성한다.

 

OWASP 에서 1위로 선정된 위협으로 SQL Injection 이 있다.

 

$sql="SELECT * FROM users WHERE userid='$userid' and password='$password'";

위처럼 id와 암호를 받아서 로그인하는 부분에서 클라이언트가 $password input에 ' or '1' = '1 이라는 문자열을 넣으면 or 뒤의 조건문이 참이되어 관리자로 로그인이 가능하다.

 

해당 공격을 막기 위해서는 동적 쿼리가 아닌 Prepared Statement와 Bound Parameter 을 사용해야 한다.

 

// PDO 사용
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

$stmt->execute([ 'name' => $name ]);

foreach ($stmt as $row) {
    // Do something with $row
}

 

// MySQLi 사용
$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name); // 's' specifies the variable type => 'string'

$stmt->execute();

$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    // Do something with $row
}

PHP의 경우 직접적으로 데이터베이스에 연결하기 보다는 PDO를 사용하는것이 좋다.

 

PHP 라라벨의 경우 쿼리빌더에서 자동으로 해당 input 을 변환하여 안전하게 실행된다.

 

#참고자료

wiki.owasp.org/index.php/SQL_Injection

stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php

'개발 > PHP' 카테고리의 다른 글

502 Bad Gateway PHP-FPM 최적화  (0) 2022.02.25
PSR-0, PSR-1, PSR-2 (PHP Standards Recommendations)  (0) 2020.09.07
PHP 7 엄격한 타이핑 (strict mode)  (0) 2020.09.07
PHP CI Chunk File Upload - Plupload  (0) 2020.06.05