Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Protéger sa base de donnée

–1 vote

Petite question pour m'améliorer.

Supposons que j'aie le script suivant sur un serveur:

#!/usr/bin/python2.7
# coding: utf-8

import __future__
import os
import cgi
import MySQLdb
import MySQLdb.cursors
import datetime
import uuid


def htmlTop():
    print("Content-type: text/html\n\n")

def getData():

    formData = cgi.FieldStorage()
    user_id = formData.getvalue('user_id')

    if user_id is None:
        unic_id = uuid.uuid4()
        print("User ID created: {}".format(unic_id))
    else:
        try:
            uuid.UUID(user_id, version=4)
        except ValueError:
            print("Not a valid user ID")
            return False

if __name__ == "__main__":
    try:
        htmlTop()
        getData()
    except:
        cgi.print_exception()

Ce script, qui tourne sur un serveur, traite des requêtes GET, faites par un client local. Le client local est un programme chez l'utilisateur. Au démarrage du programme, l'utilisateur n'a pas encore d'id unique. Il envoie donc une requête "vide" au serveur qui lui sert un user id. En même temps, le serveur crée un nouvel item en base de donnée, avec ce nouvel user id (bon ok, la partie bdd n'est pas dans le script, mais faites comme si elle y était).

On remarque donc assez vite un problème dans la démarche: un mec lambda qui récupérerait l'url du script, pourrait facilement faire un script qui tourne en boucle, envoyant des requêtes nulles à mon serveur, et créant des items en base de donnée, pour rien.

Je suppose que ce type d'attaque a un nom, mais je ne le connais pas.

Question donc: est-ce que ça vaut le coup de se protéger contre ça ? Si oui, comment ?

EDIT:

Bon, puisque je me fais tailler dans les commentaires, j'apporte des précisions à ma question.
En gros, j'essaie ici d'implémenter un système de licence.

Le client contacte le serveur pour savoir s'il peut effectuer certaines actions. Si l'utilisateur n'est pas premium par exemple, il ne pourra pas réaliser certaines actions.

Quand le client contacte le serveur, il lui envoie son user id, et une autre donnée. Le serveur compare l'user id et la donnée avec ce qu'il a en bdd, et renvoie True ou False, c'est tout.

Quand l'utilisateur n'a pas encore d'user id, le serveur lui en fournit un.

C'est tout, il n'y aura rien de plus compliqué sur le serveur.

Alors j'ai bien compris que la requête GET n'est pas indiquée pour ça, je vais la passer en POST.

demandé 23-Mai-2015 par Rififi (482 points)
edité 24-Mai-2015 par Rififi

@boblinux Je ne le juge pas. il le dit lui meme ds un commentaire plus bas:

Cela dit, je ne m'inquiète pas trop pour le man in the middle, le programme n'intéressera pas tant de monde que ça, et si le mec arrive à man-in-the-middler mon système, tant pis.

As tu déjà regarde comment ces 'systèmes se faisaient ?
J'aurai plutôt fait un système en REST.

Les gars c'est assez lourd quand vous donnez votre avis sur la pertinence de vos commentaires, ou sur le fait que vous me jugiez ou pas. Il y en a dans le tas des gens qui downvotent la question parce que le code n'est pas bon. Il me semble que sur SO on ne downvote une question que si elle est mal posée. Je pose une question parce que je ne sais pas, c'est bien le but de IndexError non ? Aussi, quand d'autres me laissent des commentaires cryptiques, laissez moi le temps d'évaluer la solution et de la tester. Je ne suis pas développeur pro. @DoubleNain, @boblinux, sincèrement, à quoi on servi vos commentaires ?

je ne suis pas là pour jouer les pères fouétard alors j'ai masqué les 2 derniers commentaires. Merci de revenir à un situation normale. Et je suis 100% d'accord avec Rififi. On aide et si ca plait pas on s'abstient, d'autres le feront plus volontiers.

Je plussoie @Rififi @Foxmask, et c'était le but de mon 1er com's, à savoir de répondre à la question plutôt que de porter des jugements de valeur

Si on sait/veut/peut on répond, sinon on s'abstient.

Je m'excuse si mon com's a été mal interprété ou si quelqu'un pense que j'ai pris partie pour défendre qui que ce soit =D

Cordialement

1 Réponse

+2 votes

Passer par un objet de session pour stocker l'user id plutôt que de le récupérer depuis un paramètre get (ce qui pourrait aussi empêcher des trucs genre qu'un client se fasse hijacker sa session. Par exemple, un mec qui fait du man in the middle pourrait tout à fait récupérer l'user id passé par le client originel et donc dire "wesh c'est moi").

À savoir que cgi ne propose pas de moyen tout fait pour des sessions, et de manière générale, cgi n'est pas fait pour faire des web apps en python (quand je dis web apps, je parle de site web "interactif avec l'utilisateur").

répondu 24-Mai-2015 par Arza (726 points)

Passer par un objet de session ? C'est possible ça, sachant que le client est un programme local ? Et comment le client contacterait le serveur pour récupérer son user id, ou autre identifiant ?

Qu'entends-tu par client local ?

Par client local j'entends un beau programme bien local. Une belle GUI du genre, plutôt un lecteur de flux RSS. Ce programme contacte le serveur pour savoir s'il peut effectuer certaines actions (j'essaie d'implémenter un système de licence). Si l'utilisateur n'est pas premium par exemple, il ne pourra pas faire ça, ou ci.

Cela dit, je ne m'inquiète pas trop pour le man in the middle, le programme n'intéressera pas tant de monde que ça, et si le mec arrive à man-in-the-middler mon système, tant pis.

Ok donc si je comprends bien tu parles de local au sens "self made". Mais du coup ça influe en rien ce que je dis dans mon message de base, ton client aura juste à passer en cookie l'id de la session par exemple (Ce qui ne résout pas le problème du man in the middle, on peut se faire hijack la session de la même manière).

À titre d'exemple, le module requests fait de la persistance de cookie quand tu utilises un objet Session

D'accord, je comprends bien.

Et avec les sessions, il est facile de contrer le problème de ma question ? (c'est quoi comme type d'attaque ? Un genre de brute force ?).

Ça marche comment ?

C'est une attaque par "flooding" en gros, un gros benet va remplir ta base de donnée, la faire ralentir voir la crasher.
Mais si tu souhaite faire vraiment un système de management de licence, je te conseil fortement de tout faire passer en ssl.
Pourquoi ? he bien, si ton utilisateur s’intéresse un petit peu à la sécurité , il pourra faire retourner tout le temps "true" à ton application ( bon, ce sera son soft à lui qui va intercepter , mais bon, l'idée est la . )
Si tu ne veux pas utiliser de sessions : tu peux par exemple aussi enregistrer l'IP de l'utilisateur, la mettre en clé induplicable: quand tu as trop de fois la même IP qui essaient de s'enregistrer, CRACK, dedans.

...