작성
·
84
0
Session 10 . 대응방안에서
실습[9-1] Prepared Statement 취약한 소스코드와 안전한 소스코드 강의 10분 49초 부분에서 궁금 사항이 있습니다.
만약 num 파라미터 값을 Integer num = Integer.parseInt(request.getParameter("num"))
Integer 형 변환하여 처리하였으나, String sql = "SELECT * FROM ex_member WHERE num = " + num;
SQL 구문 자체는 Prepared Statement를 적용하지 않았을 때 이 부분도 취약한걸까요? 결국 인젝션 공격을 위해 문자열은 들어갈 수 밖에 없을 것 같은데 형 변환에서 모두 에러 발생되므로 공격이 불가할 것 같은데 맞을까요?
답변 2
0
넵 맞습니다. 정수 형태가 아닌 다른 값이 들어올 경우 형변환 시 에러가 발생되으로,
데이터베이스 질의 전에 어플리케이션이 중단됩니다.
따라서 SQL 인젝션으로부터는 안전하다고 볼 수 있습니다.
다만, 환경에 따라 에러 핸들링 여부가 다르기에 스택 트레이스 발생에 따른 정보 노출의 잠재적 위협이 존재할 수 있습니다. 따라서, 범용적으로는 Prepared Statement 적용이나 숫자검증 같은 대응 방안으로 권고하는 것이 바람직합니다.
0
안녕하세요, 인프런 AI 인턴입니다. 조영학님!
Prepared Statement는 SQL 인젝션 공격을 막기 위한 효과적인 방법 중 하나입니다. 질문하신 내용에 대해서는 두 가지 관점에서 살펴볼 수 있습니다:
형 변환의 안전성: 만약 num
파라미터가 숫자로만 구성되었다면, Integer.parseInt()
메소드를 사용할 때 비숫자 입력이 들어오면 Java에서 NumberFormatException을 발생시켜 공격자가 SQL 구문을 완성하기 어렵게 만듭니다. 따라서, 이 관점에서는 문자열 기반의 공격이 불가능해 보입니다.
Prepared Statement의 필요성: 그러나 Prepared Statement는 단순히 숫자 검사를 넘어 다양한 SQL 인젝션 공격을 방지하는 강력한 수단이므로, 모든 입력값 검증에서 안전을 보장합니다. 경우에 따라 데이터베이스의 설정이나 애플리케이션의 오류로 인해 수치형으로 보이는 입력도 취약성을 유발할 수 있기 때문에 prepared statement를 사용하는 것이 가장 안전한 방법입니다.
비록 현재의 코드에서는 인젝션 공격이 어렵다고 생각되더라도, 가능한 한 모든 SQL 실행에는 Prepared Statement를 사용하는 것이 보안상 좋습니다. 안전한 코드를 위해 언제나 보안 규칙을 철저히 따르는 것을 권장드립니다.
유사한 주제의 질문과 답변이 여기 링크에 존재하니 참고하시면 더욱 이해에 도움이 될 것입니다:
- 대응방안 코드에 대해서 질문이 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.