use*_*330 6 session csrf token flask
我研究了我能找到的关于 Flask WTF 应用程序中“CSRF 会话令牌丢失”的每一篇文章,但到目前为止,我无法在任何有解决方案的解决方案中找到解决方案,或者我错过了它并且没有看到它。
\n\n在本例中,我正在创建一个登录页面,并且在登录表单的 POST/提交时生成错误。
\n\n在浏览器开发工具中,我可以在表单数据中看到 \xe2\x80\x9ccsrf_token\xe2\x80\x9d 但标题中没有令牌。
\n\n表单数据来自;
\n\n <form method="POST" action="">\n {{ form.hidden_tag() }}\n {{ form.csrf_token() }}\nRun Code Online (Sandbox Code Playgroud)\n\n在login.html中,但我不知道\xe2\x80\x99是否是预期的结果\xe2\x80\x93,它似乎不起作用。
\n\n我在想我应该在请求标头中看到 X-CSRFToken 吗?但我不。
\n\n它应该是一个不同的cookie吗?(例如名为 \xe2\x80\x9ccsrf_token\xe2\x80\x9d 不是 \xe2\x80\x9csession\xe2\x80\x9d 名为 cookie ?)
\n\n在 validate_csrf() 函数中,我发现;
\n\nsecret_key = _get_config(\n secret_key, \'WTF_CSRF_SECRET_KEY\', current_app.secret_key,\n message=\'A secret key is required to use CSRF.\'\n)\nRun Code Online (Sandbox Code Playgroud)\n\n返回预期的秘密值:
\n\nsecret_key = {bytes} b\'abc123ced456\'\nfield_name = _get_config(\n token_key, \'WTF_CSRF_FIELD_NAME\', \'csrf_token\',\n message=\'A field name is required to use CSRF.\'\n)\nRun Code Online (Sandbox Code Playgroud)\n\n回报
\n\nfield_name = {str} \xe2\x80\x98csrf_token\xe2\x80\x99\nRun Code Online (Sandbox Code Playgroud)\n\n和 _data 似乎没问题:
\n\ndata = {str} \'IjZiNWY5ZDdiNTZjMTVkM2U0Mzg3MjU1NGMxYzc3Yjg1MTMzYTlhYzEi.XC447w.cmc1INq6u8qVuq0EOL9ARcPwB6k\'\nRun Code Online (Sandbox Code Playgroud)\n\n但是它失败,因为 \xe2\x80\x9cfield_name\xe2\x80\x9d 不在会话中
\n\nif field_name not in session:\n raise ValidationError(\'The CSRF session token is missing.\')\nRun Code Online (Sandbox Code Playgroud)\n\n所以问题是为什么?
\n\n我还从登录表单方法中检查键/值时出现错误;
\n\n@app.route("/login", methods=[\'GET\', \'POST\'])\ndef login():\n test = session[\'secret_key\']\nRun Code Online (Sandbox Code Playgroud)\n\n密钥错误:\'secret_key\'
\n\napp.secret_key 如何到达会话 \xe2\x80\x98secret_key\xe2\x80\x99 ?\n这似乎没有发生。
\n\nfrom flask import Flask, render_template, url_for, flash, redirect, Response, jsonify, abort, session\nfrom flask_session import Session\nfrom flask_wtf.csrf import CSRFProtect\nfrom flask_cors import CORS\n\nfrom flask_login import LoginManager,UserMixin,current_user,login_required,login_user,logout_user\n\nfrom forms import RegistrationForm, LoginForm, TimecardForm\nfrom employees import employees\n\ncsrf = CSRFProtect()\n\napp = Flask(__name__)\ncsrf.init_app(app)\n\napp.config[\'SECRET_KEY\'] = os.getenv(\'SECRET_KEY\') or \\\n \'abc123ced456\'\n\napp.config[\'SESSION_TYPE\'] = \'memcached\'\napp.config[\'WTF_CSRF_ENABLED\'] = True\napp.config[\'WTF_CSRF_SECRET_KEY\'] = os.getenv(\'SECRET_KEY\') or \\\n \'abc123ced456\'\napp.config[\'SESSION_COOKIE_SECURE\'] = True\napp.config[\'REMEMBER_COOKIE_SECURE\'] = True\n\nCORS(app)\nsess = Session()\nsess.init_app(app)\n\n\nlogin_manager = LoginManager()\nlogin_manager.init_app(app)\nlogin_manager.session_protection = "strong"\nlogin_manager.login_view = \'login\'\n\n\n@login_manager.user_loader\ndef load_user(userid):\n result = None\n emp_collection = employees.oEmployeeCollection()\n emp_collection.getAllEmployees(None, None)\n result = emp_collection.getEmployee(userid)\n\n return result\n\n@app.route("/login", methods=[\'GET\', \'POST\'])\ndef login():\n form = LoginForm()\n\n if form.validate_on_submit():\n emp_collection = employees.oEmployeeCollection()\n emp_collection.getAllEmployees(None, None)\n current_user = emp_collection.getEmployee(form.user_init.data.upper())\n\n if current_user is not None:\n if current_user.password == form.password.data:\n login_user(current_user, remember=True)\n sess[\'current_user\'] = current_user.toJSON()\n\n flash(\'You have been logged in!\', \'success\')\n\n #next = flask.request.args.get(\'next\')\n ## is_safe_url should check if the url is safe for redirects.\n #if not is_safe_url(next):\n # return flask.abort(400)\n #return flask.redirect(next or flask.url_for(\'index\'))\n\n return redirect(url_for(\'home\'))\n else:\n flash(\'Login Unsuccessful. Please check username and password\', \'danger\')\n\n else:\n flash(\'Login Unsuccessful. Please check username and password\', \'danger\')\n\n flash(form.errors)\n return render_template(\'login.html\', title=\'Login\', form=form)\n\n\n@app.before_first_request\ndef execute_this():\n # emp_collection.getAllEmployees(None, None)\n test = None\n\nif __name__ == \'__main__\':\n app.run(host=\'flask.local\', port=5000, debug=False)\nRun Code Online (Sandbox Code Playgroud)\n\n{% extends "template.html" %}\n{% block content %}\n <div class="content-section">\n <form method="POST" action="">\n {{ form.hidden_tag() }}\n {{ form.csrf_token() }}\n\n <fieldset class="form-group">\n <legend class="border-bottom mb-4">Log In</legend>\n\n <div class="form-group">\n {{ form.user_init.label(class="form-control-label")}}\n {% if form.user_init.errors %}\n {{ form.user_init(class="form-control form-control-lg is-invalid") }}\n <div class="invalid-feedback">\n {% for error in form.user_init.errors %}\n <span>{{ error }}</span>\n {% endfor %}\n </div>\n {% else %}\n {{ form.user_init(class="form-control form-control-lg") }}\n {% endif %}\n </div>\n <div class="form-group">\n {{ form.password.label(class="form-control-label") }}\n {% if form.password.errors %}\n {{ form.password(class="form-control form-control-lg is-invalid") }}\n <div class="invalid-feedback">\n {% for error in form.password.errors %}\n <span>{{ error }}</span>\n {% endfor %}\n </div>\n {% else %}\n {{ form.password(class="form-control form-control-lg") }}\n {% endif %}\n </div>\n <div class="form-check">\n {{ form.remember(class="form-check-input") }}\n {{ form.remember.label(class="form-check-label") }}\n </div>\n </fieldset>\n <div class="form-group">\n {{ form.submit(class="btn btn-outline-info") }}\n </div>\n <small class="text-muted ml-2">\n <a href="#">Forgot Password?</a>\n </small>\n </form>\n </div>\n <div class="border-top pt-3">\n <small class="text-muted">\n Need An Account? <a class="ml-2" href="{{ url_for(\'register\') }}">Sign Up Now</a>\n </small>\n </div>\n{% endblock content %}\nRun Code Online (Sandbox Code Playgroud)\n\nfrom flask_wtf import FlaskForm\nfrom wtforms import StringField, PasswordField, SubmitField, BooleanField, DateField, DecimalField\nfrom wtforms.validators import DataRequired, Length, Email, EqualTo\n\nclass LoginForm(FlaskForm):\n user_init = StringField(\'User\', validators=[DataRequired()])\n password = PasswordField(\'Password\', validators=[DataRequired()])\n remember = BooleanField(\'Remember Me\')\n submit = SubmitField(\'Login\')\nRun Code Online (Sandbox Code Playgroud)\n\n<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">\n<title>400 Bad Request</title>\n<h1>Bad Request</h1>\n<p>The CSRF session token is missing.</p>\nRun Code Online (Sandbox Code Playgroud)\n\nContent-Type \xe2\x86\x92text/html\nContent-Length \xe2\x86\x92142\nAccess-Control-Allow-Origin \xe2\x86\x92*\nSet-Cookie \xe2\x86\x92session=ad0a88f2-4048-4a3b-9934-c2cd5957e9ff; Expires=Sun, 03-Feb-2019 14:55:27 GMT; HttpOnly; Path=/\nServer \xe2\x86\x92Werkzeug/0.14.1 Python/3.7.1\nDate \xe2\x86\x92Thu, 03 Jan 2019 14:55:27 GMT\nRun Code Online (Sandbox Code Playgroud)\n\nRequest URL: http://localhost:5000/login\nRequest Method: POST\nStatus Code: 400 BAD REQUEST\nRemote Address: 127.0.0.1:5000\nReferrer Policy: no-referrer-when-downgrade\nRun Code Online (Sandbox Code Playgroud)\n\nAccess-Control-Allow-Origin: http://localhost:5000\nContent-Length: 150\nContent-Type: text/html\nDate: Thu, 03 Jan 2019 14:47:18 GMT\nServer: Werkzeug/0.14.1 Python/3.7.1\nSet-Cookie: session=62e6139c-332b-4811-ad3a-de5c29c878aa; Expires=Sun, 03-Feb-2019 14:47:18 GMT; HttpOnly; Path=/\nVary: Origin\nRun Code Online (Sandbox Code Playgroud)\n\nPOST /login HTTP/1.1\nHost: localhost:5000\nConnection: keep-alive\nContent-Length: 258\nCache-Control: max-age=0\nUpgrade-Insecure-Requests: 1\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36\nOrigin: http://localhost:5000\nContent-Type: application/x-www-form-urlencoded\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\nReferer: http://localhost:5000/login\nAccept-Encoding: gzip, deflate, br\nAccept-Language: en-US,en;q=0.9\n\nCookie: Webstorm-655f3561=d5da8892-b9fc-4680-8fe8-17baf5fd6f8d;session=62e6139c-332b-4811-ad3a-de5c29c878aa\nRun Code Online (Sandbox Code Playgroud)\n\ncsrf_token=ImI5ZDlkYjZmNjkxMDZlZDczZjdlY2VjMTM2NTQzOWZlMDBkYTY1ZWMi.XC4gZQ.DVyKZ07nrQN6WZn0jmoHyKrf_YI&\n csrf_token=ImI5ZDlkYjZmNjkxMDZlZDczZjdlY2VjMTM2NTQzOWZlMDBkYTY1ZWMi.XC4gZQ.DVyKZ07nrQN6WZn0jmoHyKrf_YI&user_init=ABC&password=changeme&remember=y&submit=Login\nRun Code Online (Sandbox Code Playgroud)\n
{{ form.hidden_tag() }}应该扩展到类似的东西
<input id="csrf_token" name="csrf_token" type="hidden" value="... long string ...">
Run Code Online (Sandbox Code Playgroud)
如果您没有看到这一点,请仔细检查您如何设置应用程序的配置部分。除了 之外SECRET_KEY,您还设置任何选项吗WTF_?
您可能想要删除{{ form.csrf_token() }}
不X-涉及标头。(我快速检查了我的一个应用程序,以防我忘记了什么。)
| 归档时间: |
|
| 查看次数: |
14497 次 |
| 最近记录: |