Python djanjo 의 csrf 크로스 오 버 공격 방지 실험 과정

1.CSRF 안내
CSRF 는 무엇 입 니까?
CSRF(Cross-site request forgery),중국어 이름:크로스 오 버 요청 위조,원 클릭 공격/session riding,줄 임 말:CSRF/XSRFCSRF 는 무엇 을 할 수 있 습 니까?
CSRF 공격 을 이렇게 이해 할 수 있 습 니 다.공격 자가 당신 의 신분 을 도용 하여 당신 의 이름 으로 악의 적 인 요 구 를 보 냈 습 니 다.CSRF 가 할 수 있 는 일 은 귀하 의 명의 로 메 일 을 보 내 고 메 시 지 를 보 내 며 귀하 의 계 정 을 훔 치 거나 심지어 상품 을 구 매 하거나 가상 화폐 이 체 를 하 는 것 입 니 다.이 로 인해 발생 하 는 문 제 는 개인 프라이버시 누설 과 재산 안전 을 포함 합 니 다CSRF 허점 현황 은?
CSRF 라 는 공격 방식 은 2000 년 에 이미 외국 의 안전 요원 들 에 의 해 제기 되 었 으 나 국내 에 서 는 06 년 에 야 주 목 받 기 시작 했다.08 년 에 국내외 여러 대형 커 뮤 니 티 와 인 터 랙 션 사이트 에서 각각 CSRF 구멍 이 터 졌 다.예 를 들 어 NYTimes.com(뉴욕타임스),Metafilter(대형 BLOG 사이트),유 튜브 와 바 이 두 HI 등 이다.인터넷 의 많은 사이트 들 이 여전히 이에 대해 무방 비 상태 여서 보안 업계 에 서 는 CSRF 를'잠 자 는 거인'이 라 고 부른다.
참조:https://blog.csdn.net/qq_21956483/article/details/78116094
2.CSRF(웹 폼 제출)
웹 폼 아래 CSRF 탭 을 설정 하면 CSRF 크로스 오 버 공격 을 효과적으로 방지 할 수 있 습 니 다(아래 그림)
{% csrf_token %}

이 폼 을 설정 하지 않 으 면 웹 페이지 에 접근 할 때 접근 이 금 지 됩 니 다(아래 그림)

접근 금지 에 대응 하 는 방법 도 여러 가지 가 있 습 니 다.그 중 하 나 는 설정 파일(settings.py)의 csrf 미들웨어 를 제거 하 는 것 입 니 다.이렇게 하면 원래 접근 이 금 지 된 페이지 도 성공 적 으로 접근 할 수 있 지만 이러한 방법 은 위험 이 매우 큽 니 다.안전 을 고려 하여 이렇게 하 는 것 을 추천 하지 않 습 니 다.

다른 방법 은 보기 층 에 장식 기 를 추가 하 는 것 입 니 다(@csrfexempt)부분 적 인 검 측 을 실현 합 니 다.다시 말 하면 웹 폼 에 csrf 라벨 을 추가 하지 않 아 도 장식 기 를 추가 하면 페이지 에 성공 적 으로 접근 할 수 있 습 니 다.장식 기 내용 만 추가 하고 다른 장식 기 를 추가 하지 않 은 코드 는 접근 이 금 지 된 상태 입 니 다.

3.CSRF(웹 폼 제출)실험
이어서 우 리 는 위 에서 말 한 내용 을 코드 로 한 번 보 여 주 었 다.
우선,app 아래 urls.py 파일 에 하위 루트 를 설정 합 니 다.

from django.urls import path, re_path
from App import views

urlpatterns = [
    # csrf  
    path('register/',views.register,name = 'register'),
]
이어서 보기 함 수 를 작성 합 니 다.

def register(request):
    if request.method == "POST": #       POST  
        username = request.POST.get('username') #       username
        password = request.POST.get('password') #       password
        print(username,password) #   username,password
    return render(request,'register.html') #     ,   web register.html    
웹 폼(csrf 태그 가 설정 되 지 않 음)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>  </title>
</head>
<body>
<form ation="" method="post">
       :<input type="text" name="username"><br>
      :<input type="text" name="password"><br>
    <input type="submit">
</form>
</body>
</html>
이 때 서비스(python manage.py runserver 8090)를 시작 하면 웹 페이지 에 접근 하면 접근 금지 문자 가 표 시 됩 니 다.
그럼 다음은 웹 폼 에 csrf 탭 을 설정 합 니 다.
{% csrf_token %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>  </title>
</head>
<body>
<form ation="" method="post">
    {#        #}
    {% csrf_token %}
       :<input type="text" name="username"><br>
      :<input type="text" name="password"><br>
    <input type="submit">
</form>
</body>
</html>
웹 페이지 에 다시 방문 하면 사용자 이름,비밀 번 호 를 정상적으로 제출 할 수 있 고 폼 에 csrf 암시 적 의사 난수 가 하나 더 있 습 니 다.
CSRF 공격 은 WEB 의 암시 적 인증 메커니즘 에서 비롯 된 것 입 니 다!WEB 의 인증 체 제 는 한 사용자 의 브 라 우 저 에서 요청 한 것 을 보증 할 수 있 지만 이 요청 이 사용자 가 보 낸 것 이 라 고 보장 할 수 없습니다!
CSRF 방어 메커니즘 사고방식 은 클 라 이언 트 페이지 에 위조 무 작위 수 를 늘 리 면 비교적 효과 적 인 크로스 공격 방 어 를 실현 할 수 있다 는 것 이다

4.CSRF(ajax 제출)
ajax 제출,html 에 다음 내용 을 추가 해 야 합 니 다.
🌈1 인용 jquery
🌈2.크로스 오 버 공격 방지 탭 추가
🌈3 ajax 제출 용 button 추가
🌈4 ajax 추가

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>  </title>
    {# 🌈1   jquery #}
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
</head>
<body>
<form ation="" method="post">
    {# 🌈2        #}
    {% csrf_token %}
       :<input type="text" name="username"><br>
      :<input type="text" name="password"><br>
<!--    {#      #}-->
<!--    <input type="submit">-->

<!--    {# 🌈3 ajax   #}-->
    <input type="button" value="  " id="button">
</form>
</body>
</html>
<script>
	{# 🌈4 ajax #}
    $("#button").click(function(){
        username = $("[name='username']").val();
        password = $("[name='password']").val();
        csrf = $("[type='hidden']").val();
        console.log(username,password,csrf);
        {# $.post("/register/") #}
    });

</script>
여기 서 ajax 전 삼 방식 에 대해 한 가지 만 소개 하 였 습 니 다.더 깊이 알 고 싶 으 시 면 걸음 을 옮 겨 주세요django 의 ajax 전 삼 두 가지 형식
웹 페이지 에 접근 한 후 사용자 이름,비밀 번 호 를 입력 하고 심사 요 소 를 확인 합 니 다.콘 솔 은 입력 한 사용자 이름,비밀번호,그리고 암시 적 의사 임 의 수 를 표시 합 니 다.

html 에 다음 내용 을 계속 추가 합 니 다.
🌈5 포스트 제출

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>  </title>
    {# 🌈1   jquery #}
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
</head>
<body>
<form ation="" method="post">
    {# 🌈2        #}
    {% csrf_token %}
       :<input type="text" name="username"><br>
      :<input type="text" name="password"><br>
<!--    {#      #}-->
<!--    <input type="submit">-->

<!--    {# 🌈3 ajax   #}-->
    <input type="button" value="  " id="button">
</form>
</body>
</html>
<script>
	{# 🌈4 ajax #}
    $("#button").click(function(){
        username = $("[name='username']").val();
        password = $("[name='password']").val();
        csrf = $("[type='hidden']").val();
        console.log(username,password,csrf);

        {# 🌈5 post   #}
        {# $.post("  ",{  },function(   ){}) #}
        $.post("/user/register/",{'username':username,'password':password,'csrfmiddlewaretoken':csrf},function(data){
            console.log(data)
        })

    });

</script>
보기 층 에 다음 코드 추가
🌟ajax 요청 되 돌리 기

#     
# @csrf_exempt
def register(request):
    if request.method == "POST":
        username = request.POST.get('username')
        password = request.POST.get('password')
        print(username,password)

        # 🌟  ajax  
        return JsonResponse({'code':1})
        # {'code':1}     

    return render(request,'register.html')
마지막 으로 웹 페이지 에 접근 하면 ajax 요청 이 성공 하고 반환 값{'code':1}을 성공 적 으로 되 돌려 줍 니 다.

총결산
파 이 썬 djanjo 의 csrf 크로스 오 버 공격 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 djanjo csrf 크로스 오 버 공격 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기