본문
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