Flask

Flask – flask wtf

  • flask-wtf 설치
# 설치
pip install flask-wtf

# 추가로 freeze
pip freeze > requirements.txt
  • FlaskForm
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
from wtforms.validators import DataRequired, EqualTo

class LoginForm(FlaskForm):
    user_id = StringField('User Id', validators=[DataRequired()])
    password = PasswordField('Password', validators=[DataRequired()])
  • CSRF 토큰 적용
from flask import Flask
from flask_wtf.csrf import CSRFProtect

csrf = CSRFProtect()

app = Flask(__name__) # 필요한 경우 내부에서만 참조하기때문

csrf.init_app(app)
  • CSRF 특정 블루프린트에서 제거처리
    • 프로덕션 환경에서도, API 문서를 정상 테스트 처리해주기 위해선 IP ACL등을 정하는 듯 조치필요.
bp = Blueprint(...)
csrf.exempt(bp)
@app.route('/some-view', methods=['POST'])
@csrf.exempt
def some_view():
  • CSRF 토큰 검증
    • CSRF방어가 필요한 요청(=쓰기/변경이 가능한 엔드포인트 및 메서드들) 마다 특정 토큰을 포함시켜서 요청하여, 서버에서 비교하는 방식
<!--적용 방식-->

<!--JavaScript Requests-->
<script type="text/javascript">
    var csrf_token = "{{ csrf_token() }}";

    $.ajaxSetup({
        beforeSend: function(xhr, settings) {
            if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {
                xhr.setRequestHeader("X-CSRFToken", csrf_token);
            }
        }
    });
</script>

<!--HTML Forms1 -->
<form method="post">
    {{ form.csrf_token }}
</form>

<!--HTML Forms2 -->
<form method="post">
    <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
</form>

참고 자료

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.