2015-06-24 14 views
5

IchFlask: CSRF Überprüfung fehlgeschlagen

-(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 
    } 
} 

Hier ist die Antwort eine POST-Anforderung von einem iOS-Client sendet:

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

Ich bin mit Flask Rahmen und pythonanywhere für das Hosting.

Es funktioniert einwandfrei, wenn ich das Python-Skript neu lade, aber nach einigen Stunden/Tagen wird der CSRF-Verifikationsfehler erneut angezeigt.

Auch wenn ich versuche, die CSRF Überprüfung in meinem app.py zu deaktivieren mit:

app.config['WTF_CSRF_CHECK_DEFAULT'] = False 

App.py Skript:

//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) 

Wie kann ich die CSRF Überprüfung korrekt implementieren oder wie man deaktiviere es?

+0

Flask hat keinen integrierten CSRF-Schutz. Fügen Sie ihn mit Flask-WTF oder einer ähnlichen Erweiterung hinzu? – jonafato

+0

Nein, und ich möchte es nicht verwenden, ich verstehe nicht, warum ich diesen Fehler erhalte. Ich verwende keine flask_wtf.csrf, CsrfProtect und ich nicht CsrfProtect (app) in app.py. –

+0

Wenn es möglich ist, möchte ich es deaktivieren, aber ich weiß nicht warum app.config ['WTF_CSRF_CHECK_DEFAULT'] = Falsch funktioniert nicht in app.py. –

Antwort

0

Sie haben eine Zeile in Ihrem Code, der [request setValue:@"https://example.com" forHTTPHeaderField: @"Referer"];

haben Sie nicht setzen Sie ihn auf die richtige URL ist? Ein falscher Referer ist eine Möglichkeit, einen Cross Site-Fehler zu erhalten.

Conrad

+0

Ja, es ist die richtige URL, weil es für ein paar Stunden oder einen Tag funktioniert, wenn ich die Web-App neu lade, dann kommt der CSRF-Verifizierungsfehler zurück. –

+0

Wenn es zurückkommt, bleibt es so lange, bis Sie die Webapp neu laden? oder verschwindet es, nachdem du es ein paar Mal getroffen hast – conrad

1

PythonAnywhere Entwickler hier, reposting, was wir in unserem Forum eine gerade setzen. Dies stellte sich als ziemlich unklares Problem auf unserer Hosting-Plattform heraus, und wir haben gerade einen System-Patch auf den Markt gebracht, der es behebt.

Hier ist, was es war: Wenn eine Web App aus irgendeinem Grund heruntergefahren wurde (Systemneustart, bestimmte Arten von Panne, exzessive Ressourcennutzung, vielleicht Ruhezustand), dann würde nur eine GET-Anfrage es aufwecken. Vor allem POST-Anfragen würden mit einem CSRF-Fehler abgelehnt (generiert durch unseren Code, der die Web-App starten soll), und die App würde nicht geweckt werden. Wenn Ihre App also hauptsächlich POST-Anfragen verarbeitet, sehen Sie dieses Problem. Dies scheint definitiv zu dem Problem zu passen, wie Sie es beschreiben.

Unser neuer Code weckt die App, wenn ein POST empfangen wird. Ein kleines Problem bleibt bestehen - die erste POST-Anfrage, die sie aufweckt, erhält eine Antwort "503 Service nicht verfügbar" mit dem Header "Wiederholung nach" auf "5". Wenn Sie damit umgehen und die Wiederholung versuchen, wird die nächste Anfrage funktionieren. Wir glauben, dass Browser dies automatisch tun, aber die Bibliothek der Anfragen ist leider nicht standardmäßig.