너거 MyBatis에서 $랑 # 차이를 아냐?

leverest96·2023년 4월 21일
0

Spring / Java

목록 보기
15/20
post-thumbnail

MyBatis 실습을 하던 중 갑자기 궁금증이 생겼다.

$를 사용하는 경우가 있고 #을 사용하는 경우가 있던 것이다.

예를 들어,

WHERE ${key} LIKE concat('%', #{word}, '%')

위와 같이 혼용해서 쓰는 경우가 궁금했던 것.

그래서 찾아봤지.

어려운 말로

  1. #은 PreparedStatement 변수 바인딩 방법을 사용하고
  2. $는 문자열 치환 방법을 사용한다는 것이다.

둘 다 쿼리를 실행하기 전에 값을 처리하는데 위의 어려운 말들로 처리를 하는 것이란다.

근데 여튼 #을 사용하면 SQL 쿼리를 사용하기 전에 입력 값이 잘못되거나 악의적인 SQL 삽입 공격을 방지하는 데 도움이 되고 $를 쓰면 SQL 삽입 공격에 더 취약해진다는 것이 주안점인 듯 하다.

여기서 SQL 삽입 공격에 취약하다라는 말에 찾아보니 SQL 인젝션이 발생할 수 있다고 한다.

아래는 SQL 인젝션에 대한 chatGPT의 대답.

SQL 인젝션은 악의적인 사용자가 웹 사이트의 데이터베이스에 액세스하는 방법 중 하나입니다. 이러한 공격자는 웹 사이트에서 입력 폼을 사용하여 데이터베이스에 SQL 쿼리를 삽입할 수 있습니다.

SQL 인젝션은 주로 사용자가 입력한 데이터를 검증하지 않아서 발생할 수 있습니다. 즉, 입력된 데이터에 대해 적절한 검증 및 제한 없이 데이터베이스 쿼리에 직접 삽입하게 된다면, 공격자가 입력한 악성 SQL 쿼리를 실행할 수 있습니다. 이러한 공격은 데이터베이스에 저장된 모든 정보에 액세스하고, 수정하고, 삭제할 수 있게 됩니다.

따라서 SQL 인젝션을 방지하기 위해서는 사용자의 입력값에 대해 적절한 검증과 필터링을 해야 합니다. 또한, SQL 쿼리를 생성하는 과정에서는 미리 정의된 매개변수를 사용하고, 입력값을 직접 쿼리에 삽입하지 않도록 주의해야 합니다. 또한, 데이터베이스 사용자 권한을 최소한으로 설정하고, 보안 업데이트를 정기적으로 수행하여 데이터베이스 보안을 강화해야 합니다.

내가 알아들은 말로는 값에 sql 쿼리를 날려 데이터를 조작할 수 있는 가능성이라는 얘기다.

이를 방지하기 위해서라도 #을 쓰자.

profile
응애 난 애기 개발자

0개의 댓글