python - rôle - null session flask



Pourquoi le cookie de session fonctionne-t-il lorsque vous utilisez un domaine, mais pas lorsque vous utilisez une adresse IP? (2)

Ceci est un "bug" dans Chrome, pas un problème avec votre application. (Cela peut également affecter d'autres navigateurs s'ils modifient leurs politiques.)

La RFC 2109 , qui décrit le traitement des cookies, semble indiquer que les domaines de cookie doivent être un nom de domaine complet avec un TLD (.com, .net, etc.) ou être une adresse IP de correspondance exacte. La spécification de cookie Netscape d'origine ne mentionne pas du tout les adresses IP.

Les développeurs de Chrome ont décidé d’être plus stricts que les autres navigateurs en ce qui concerne les valeurs qu’ils acceptent pour les domaines témoins. À un moment donné, ils ont corrigé un bug qui empêchait les cookies sur les adresses IP, mais ils ont apparemment rétrogradé depuis et interdisent les cookies sur les domaines non-FQDN (y compris localhost) ou les adresses IP. Ils ont déclaré qu'ils ne régleraient pas ce problème, car ils ne le considéraient pas comme un bogue.

La raison pour laquelle les cookies «normaux» fonctionnent mais le cookie de session ne l’est pas, c’est que vous ne définissez pas de domaine pour les cookies «normaux» (c’est un paramètre facultatif), mais Flask définit automatiquement le domaine du cookie de session sur SERVER_NAME . Chrome (et d'autres) acceptent les cookies sans domaine et les définissent automatiquement dans le domaine de la réponse, d'où la différence de comportement observée. Vous pouvez échouer avec les cookies normaux de l'observateur si vous définissez le domaine sur l'adresse IP.

Pendant le développement, vous pouvez contourner ce problème en exécutant l'application sur localhost plutôt que de la laisser par défaut à 127.0.0.1. Flask a une solution de contournement qui n'enverra pas le domaine pour le cookie de session si le nom du serveur est localhost. app.run('localhost')

En production, il n'y a pas de vraie solution. Vous pouvez servir ceci sur un domaine plutôt que sur une adresse IP, ce qui le résoudrait mais pourrait ne pas être possible dans votre environnement. Vous pouvez exiger que tous vos clients utilisent autre chose que Chrome, ce qui n’est pas pratique. Vous pouvez également fournir à Flask une interface de session différente qui effectue la même solution de contournement pour les adresses IP que celle qu'il utilise déjà pour localhost, bien que cela ne soit probablement pas sûr.

Chrome n'autorise pas les cookies avec les adresses IP pour le domaine et il n'existe aucune solution de contournement pratique.

J'ai une application Flask avec des sessions qui fonctionne bien sur ma machine de développement locale. Cependant, lorsque j'essaie de le déployer sur un serveur Amazon, les sessions ne semblent pas fonctionner.

Plus spécifiquement, le cookie de session n'est pas défini. Je peux toutefois définir des cookies normaux. Je me suis assuré d'avoir une clé sécurisée statique, comme d'autres l'ont indiqué, ce pourrait être un problème. La seule différence réside dans la configuration du serveur. Pendant le développement, j'utilise

app.run()

courir localement. Une fois déployé, j'utilise

app.config['SERVER_NAME'] = '12.34.56.78'  # <-- insert a "real" IP
app.run(host='0.0.0.0', port=80)

Je soupçonne que le problème pourrait être dans ce qui précède, mais je ne suis pas complètement certain.

La session semble fonctionner sur Firefox, mais pas sur Chrome.

La petite application suivante illustre le problème, avec les différences de configuration en bas:

from flask import Flask, make_response, request, session

app = Flask(__name__)
app.secret_key = 'secretKey'

# this is to verify that cookies can be set
@app.route('/setcookie')
def set_cookie():
    response = make_response('Cookie set')
    response.set_cookie('cookie name', 'cookie value')
    return response

@app.route('/getcookie')
def get_cookie():
    if 'cookie name' in request.cookies:
        return 'Cookie found. Its value is %s.' % request.cookies['cookie name']
    else:
       return 'Cookie not found'

# this is to check if sessions work
@app.route('/setsession')
def set_session():
    session['session name'] = 'session value'
    return 'Session set'

@app.route('/getsession')
def get_session():
    if 'session name' in session:
        return 'Session value is %s.' % session['session name']
    else:
        return 'Session value not found'

if __name__ == '__main__':
    app.debug = True

    # windows, local development
    #app.run()  

    # Ubuntu
    app.config['SERVER_NAME'] = '12.34.56.78'  # <-- insert a "real" IP
    app.run(host='0.0.0.0', port=80)

Answer #1

Il est possible de créer une session dans le navigateur Chrome en utilisant IP.

Mon fichier de configuration a ces configurations:

    SERVER_NAME = '192.168.0.6:5000'
    SESSION_COOKIE_DOMAIN = '192.168.0.6:5000'

Cela me permettait d'utiliser une machine virtuelle locale et le cookie fonctionnait parfaitement sous Chrome, sans avoir besoin d'un FQDN local.





flask