체인의정석

SQL injection과 방어 가이드 본문

개발/database

SQL injection과 방어 가이드

체인의정석 2021. 11. 8. 13:51
728x90
반응형

이번주 회사의 Tech Talk 내용이 좋았어서 블로그 글로도 정리하고자 한다.

 

sql injection은 sql 문을 이용해 서버에 공격문을 주입하는 기법.

 

예시 1 ) 로그인 같은 쿼리문에 일부러 패스워드에

password= 1234'; DROP table Users

위와 같이 sql 명령어를 타이핑하게 되면 테이블을 드랍하게 되며, 위험해 진다.

 

일반적으로 

 

Always ture 공격

User Id = 105 Or 1=1

Query Stacking 공격

=> 위의 예시처럼 drop table과 같은 행위 진행

 

Line comment 공격 등이 있다.

=> 뒤에 코멘트로 만드는 문구 삽입

 

방어 방법은

 

1. 입력 값 검증

정규 표현식 등으로 입력값을 애초에 넣고 

sql 명령문이 입력값에 포함되어 있는지 검증한 후 차단할 수도 있다.

 

프론트엔드의 validation은 자바스크립트를 끌 수 있으므로 백엔드에서도 입력값에 대한 검증을 필수이다.

 

2. sql 오류 발생 시 오류 메세지 클라이언트 표시 금지

오류 구문을 노출하면 테이블이 노출 될 수 있기 때문에 표시 금지

 

3. hash 사용

민감한 정보는 반드시 hash를 사용하여 저장해야 한다.

 

4. Database Layer 보호

query place holder나 name plceholder 사용하여 데이터 베이스 구조에 맞춰 컴파일 되도록 한다.

칼럼이 interger 값을 기대하고 있을 시 스트링 값이 들어온다면 쿼리가 중단되고 익셉션이 발생하게 됨

 

 

TypeORM과 SQL injection

 

쿼리문을 그대로 넣게 되면 sql 문을 조작하므로서 sql injection 공격을 할 수 있다.

반면 typeORM을 사용하게 되면 find 구문을 통하여 sql injection 공격으로 부터 방어가 가능하게 된다.

 

raw 쿼리 커맨드의 경우는 sql injection에 취약하기 때문에 사용하지 않는것이 좋고

raw를 사용해야 한다면 쿼리 빌더를 사용하여 작성을 해야 한다.

 

결론적으로는 type ORM과 query builder 또는 find 기능을 사용하는것이 좋다는 것이 포인트인데, 마침 지금 구현중인 모듈에서 쿼리빌더와 typeORM을 사용중이기 때문에 지금 하는대로 그대로 학습해 가면 sql injection 에도 방어가 가능하다는 점이다.

 

결국 typeORM을 사용할 시 

1. 다양한 데이터베이스와 연동이 가능

2. SqlInjection으로 부터의보호

가 장점이며

 

rawQuery를 사용할시 위2개의 이점을 취할 수 없으므로

queryBuilder를 사용하는것이 좋다.

 

결국 typeORM에 대해 더 익숙해지구 자유롭게 사용할 수 있으면 좋을것 같다 

 

 

 

728x90
반응형
Comments