2017-05-07 2 views
1

Ceci est ma première application utilisant Flask et Python.Comment valider les paramètres d'URL dans Flask

J'utilise le format URL ci-dessous pour envoyer une requête POST d'Arduino à l'application flask s'exécutant sur l'instance de serveur Pythonanywhere.

Valid requête POST: 3 Paramètres d'URL http://voyagers.pythonanywhere.com/senddata?node=1234&lat=18.5580&lng=73.8075

Je dois bloquer la demande de traitement ultérieur en validant l'URL sous une forme. Je veux que cela sécurise mon application des demandes POST non authentifiées.

Dites quelque chose comme ceci: Tout ce que plus de 3 Paramètres d'URL http://voyagers.pythonanywhere.com/senddata?node=324&lat=18.5580&lng=73.8075&a=c&a=d

Comment puis-je parvenir à Flask?

Suggérer également, S'il y a une meilleure façon qui pourrait être utilisée pour sécuriser l'application des demandes non autorisées.

+1

Quelle connexion voyez-vous entre l'autorisation de faire une demande et le nombre de paramètres de requête dans cette requête? – jonrsharpe

+0

@jonrsharpe Autorisation ici, je veux dire, disons si le périphérique matériel (noeud arduino) envoie une requête POST composée de plus de 3 paramètres d'URL comme je l'ai mentionné ci-dessus. Je ne veux pas gérer de telles demandes. Dites-le plus de vérification d'erreur! (P.S: pardonner pour le jargon in-approprié, débutant au développement d'application) –

+0

Avez-vous regardé par ex. http://stackoverflow.com/q/29568540/3001761? La validation de l'entrée n'est pas la même chose que la sécurisation de l'application, donc ce que vous essayez d'obtenir n'est pas vraiment clair. Si vous voulez juste dire que vous voulez vérifier que les seules clés dans le dictionnaire de paramètres de requête sont 'node',' lat' et 'lng', * avez-vous essayé d'écrire cela? * – jonrsharpe

Répondre

2

Vous pouvez obtenir flask pour valider les paramètres et lancer une erreur automatiquement si vous êtes prêt à passer de URL paramètres (ie quoi que ce soit après le « ? » Symbole dans l'URL) pour chemin paramètres (c.-à-tout ce qui est dans l'en-tête HTTP Path, ou la partie de l'URL après le premier '/' et avant le '?').

Votre exemple pourrait ressembler à ceci:

@app.route('/post/<int:node_id>/<float:lat>/<float:lng>', methods=['POST']) 
def process_post_request(node_id, lat, lng): 
    # do some work 
    return your_result 

Ensuite, vous pouvez envoyer la demande à l'URL qui ressemblerait par exemple comme ceci: http://example.com/post/1234/-11.45/21.34

Vous pouvez trouver plus sur ce ici: http://flask.pocoo.org/docs/0.12/quickstart/#variable-rules

Pour sécuriser l'accès, vous pouvez utiliser quelques exemples d'extraits ici: http://flask.pocoo.org/snippets/category/authentication/

Je recommanderais de restreindre l'accès au protocole HTTPS uniquement et d'utiliser l'authentification de base si vous ne faites que jouer. C'est quelque chose que vous pouvez faire avec un simple décorateur comme décrit ici: http://flask.pocoo.org/snippets/8/

Vous obtiendrez une invite dans votre navigateur vous demandant un nom d'utilisateur et un mot de passe et le navigateur s'en souviendra pendant la durée de la session. Vous pouvez également définir le nom d'utilisateur et le mot de passe sous la forme codée en base64 dans l'en-tête Authorization: https://en.wikipedia.org/wiki/Basic_access_authentication

+0

Merci Grepe !. Ci-dessus est une solution que je vais essayer. Y at-il quelque chose de similaire qui pourrait être fait avec des paramètres après '?' dans l'URL? Au lieu de modifier l'URL en tant que «id_noeud/lat/long»? –

+0

@balaji à ma connaissance il n'y a pas de validation de paramètre d'URL intégré dans la fiole. tu devrais l'écrire toi-même. Les paramètres d'URL sont quasiment gratuits et faciles à modifier et/ou à ajouter sans rien casser ... c'est pourquoi ils sont utilisés par exemple. à des fins de suivi (essayez de cliquer sur presque toutes les bannières publicitaires et regardez votre URL). – grepe