DB

[DB] SQL Injection 방지를 위한 안전한 쿼리 작성: ${} 대신 Prepared Statements 활용

콩다영 2024. 4. 25.
728x90

[SQL 쿼리문에서 ${} 사용하지 말아야 하는 이유와 대체 방법]

 

최근에 파일럿 프로젝트를 진행하면서 쿼리문에서 '${}'를 썼다가 코드리뷰에서 지적을 받은 적이 있다. T.T

왜 '${ }' 를 쓰면 안 되는지, 그럼 대체방법에는 무엇이 있는지 정리해 본다.

 

 

 

 

   '${}'를 사용하지 말아야 하는 이유

 

SQL 쿼리문에서 '${ }'를 사용하는 것주로 동적으로 값이 들어가는 경우에 활용됩니다.

그러나 '${}'는 보안상의 위험이 있습니다. 이를 사용할 경우 SQL Injection 공격에 취약해질 수 있습니다.

SQL Injection 공격은 사용자가 입력한 값을 그대로 쿼리에 넣는 경우에 발생할 수 있으며,

이를 악용하여 데이터베이스를 손상시키거나 사용자의 개인정보를 유출할 수 있습니다.

 

 

 

  '${}' 대체방법 Prepared Statements

 

Prepared Statements를 사용하면 쿼리의 구조를 미리 정의하고, 동적으로 입력되는 값을 파라미터로 전달할 수 있습니다.

이를 통해 입력값이 쿼리의 일부로 해석되는 것을 방지하여 보안에 더 강력한 방어를 제공합니다.

 

 

예를 들어, Java에서 JDBC를 사용하는 경우 Prepared Statements를 다음과 같이 활용할 수 있습니다.

String sql = "SELECT * FROM users WHERE username = ?";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, username);    // username 변수는 동적으로 값이 설정됨
ResultSet rs = pstmt.executeQuery();

위의 예시에서 '?'는 파라미터 위치를 나타내며, 그 위치에 동적으로 값이 입력됩니다.

이를 통해 SQL Injection 공격으로부터 보호할 수 있습니다.

사용자 입력값이 쿼리의 일부로 해석되는 것이 아니라 단순히 값으로 처리되므로 안전합니다.

 

 

 

이와 같이 '${ }' 대신 Prepared Statements를 사용함으로써 보다 안전한 쿼리 작성이 가능하며,

보안 측면에서 높은 수준의 방어 기능을 제공할 수 있습니다.

 

 

 

 

 

 

 

( + 추가내용, SQL Injection 공격의 작동 방식 설명)

 

SQL Injection 공격은 악의적인 사용자가 웹 애플리케이션의 입력 폼이나 URL 매개변수 등을 통해 SQL 쿼리를 조작하여 데이터베이스에 대한 엑세스 권한을 획득하는 공격 기법입니다.

 

일반적으로 SQL Injection은 사용자가 입력하는 값을 쿼리에 직접 포함시켜 실행하는 경우에 발생합니다.

이때 악의적인 사용자는 입력 필드에 SQL 쿼리의 일부를 삽입하여 서버 측에서 실행되도록 유도합니다.

이를 통해 공격자는 데이터베이스를 조작하거나 중요한 정보를 유출할 수 있습니다.

 

 

 

 

728x90
반응형

댓글