SQL Injection 유효성 검사 코드 만들기

안녕하세요. 오랜만에 인사 드립니다.

회사에서 진행한 5개월 정도의 프로젝트 작업으로 인해 한동안 블로그 포스팅을 하지 못했네요...

 

이제 거의 마무리 단계까지 왔기 때문에 회사 프로젝트에서 배웠거나 쓸모있었던 코드 및 CS 정보에 대해 공유드리려고 합니다!

서론은 여기까지 하고 바로 SQL Injection 유효성 검사 코드를 만들어 봅시다!

 


1. SQL Injection

그전에 SQL Injection이 무엇일까요?

 

SQL Injection이란? 웹 애플리케이션에서 사용자 입력값을 적절하게 검증하지 않고 SQL 쿼리에 포함시켜 실행할 때 발생하는 보안 취약점을 말해요.

이를 통해 공격자원래 의도하지 않은 SQL 명령어를 실행시켜 데이터베이스를 조작하거나 민감한 데이터를 탈취할 수 있습니다..!

 


2. SQL Injection 유효성 검사

 

여러 사이트를 이용하다 보면 입력란이 있는 경우가 종종 있어요.

이 입력란에 SQL Injection민감한 특수문자 및 쿼리를 입력하지 못하게 방지하는 것입니다.

 

바로 만들어 보겠습니다.

 

일단 먼저 SQL Injeciton 민감한 특수문자 및 쿼리를 변수에 저장해 줍시다.

const sqlInjectionPattern = /(\b(OR|AND|UNION|SELECT|INSERT|UPDATE|DELETE|DROP|EXEC|EXECUTE|LIKE|WAITFOR|SLEEP|BENCHMARK|INFORMATION_SCHEMA|CHAR|ASCII|SUBSTRING|CAST|CONVERT)\b)|['";#\/\*|&%_\\]|--/gi;

 

sqlInjectionPattern 변수 안에 있는 값들은 무엇을 의미할까요?

그건 바로 다음과 같습니다.

공격 종류
SQL 예약어 기반 공격 OR, AND, UNION, SELECT, INSERT, UPDATE, DELETE, DROP
타임 딜레이 / 함수 호출 기반 공격 WAITFOR, SLEEP, BENCHMARK, INFORMATION_SCHEMA, CHAR, SUBSTRING
특수문자 / 주석 문자 ', ", ;, #, /*, --, |, &, %, _, \

 

 

이젠 이를 tset() 함수를 사용해서 입력란에 해당 값들이 있는 지 확인합니다.

test() 함수문자열에 정규식 패턴이 존재하는 지 검사하는 함수에요. 있으면 true, 없으면 false를 반환합니다.

 

checkSQLInjectoin.js

function checkSQLInjection(value) {
  const sqlInjectionPattern = /(\b(OR|AND|UNION|SELECT|INSERT|UPDATE|DELETE|DROP|EXEC|EXECUTE|LIKE|WAITFOR|SLEEP|BENCHMARK|INFORMATION_SCHEMA|CHAR|ASCII|SUBSTRING|CAST|CONVERT)\b)|['";#\/\*]|--/gi;

  if (sqlInjectionPattern.test(value)) {
      console.log('SQL Injection 위험!')
  } else {
      console.log('안전한 텍스트 입니다.')
  }
}


checkSQLInjection(plainText);

 

 

 

plainText 안에 다음과 같은 값을 입력하고 실행하면 어떻게 될까요?

const plainText = '테스트용 텍스트 입니다.';

 

 

그러면 다음과 같은 로그가 나타납니다!

 

 

그럼 이번엔 다음과 같은 값을 입력하고 실행해 봅시다.

const plainText = '테스트용 텍스트 (SELECT)입니다.';

 

 

그러면 다음과 같은 로그가 나타납니다.

 

 

이렇게 SQL Injection 방지할 수 있겠어요!

 


3. 정리하며

 

지금까지 SQL Injection 유효성 검사에 대해 알아보았습니다.

프로젝트의 보안을 강화 시키는 방법은 항상 기억해 두면 좋을 것 같습니다.

감사합니다!

 

참고

MDN Web Docs의 RegExp.prototype.test()

개미 개발 님의 SQL Injection - 방어 실습(1), 입력값 검증

MDN Web Docs의 SQL 인젝션 (SQL Injection)