1)
신뢰되지 않는 URL 주소로 자동 접속 연결
사용자로부터 입력되는 값을 외부사이트의 주소로 사용하여 자동으로
연결하는 서버 프로그램은 피싱(phishing) 공격에 노출되는 취약점을 가질 수 있다. 일반적으로 클라이언트에서 전송된 URL 주소로 연결하기 때문에 안전하다고
생각할 수 있으나, 해당 폼의 요청을 변조함으로써 공격자는 사용자가 위험한 URL로 접속할 수 있도록 공격할 수 있다.
n 안전한 코딩
기법
①
자동 연결할 외부 사이트의 URL과 도메인은
화이트리스트로 관리한다.
②
사용자 입력값을 자동 연결할 사이트 주소로 사용하는 경우에는 입력된 값이 화이트 리스트에
존재하는지 확인한다.
1. private final static String allowURL[] = {
2. "http://url1.com",
3. "http://url2.com",
4. "http://url3.com"
5. };
6. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {
7. String nurl = request.getParameter("nurl");
8.
9. try {
10. if(nurl == null || "".equals(nurl)) {
11. throw new Exception("error");
12. }
13. Integer n = Integer.parseInt("nurl");
14. if(n >= 0 || n < 3) {
15. response.sendRedirect(allowURL[n]);
16. }
17.
18. } catch(NumberFormatException nfe) {
19. // 사용자 입력값이 숫자가 아닐 경우 에러 처리
20. } catch(Exception e) {
21. // 사용자 입력값에 문제가 있을 경우 에러 처리
22. }
23. }
1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {
2. String url = request.getParameter("url");
3. boolean isValid = false;
4. try {
5. if(url == null || "".equals(url)) {
6. throw new Exception("error");
7. }
8.
9. for(int i=0; i<allowURL.length; i++) {
10. if(url.equals(allowURL[i])) {
11. isValid = true;
12. break;
13. }
14. }
15.
16. if(isValid) {
17. response.sendRedirect(url);
18. } else {
19. throw new Exception("disallowed url");
20. }
21. } catch(Exception e) {
22. // 사용자 입력값에 문제가 있을 경우 에러 처리
23. }
24. }
댓글 없음:
댓글 쓰기