Django XSS 공격 방지 방법

5150 단어 DjangoXSS
1. XSS 공격은 무엇입니까
xss공격: ---->웹 주입
xss 크로스 사이트 스크립트 공격(Cross site script, 약칭 xss)은 일종의'HTML 주입'이다. 공격한 스크립트는 대부분 크로스 필드이기 때문에'크로스 스크립트'라고 부른다.
우리는 SQL 주입과 같은 "주입"(Injection) 을 자주 듣는데, 도대체 "주입"은 무엇입니까?주입은 본질적으로 입력한 데이터를 실행 가능한 프로그램 문장으로 바꾸는 것이다.SQL 주입은 그렇고 XSS도 그렇습니다. 단지 XSS가 일반적으로 주입하는 것은 악의적인 스크립트 코드입니다. 이런 스크립트 코드는 합법적인 사용자의 데이터, 예를 들어 쿠키 정보를 얻을 수 있습니다.
PS: 사용자가 입력한 데이터를 안전한 형식으로 표시하면 페이지에만 문자열을 표시할 수 있습니다.
django 프레임워크에서 데이터 표시 보안 방식을 표시합니다. (그러나 이런 조작은 안전하지 않습니다!):
  • - 샘플 페이지에서 얻은 데이터에 대해 safe라고 적으세요. --->{{XXXX|safe}}
  • - 백그라운드 가져오기 모듈:from django.utils.safestring import mark_safe
  • 페이지에 전달할 문자열을 안전하게 처리--->s=mark_safe(s)
    2. 테스트 코드
    XSS 공격을 수행하려면 다음 두 가지 조건이 필요합니다.
    1. 웹 페이지에 악성코드를 주입해야 한다.
    둘째, 이러한 악성코드는 브라우저에서 성공적으로 실행될 수 있다.
    해결 방법:
    1. 하나의 방법은 폼 제출이나 URL 매개 변수가 전달되기 전에 필요한 매개 변수를 필터하는 것이다.
    2. 백그라운드에서 데이터베이스에서 가져온 문자열 데이터를 필터링하여 키워드를 판단한다.
    3. 안전 메커니즘을 설정한다.
    django 프레임워크: 내부 메커니즘이 기본적으로 막았습니다.전송된 문자열이 안전하지 않으면 렌더링되지 않고 문자열로 표시됩니다.만약 손이 싸게 safe를 썼다면 위험합니다. safe를 사용하려면 백그라운드에서 렌더링할 문자열을 필터해야 합니다.그래서 개발할 때는 반드시 안전 메커니즘을 신중하게 사용해야 한다.특히 사용자가 제출할 수 있고 렌더링할 수 있는 내용!!!
    여기는 xss 빈틈이 없는 글쓰기입니다. 왜냐하면 django가 이미 공격 방지 조치를 했기 때문입니다.
    index.html
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Title</title>
    </head>
    <body>
    
    <h1> </h1>
    {% for item in msg %}
    {#  <div>{{ item|safe }}</div>#} # , ,|safe  ,  <script> alert(123)</script>  
      <div>{{ item}}</div>
    {% endfor %}
    
    </body>
    </html>
    conment.html
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Title</title>
    </head>
    <body>
    
    <form action="/comment/" method="POST">
      <input type="text" name="content">
      <input type="submit" value=" ">
    </form>
    </body>
    </html>
    views.py
    
    from django.shortcuts import render,HttpResponse
    
    # Create your views here.
    msg = []
    
    def comment(request):
      if request.method == "GET":
        return render(request,"comment.html")
      else:
        v = request.POST.get("content")
        msg.append(v)
        return render(request,"comment.html")
    def index(request):
      return render(request,"index.html",{"msg":msg})########################################################
    def test(request):
      from django.utils.safestring import mark_safe
      temp = "<a href='http://www.baidu.com'> </a>"
      newtemp = mark_safe(temp)  #  |safe , , ,  test.html  {{ temp }}  ,  a  
      return render(request,'test.html',{'temp':newtemp})
    urls.py
    
    from app01 import views
    urlpatterns = [
      url(r'^admin/', admin.site.urls),
      url(r'^index/', views.index),
      url(r'^comment/',views.comment),
    ]
    ------------------------------------######################_-------------------------------
    다음은 사용자 입력 판단을 하여 특수 문자가 있는지 검사한 것이다
    views.py
    
    from django.shortcuts import render,HttpResponse
    
    # Create your views here.
    msg = []
    
    def comment(request):
      if request.method == "GET":
        return render(request,"comment.html")
      else:
        v = request.POST.get("content")
        if "script" in v:
          return render(request, "comment.html",{'error':' '})
        else:
          msg.append(v)
          return render(request,'comment.html')
    def index(request):
      return render(request,"index.html",{"msg":msg})
    index.html
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Title</title>
    </head>
    <body>
    
    <h1> </h1>
    {% for item in msg %}
      <div>{{ item|safe }}</div>
    {#  <div>{{ item}}</div>#}
    {% endfor %}
    
    </body>
    </html>
    comment.html
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Title</title>
    </head>
    <body>
    
    <form action="/comment/" method="POST">
      <input type="text" name="content">
      <input type="submit" value=" ">{{ error }}
    </form>
    </body>
    </html>
    이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

    좋은 웹페이지 즐겨찾기