일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- ambiguous function description
- 컨트렉트 배포 자동화
- git rebase
- SBT표준
- rust 기초
- multicall
- 스마트 컨트렉트 함수이름 중복
- nestjs 튜토리얼
- 러스트기초
- ethers typescript
- chainlink 설명
- 머신러닝기초
- 컨트렉트 동일한 함수이름 호출
- ethers v6
- Vue
- 러스트 기초
- Vue.js
- 스마트컨트렉트프록시
- ethers type
- vue기초
- 깃허브명령어
- 러스트 기초 학습
- 체인의정석
- ethers
- ethers websocket
- 스마트컨트렉트테스트
- 스마트컨트렉트 함수이름 중복 호출
- 프록시배포구조
- 스마트컨트렉트 예약어 함수이름 중복
- nest.js설명
- Today
- Total
체인의정석
SQL injection과 방어 가이드 본문
이번주 회사의 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에 대해 더 익숙해지구 자유롭게 사용할 수 있으면 좋을것 같다
'개발 > database' 카테고리의 다른 글
Object 형태의 값 추출하기 (json_extract) (0) | 2022.11.29 |
---|---|
Mac 백엔드 기본 세팅 - Mysql 설치 및 Mysql Workbench 설치 (0) | 2022.10.28 |
SQL query 결과에 고정값 넣기 (0) | 2021.10.13 |
csv.gz 파일 데이터베이스에 가져오기 (0) | 2021.10.01 |
데이터베이스와 인덱스 (0) | 2021.09.29 |