본문 바로가기

입력란 SQL Injection 방어하기 코드

웹페이지 상에서 입력란에 소스코드와 SQL문을 입력하여 공격하는 방법을 SQL 인젝션 공격이라고 합니다. 코드 인젝션의 한 기법으로 클라이언트의 입력값을 조작하여 서버의 데이터베이스를 공격할 수 있는 공격방식을 말합니다. 

주로 사용자가 입력한 데이터를 제대로 필터링, 이스케이핑하지 못했을 경우에 발생합니다. 공격의 쉬운 난이도에 비해 파괴력이 어마어마하기 때문에 시큐어 코딩을 하는 개발자라면 가장 먼저 배우게 되는 내용입니다. 이러한 injection 계열의 취약점들은 테스트를 통해 발견하기는 힘들지만 스캐닝툴이나 코드 검증절차를 거치면 보통 쉽게 발견되기 때문에 탐지하기는 쉬운 편으로 OWASP에서도 수년 동안 인젝션 기법이 보안 위협 1순위로 분류되는 만큼 보안에 각별한 주의가 필요하다고 합니다.

하여 JavaScript 를 통해서 간단하게 막아보는 코드를 작성해 봅시다.

      function checkSearchedWord(obj) {
        if (obj.length > 0) {
          //특수문자 제거
          var expText = /[%=><]/;
          if (expText.test(obj) == true) {
            alert("특수문자를 입력 할수 없습니다.");
            obj.value = obj.value.split(expText).join("");
            return false;
          }

          //특정문자열(sql예약어의 앞뒤공백포함) 제거
          var sqlArray = new Array(
            //sql 예약어
            "OR", "SELECT", "INSERT", "DELETE", "UPDATE", "CREATE", "DROP", "EXEC",
            "UNION", "FETCH", "DECLARE", "TRUNCATE"
          );

          var regex;
          for (var i = 0; i < sqlArray.length; i++) {
            regex = new RegExp(sqlArray[i], "gi");

            if (regex.test(obj)) {
              alert("\"" + sqlArray[i] + "\"와(과) 같은 특정문자로 검색할 수 없습니다.");
              obj = obj.replace(regex, "");
              return false;
            }
          }
        }
        return true;
      }

 위와 같은 코드로 SQL 인젝션 공격을 어느정도 방어 할 수 있습니다. 이 외에 설명으로는 나무위키에 자세한 설명이 나와 있습니다.

https://namu.wiki/w/SQL%20injection

 

SQL injection - 나무위키

여기서 "Robert'); DROP TABLE students;--"학생을 "학생 이름" 자리에 넣을 경우 다음과 같은 명령문이 된다. 첫 번째 줄에서는 Robert라는 학생이 입력되었지만, 두 번째 줄에서 학생들의 데이터가 있는 테

namu.wiki

 

엉망진창

개인 블로그 입니다. 코딩, 맛집, 정부정책, 서비스, ~방법 등 다양한 정보를 소개합니다