python - flask : CSRF verification failed

标签 python ios flask csrf csrf-protection

我正在从 iOS 客户端发送 POST 请求

-(void)loadFavorite:(NSArray*)favorites{

    //data and url preparation

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
    [request setHTTPMethod:@"POST"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setValue:@"https://example.com" forHTTPHeaderField: @"Referer"];

    [request setValue:[NSString stringWithFormat:@"%tu", [requestData length]] forHTTPHeaderField:@"Content-Length"];
    [request setHTTPBody: requestData];

    if ([Tools isNetWorkConnectionAvailable]) {
        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
            //response handle
    }
}

这是响应:

<div id="summary">
  <h1>Forbidden <span>(403)</span></h1>
  <p>CSRF verification failed. Request aborted.</p>
</div>

我正在使用 Flask 框架和 pythonanywhere 进行托管。

当我重新加载 python 脚本时它工作正常,但在几个小时/几天后,CSRF 验证失败错误再次出现。

即使我尝试在我的 app.py 中禁用 CSRF 验证:

app.config['WTF_CSRF_CHECK_DEFAULT'] = False

App.py 脚本:

//some import error handlers ...

app = Flask(__name__)
app.config['WTF_CSRF_CHECK_DEFAULT'] = False

@app.route('/api/favorites', methods=['POST'])
def get_favorites_beaches():
    if not request.json or not 'favorite' in request.json:
        abort(400)
    //data process

if __name__ == '__main__':
    app.run(host='0.0.0.0',debug=True)

如何正确实现 CSRF 验证或如何禁用它?

最佳答案

这里是 PythonAnywhere 开发人员,正在重新发布我们刚刚发布在论坛上的内容。在我们的托管平台上,这是一个相当隐蔽的问题,我们刚刚推出了一个系统补丁来修复它。

事情是这样的:如果网络应用程序由于某种原因(系统重启、某些类型的故障、资源使用过多,可能是休眠)而关闭,则只有 GET 请求才能将其唤醒。特别是 POST 请求会因 CSRF 错误而被拒绝(由我们用于启动网络应用程序的代码生成),并且该应用程序不会被唤醒。因此,如果您的应用主要处理 POST 请求,您就会看到这个问题。这绝对符合您描述的问题。

我们的新代码会在收到 POST 时唤醒应用。仍然存在一个小问题——唤醒它的第一个 POST 请求将收到“503 服务不可用”响应,其中“重试” header 设置为“5”。如果您处理此问题并重试,那么下一个请求将起作用。我们相信浏览器会自动执行此操作,但遗憾的是请求库默认情况下不会执行此操作。

关于python - flask : CSRF verification failed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31032656/

相关文章:

python - AWS Lambda 和 Python 中的 Open CV 的无服务器问题

ios - 当我从一个 View 导航到另一个 View 时,如何让音乐持续播放?

ios - "Tell Friend"允许选择多个联系人的示例

python - Flask - 在 Google App Engine 上找不到蓝图模板

python - 带有实例变量的 Pandas 自定义访问器

python - 更改数据框中多个位置的最快方法

python - 使用 pyspark 从没有 accountkey 的 blob 中读取数据

javascript - 为什么这个页面会导致 iOS 崩溃?

python - 使用 alembic 迁移时本地和 heroku 数据库不同步

python - 如何缓存/内存我的 SQLAlchemy 函数?