<iframe src="http://www.naver.com"></iframe>

 

네이버를 아이프레임에 넣으면 빈 화면만 표시된다.

굳이 이런것까지 막을 필요가 있을까 싶겠지만, 간단하게 자바스크립트로 작성한 프레임(주로 iframe)을 이용한 디도스 공격을 시도한다면 그대로 당할 수 밖에 없다.

이러한 사소한 공격이라도 예방하려면 사이트가 프레임 또는 아이프레임에 표시되지 않도록 해야 한다.

또한 이 방법은 클릭재킹공격(Clickjacking Attact)에 대한 예방효과도 있다.

 

 

 

자바스크립트를 이용한 방법

<script type="text/javascript">

    if(top != window) {

        top.location window.location;

    }

</script>

 

 

 

메타 태그를 이용한 방법

<meta http-equiv="X-Frame-Options" content="deny" />

 

 

 

서버사이드 확장헤더를 이용한 방법

 

PHP

  header("X-Frame-Options: DENY");

 

Java

  HttpServletResponse res = (HttpServletResponse)response;

  res.addHeader("X-FRAME-OPTIONS""DENY");

 

C#

  this.Response.Headers["X-FRAME-OPTIONS"] = "DENY";

  또는

  HttpContext.Current.Response.AddHeader("x-frame-options""DENY");

 

X-Frame-Options 확장헤더에 사용되는 값

  DENY : 해당 페이지를 frame에 표시할 수 없게 한다

  SAMEORIGIN : 해당 페이지와 동일한 orgin에 해당하는 frame만 표시 한다

  ALLOW-FROM uri : 해당 페이지는 지정된 orgin에 해당하는 frame만 표시 한다



Http Server를 이용한 방법


Apache

  • Header always append X-Frame-Options SAMEORIGIN 

Nginx 

  • add_header X-Frame-Options SAMEORIGIN;

위와 같이 설정하면 된다. 나 또한 위 설정을 통해 X-Frame-Options 설정을 변경했다. 그런데 문제가 해결되는 것이 아니라 또 다른 문제가 생겼다.

Multiple 'X-Frame-Options' headers with conflicting values ('SAMEORIGIN, DENY')

http 응답 헤더를 분석했더니 DENY와 더불어 또 하나의 SAMEORIGIN 설정이 추가되어 충돌이 발생하는 상황이었다. 아무리 DENY 설정을 제거하려고 삽질을 해봤지만 제거되지 않았다.

1시간 동안 Apache 웹 서버와 삽질하다가 혹시 Apache가 아니라 뒤에 연결되어 있는 Tomcat 서버의 응답 헤더에 DENY 설정이 포함되어 있는 것은 아닐까라는 의심을 하게 되었다.

> curl -I http://localhost:8080

위와 같이 명령을 실행해 응답 헤더를 확인하니 떡하니 DENY 설정이 추가되어 있다. 이럴 때의 허무함이란..

다시 Tomcat에서 X-Frame-Options 설정 시작했다. Tomcat은 기본 값으로 X-Frame-Options 설정을 DENY로 설정하고 있었다. 이 문제를 해결하기 위해 Servlet Filter를 추가해 해결했다.

public class CorsFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        response.setHeader("X-Frame-Options", "ALLOW-FROM https://apps.facebook.com");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

위와 같이 설정하니 X-Frame-Options가 정상적으로 변경되는 것을 확인했다. chrome은 아직까지 ALLOW-FROM 설정을 인식하지 못해 무시해 버리기 때문에 정상적으로 동작한다. 다룬 브라우저도 정상적으로 동작... 오늘 오전의 삽질 경험을 공유해 본다.





spring security 버전 업그레이드 후에 X-Frame-Options이 http header에 추가되어 iframe으로 동작하던 기능이 정상적으로 동작하지 않는 이슈가 발생했다.

얼마 전 X-Frame-Options to DENY 설정 때문에 iframe을 통해 접근할 수 없는 문제 해결 글에서도 관련 이슈를 등록했던 적이 있다. 이 문제를 해결하면서 이전에 추가하지 않던 header를 tomcat에서 갑자기 추가하지는 않을 것으로 예상했다. 그냥 의구심만 가지고 지나쳤다가 다른 iframe 이슈를 해결하다 X-Frame-Options header를 spring security가 보안 이슈를 해결하기 위해 추가한다는 것을 알게 되었다.

가능하면 iframe을 사용하지 않으면 좋겠지만 그렇지 않은 경우 다음과 같이 X-Frame-Options header 추가하는 부분을 다음과 같이 disable 함으로써 문제를 해결할 수 있다.


http.headers().frameOptions().disable()



PS.. Apple Safari 11 에서는 iFrame에서 실행되는 콘텐츠에 대해 IndexedDB를 지원하지 않습니다.

(TypeError: 'undefined' is not an object (evaluating 'window.indexedDB.open')


'Java > JSP' 카테고리의 다른 글

[SVN] SVN 에러 E155004, E200030 등등  (0) 2019.01.15
Jquery-selector-정리  (0) 2019.01.10
IndexedDB 참고사이트  (0) 2019.01.07
WebGL 프로젝트 빌드 및 실행 WebGL 브라우저 호환성  (0) 2019.01.07

1. vi 실행하기


명령어 

동작 

vi file 

file을 연다 

vi file1 file2

file1 과 file2 를 차례로 연다 

view file 

file을 읽기 모드로 연다 

vi -R file 

file을 읽기 모드로 연다 

vi + file

file을 열때 커서가 file 본문의 마지막 행에 위치한다. 

vi +n file 

file을 열어 n행에 위치한다. 

vi -r file

손상된 파일 회복


2. 입력모드 전환 명령어


명령어 

동작 

i 

커서 있는데서 입력모드 전환 

I

커서 왼쪽, 행의 처음에 몬자 삽입 

커서 있는 줄 끝에서 입력모드 전환 

A

커서 오른쪽, 행의 끝에 문자 삽입 

커서 있는 줄 아래에 빈 줄 삽입 

커서 있는 줄 위에 빈 줄을 삽입 

덮어쓰기 모드로 전환 


3. 커서의 이동


명령어 

동작 

^, 0 

줄의 처음으로 이동 

줄의 끝으로 이동 

H 

화면 맨 위로 이동 

M

화면의 중간으로 이동 

L 

화면 맨 아래로 이동 

다음 단어 끝으로 커서 이동 

e

다음 단어 앞으로 커서 이동

b  

이전 단어로 이동 

shift + ↑ 

한 페이지 앞으로 이동 

shift + ↓

한 페이지 뒤로 이동 

3l , 3G

현재 커서 위치한 행에서 3번째 행으로 이동 

Ctrl + i

한 화면 위로 이동 

Ctrl + b

한 화면 아래로 이동 

Ctrl + d

반 화면 위로 이동 

Ctrl + u

반 화면 아래로 이동 

Ctrl + e

한 줄씩 위로 이동 

Ctrl + y

한 줄씩 아래로 이동 


4. 삭제


명령어 

동작 

x 

한 문자 삭제 

5x

커서가 있는 위치부터 5개의 문자를 삭제 

d + ↑ 

커서있는 줄, 윗줄 2줄 삭제 

d + ↓ 

커서잇는 줄, 아래줄 2줄 삭제 

dw 

한 단어 삭제 

dd 

한 줄 삭제 

5dd

커서가 있는 라인부터 5개의 라인 삭제 

db

커서의 위치에서 거꾸로 한 단어 삭제 

한줄 내에서 커서있는 뒤 모두 삭제 

u 

바로 전에 수행한 명령을 취소 

:5,10ㅇ

5~10번째 행 삭제 


5. 복사와 붙여넣기


명령어

동작

yy

현재 줄을 버퍼로 복사 

p 

버퍼에 있는 내용을 커서 뒤에 삽입 

P

버퍼에 있는 내용을 커서 앞에 삽입 

3y 

현재 줄에서부터 아래로 3줄 복사 

:5, 10y

5~10줄을 버퍼로 복사 

:30pu

30행에 버퍼 내용을 삽입 

d 

현재 커서가 위치해 있는 단어 복사 

3yy

현재 행을 기준으로 3번째 행까지 n행 복사 


6. 문자열 찾기


명령어

동작

/name

name 문자열 찾기 

?name

name 문자열 역방향으로 찾기 

n

다음 name으로 이동

N

n과 같으며 역방향으로 이동 


7. 문자열 대체


명령어 

동작 

:s/str/rep

현재 행의 str을 rep로 대체

:l,.s/str/rep/ 

1부터 현재 행의 str을 rep로 대체 

:%s/str/rep/g 

파일 전체 str을 rep로 전부 대체 

:.$/aaa/bbb

커서의 위치로부터 파일의 끝까지 있는 모든 aaa를 bbb로 대체 


8. 파일 저장 및 불러오기


명령어 

동작 

:w 

지정된 파일에 저장 

:wq, :x, ZZ 

지정된 파일에 저장하고 vi를 종료 

:w php.ini 

php.ini 파일에 저장 

 :q

저장하지 않고 종료 

:q!

저장하지 않고 강제 종료 

:wq php.ini 

php.ini에 저장하고 vi를 종료 

:r php.ini 

php.ini의 내용을 현재 커서가 있는데로 불러온다. 

:e php.ini 

현재의 화면을 지우고 새로운 파일 php.ini를 불러온다. 

:5,10 w php.ini 

5~10 줄까지의 내용을 php.ini에 저장


9. 기타


명령어 

동작 

:set nu

행 번호 보여주기 

:set nonu 

행 번호 보여주기 취소 

 .

바로 전에 실행한 명령어 재 실행 

 Ctrl + l

불필요한 화면 정리후 다시 표시 



녹색으로 표시한 명령어는 많이 사용하는 명령어이다.

+ Recent posts