2015-06-24 7 views
5

Я посылаю запрос POST от клиента IOSНастой: CSRF проверка не удалось

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

Я использую рамки флягу и pythonanywhere для хостинга.

Он отлично работает, когда я перезагружаю скрипт python, но через несколько часов/дней снова появляется ошибка проверки CSRF.

Даже если я пытаюсь отключить проверку CSRF в моем app.py с:

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 том, как отключить его?

+0

Флакон не имеет встроенной защиты CSRF. Вы добавляете его с Flask-WTF или аналогичным расширением? – jonafato

+0

Нет, и я не хочу его использовать, я не понимаю, почему я получаю эту ошибку. Я не использую flask_wtf.csrf, CsrfProtect, и я не делаю CsrfProtect (app) в app.py. –

+0

Если возможно, я хочу отключить его, но я не знаю, почему app.config ['WTF_CSRF_CHECK_DEFAULT'] = False не работает в app.py. –

ответ

0

у вас есть строка в коде, который [request setValue:@"https://example.com" forHTTPHeaderField: @"Referer"];

вы не установите его на правильный URL? Неправильный референт - это один из способов получить ошибку кросс-сайта.

Конрад

+0

Да, это правильный URL-адрес, потому что он работает в течение нескольких часов или дня, когда я перезагружаю веб-приложение, после чего возвращается ошибка проверки CSRF. –

+0

после того, как он вернется, останется ли он до перезагрузки webapp? или это исчезнет после того, как вы ударили его пару раз – conrad

1

PythonAnywhere разработчик здесь, перепроведении, что мы просто положить на наших форумах. Это оказалось довольно неясной проблемой на нашей платформе хостинга, и мы просто нажали системный патч, который его исправляет.

Вот что это было: если по какой-то причине было отключено веб-приложение (перезагрузка системы, некоторые виды сбоев, чрезмерное использование ресурсов, возможно, спящий режим), тогда только запрос GET разбудит его. Запросы POST, в частности, будут отклоняться с ошибкой CSRF (сгенерированной нашим кодом, предназначенным для запуска веб-приложения), и приложение не будет разбужено. Поэтому, если ваше приложение является тем, которое обрабатывает большинство запросов POST, вы увидите эту проблему. Это определенно похоже на проблему, как вы ее описываете.

Наш новый код пробуждает приложение при получении POST. Остается одна небольшая проблема - первый запрос POST, который просыпается, получит ответ «503 Service Unavailable» с заголовком «retry-after», установленным в «5». Если вы справитесь с этим и повторите попытку, то следующий запрос будет работать. Мы считаем, что браузеры делают это автоматически, но, к сожалению, библиотека запросов не по умолчанию.

Смежные вопросы