본문

SQL 인젝션을 효과적으로 차단하는 방법



무언가 아쉽지만 SQL 인젝션을 효과적으로 차단하는 방법이 있습니다. 입력되는 데이터를 잘 관리하기 어렵다면 간단히 이 방법을 사용해 보는 것도 나쁜 선택은 아닙니다.



글을 시작하기에 앞서, 이 방법을 사용하는 것보다 차라리 MySQLi를 사용하는 편이 더 나을 수도 있겠다는 점을 알려드립니다. MySQLi를 사용할 수 없거나, 모두 변경하기 힘든 상황에서의 팁일 뿐입니다. 가능하다면 MySQLi를 사용하세요. (참고로 저는 MySQLi + 이 기능을 사용하고 있습니다. 보안 만세!)



적용 방법

MySQL에 연결하는 코드 바로 아래에 다음 코드를 추가합니다.

if(isset($_POST) && 0 < count($_POST)) {
	foreach($_POST as $index => $value) {
		$_POST[$index] = mysqli_real_escape_string($conn, $value);
	}
}



벤치마킹

PHP에서 중요시되는 것 중 하나가 성능이죠. 한 번 작동 시간을 측정해 봅시다. 측정 방법은 코드 시작 지점과 끝나는 지점의 microtime() 값의 차이를 구해보는 방식으로 진행해 보겠습니다.


주의 사항

재미로만 보세요. 결과는 서버 환경 등에 따라 매우 큰 차이가 발생할 수 있습니다. 또한 테스트 코드에서 사용한 array_sum, explode 함수의 작동 시간 때문에 영향이 발생할 수도 있습니다. 여러 변수가 있을 수 있습니다.


테스트 환경

- 서버: Amazon AWS Lightsail Seoul, KR

- vCPU: 2 코어

- 메모리: 4 GB

- 웹 서버: IIS 10

- PHP 버전: 7.2


테스트 코드

function _microtime() {
    return array_sum(explode(' ', microtime()));
}

$time = array();
$time[0] = _microtime();
if(isset($_POST) && 0 < count($_POST)) {
    foreach($_POST as $index => $value) {
        $_POST[$index] = mysqli_real_escape_string($conn, $value);
    }
}
$time[1] = _microtime();
echo ($time[1] - $time[0]).'초 소요 됨!';


입력한 POST 데이터


작동 시간 결과

1회: 0.00075101852416992초

2회: 1.7881393432617E-5초

3회: 1.6927719116211E-5초

4회: 1.7881393432617E-5초

5회: 1.7166137695312E-5초

6회: 1.5974044799805E-5초

7회: 1.6927719116211E-5초

8회: 1.6927719116211E-5초

9회: 1.5974044799805E-5초

10회: 1.6927719116211E-5초


평균 0.0009036064148초가 소요됩니다. 웹에서 측정되는 ms 단위로 변환하면, 0ms 미만으로 보여질 것입니다.



이 방법은 어떻게 보면 비효율의 끝을 보여줄 수 있다는 점을 잘 알고 있습니다. 어쩌면 공유하지 말았어야 할 수도 있죠. 이 방법에 대해 의견이 있다면 자유롭게 댓글로 공유해 주시면 감사하겠습니다.


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

SQL 인젝션을 효과적으로 차단하는 방법  (0) 2018.12.06

공유

댓글 0