ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL 인젝션을 효과적으로 차단하는 방법
    개발, 디자인/PHP 2018.12.06 16:09



    무언가 아쉽지만 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 미만으로 보여질 것입니다.



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

    댓글 0

Designed by Tistory.