파이썬 웹 프레임 워크의 영약 - 공격 CSRF

무슨 CSRF?

  (크로스 사이트 요청 위조, 크로스 사이트 요청 위조 도메인), 그것은 또한 일반적으로 "원 클릭 공격"또는 세션 승마로 알려진 큰 보안 위험 인터넷 (20)에서 2007 년의 하나로 열거 된 네트워크 공격입니다 CSRF 또는 XSRF로 축약, 사이트의 악의적 인 사용은 사람들 알려진 피싱 사이트입니다. 그것은 크로스 사이트 스크립팅 (XSS)처럼 들리지만, 거의 확률이 매우 XSS와 다른, 공격이지만. CSRF가 신뢰할 수있는 사이트를 활용하는 신뢰할 수있는 사용자로부터의 요청에 의해 위장하는 동안 XSS는 사이트의 사용에서 사용자를 신뢰할. XSS 공격에 비해, CSRF 공격은,이 XSS보다 더 위험하고 방어하기 어려운 간주된다 (매우 희귀을 방지하기 위해 그들의 자원 그러므로와) 종종 매우 인기가 있습니다.

당신은 무엇 CSRF을 할 수 있습니까?

  이 이해할 수있는  CSRF 공격 : 공격자는 악의적 인 요청을 보낼로 위장 신분을 훔친. CSRF는 일을 포함 할 수 있습니다 : 귀하의 계정을 도용, 전자 메일, 메시징의 이름을 보내, 심지어 상품의 구매, 가상 화폐 전송하는 ...... 인한 문제는 다음과 같습니다 개인 정보 및 재산 안전의 공개.

다음 원칙은 무엇 때문에 강력한 그것을이다?

CSRF 원리 설명

  사용자는 사이트 (세션의 쿠키에 저장 한 후 쿠키를 암호화 된 간주 될 수 있습니다) 쿠키에 저장되어있는 사용자에 대한 정보가 될 것입니다 방문 후, 사용자가 위험한 웹 사이트를 방문하고있다, 당신은이 사이트를 사용합니다 사이트 휴가 쿠키를 액세스하는 악의적 인 요청을 보낼 전에

방법 CSRF 방지

  나는 두 가지로 요약은 CSRF 공격을 방지 : CSRF 공격 (자기 소개서) 및 프런트 엔드 방법 아약스 요청에 직접 배경 거래

  배경 처리 CSRF 공격

    매우 간단한 단지 형태 csrf_token의 name 속성의 값을 증가시키기 위해, value 속성 값 {{csrf_token ()}} 숨겨진 입력 폼 태그이다.

< 클래스 = "폼 로그인의" 방법 = "POST" > 
        < H2 클래스 = "형태 로그인 사용-호" >请登录</ H2 > 

        < 입력 타입 = "숨겨진" 이름 = "csrf_token" = "{{ csrf_token ()}} " > 

        < 라벨 inputEmail"= " 클래스 ="SR 전용 " >邮箱: </ 라벨 > 
        < 입력 타입 ="이메일 " ID ="inputEmail " 클래스 ="폼 컨트롤 " 이름= "이메일" 자리 = "请输入邮箱地址" 필요한 자동 초점 > 
        < 라벨 에 대한 = "inputPassword" 클래스 = "SR 전용" >密码: </ 라벨 > 
        < 입력 유형 = "암호" ID = "inputPassword" 클래스 = "폼 컨트롤" 이름 = "암호" 자리 = "请输入密码" 요구 > 
        < DIV 클래스 = "체크 박스" > 
          < 레이블 > 
            <입력 유형 = "체크 박스" 이름 = "기억"= "1" > 记住我
           </ 라벨 > 
        </ DIV > 
        < 버튼 클래스 = "btn을 BTN-LG-BTN BTN 기본 블록" 타입 = "제출" >立即登录</ 버튼 > 
</ 형성 >

     양식 CSRF 공격에 전달 된 매개 변수의 프론트 엔드는 POST 매개 변수 (파트 파이썬 웹 프레임 워크 플라스크 배경 로그인을 얻을 평소하지 않을 수 있도록 응용 프로그램에 필요한 배경 바인드를 csrftoken, 그것은 CSRF 공격에이 방법을 사용하는 것입니다 의)

DEF의 create_app () :
     "" " 
    주요 항목 파일 생성 응용 프로그램, 기타 사용을위한 청사진 
    : 리턴 : 응용 프로그램에 반환 
    " "" 
    앱이 플라스크 (= __name__ )
     #이 주입 공격의 CSRF 방지 
    CSRFProtect (앱)
     #의 등록 청사진 모듈 
    app.register_blueprint ( cms_bp, url_prefix = " / CMS " ) 
    app.register_blueprint을 (common_bp, url_prefix = " / 공통 " ) 
    app.register_blueprint (front_bp) 

    #의 수입 프로필 
    app.config.from_object (구성)
     #의 데이터베이스 DB를 초기화 애플리케이션 
    db.init_app (앱 )
     #배경 초기화 앱 login_manager 로그인 
    cms_login_manager.init_app (앱)
     반환 앱을 


IF  __name__ == ' __main__ ' : 
    응용 프로그램 = create_app () 
    app.run ()

 

  Ajax 요청 원위 실시

    프런트 엔드 Ajax 요청이 페이지를 새로 고침 할 수있는 아주 좋은 방법을 달성하는 것입니다,하지만, Ajax 요청은 CSRF 공격을해야합니다. 방지 CSRF 공격은 또한 두 단계 매우 간단합니다 :

      {{csrf_token ()}} 메타 태그 1) 현재 페이지 CSRF 토큰에 이름을 추가 콘텐츠

< 메타 이름 = "CSRF 토큰" 콘텐츠 = "{{csrf_token ()}}" >

      2) 아약스 재 작성 요청과는 csrftoken를 포함하는 요청 헤더를 반환

'엄격한 사용' ;
VAR의 cpajax는 = {
     "GET" 함수 (인수)을 { 
        인수는 [ "방법"] = "GET" ;
        아약스 (인수); 
    }
     "POST" 함수 (인수) { 
        인수 [ "방법"] = "POST" ;
        아약스 (인수); 
    }
     "AJAX" 함수 (인수) {
         ._ajaxSetup (); 
        $ 아약스 (인수); 
    },
     "_ajaxSetup" 기능 (인수) { 
        $ .ajaxSetup ({
             "beforeSend"(XHR, 설정) {
                 경우 (/ ^ (GET! | HEAD | 옵션 |! TRACE) $ / i.test (settings.type) && .crossDomain) {
                     var에 csrftoken = $ ( "메타 [이름 = csrftoken ] ") ATTR. ("콘텐츠 " ); 
                    xhr.setRequestHeader ( "X-CSRFToken" , csrftoken); 
                } 
            } 
        }); 
    } 
};

     3) 프론트 엔드가 $ .post ()를 요청 사용할 수 있도록 (예 : 요청) CSRF 공격을 방지하지 않지만, 아약스의 사용은 우리의 재기를 요청합니다.

$ ( 함수 () { 
    $ ( ( "를 클릭"ON "# 제출"). 기능 (이벤트) { 
        에서는 event.preventDefault (); 

        var에 oldpwdE = $ ( "입력 [이름 = OLDPWD]" );
         var에 newpwdE = $ ( "INPUT [NAME = NEWPWD]" );
         VAR newpwd2E = $ ( "INPUT [NAME = newpwd2]" ); 

        VAR OLDPWD = oldpwdE.val ();
         VAR NEWPWD = newpwdE.val ();
         VAR newpwd2 = newpwd2E.val (); 

        // 1 템플릿 메타 태그에 CSRF 토큰 렌더링하는 
        // 2 헤드 Ajax 요청 CSRFtoken-X에 제공된다 
        CONSOLE.LOG ( "AAAAAAA" );
        cpajax.post ({
            "URL": "/ CMS / resetpwd" ,
             "데이터" {
                 "OLDPWD" : OLDPWD,
                 "NEWPWD" : NEWPWD,
                 "newpwd2" : newpwd2 
            }
             "성공" 기능 (데이터) { 
                CONSOLE.LOG (데이터) 
            },
             "실패" 함수 (에러) { 
                CONSOLE.LOG (오류) 
            } 
        }) 
    }) 
});

 

 

 

 

 

 

 

 

  

 

추천

출처www.cnblogs.com/aitiknowledge/p/11653641.html