web-dev-qa-db-fra.com

Comment envoyer sécurisé AJAX demandes avec PHP et jQuery

Le problème

Cela fait donc un moment que je teste différentes approches AJAX pour envoyer des données à un serveur qui seront traitées et stockées dans une base de données MySQL. 

La page consultée par la demande AJAX api.php utilise les instructions préparées par PDO de PHP pour enregistrer les données. Les injections MySQL ne posent donc pas vraiment de problème et les mots de passe ou les données à chiffrer sont également gérés par api.php qui n'est pas t ce que je demande ici. Ma question concerne davantage la sécurité des données lors de leur transfert du client au serveur.

Les approches

J'ai actuellement (pour l'exemple de connexion que j'ai inclus ci-dessous):

  • SSL Cert/HTTPS s'exécutant sur le domaine.
  • Certaines requêtes AJAX (évidemment pas dans cet exemple de demande de connexion car il n'y a pas de session) ne fonctionneront que si la session PHP est valide sur le site (utilisée à la fois avec login.php et api.php dans cet exemple). .
  • Limitation de la vitesse sur api.php lors de l'accès aux fonctions.
  • Les instructions PHP PDO préparées lors de l'interaction avec la base de données dans api.php.
  • Crypte les données sensibles à l'intérieur de api.php (non pertinent pour la question).

Questions

Enfin, mes questions sont:

  1. Cette approche consistant à utiliser des requêtes HTTP asynchrones (Ajax) est-elle suffisamment sûre pour être utilisée plutôt que de simplement envoyer des données à une page PHP et les rediriger ultérieurement? (Comme cela améliore l'expérience de l'utilisateur).
  2. Comment puis-je vérifier que les données envoyées par mon utilisateur n'ont pas été falsifiées?
  3. Suis-je assez en mesure de protéger les données de mon utilisateur? Sinon, que puis-je faire d'autre?

L'exemple

Je comprends que tout le monde a des approches différentes pour gérer les données de leur site et les transporter. Je comprends également que, quoi que vous fassiez, vous ne pouvez jamais être protégé à 100%, car il peut y avoir des vulnérabilités et des failles autour de votre système que vous ne pouvez pas prendre en compte. Je recherche des retours/améliorations sur mon approche générale pour l'envoi de données en toute sécurité plutôt que des critiques du code spécifique ci-dessous, car il ne s'agit que d'un exemple. Mais toute réponse constructive est la bienvenue. Merci d'avoir pris le temps de lire/répondre.

function loginUser() {
    var process = "loginUser";
    var data = $("form").serializeArray();
    data[1].value = SHA512(data[1].value); // sha then encrypt on api.php page 
    data = JSON.stringify(data);

    $("#loginButton").html('<i class="fa fa-spinner fa-Pulse fa-lg fa-fw"></i> Login');
    $.ajax({
        type: "POST",
        url: "api.php",
        data: {"process": process, "data": data},
        success: function(data) {
            if (data.response.state == "success") {
                // if api.php returns success, redirect to homepage
            } else {
                // if api.php returns failure, display error
            }  
        },
        error: function(jqXHR, textStatus, errorThrown, data) {
            // error handling
        },
        dataType: "json"
    });
}
24
LukeXF

Réponse courte: vous ne pouvez pas protéger votre côté client.

Longue réponse:

  • Utiliser AJAX est aussi sûr que de poster des données avec, par exemple, un formulaire.
  • L'utilisation de HTTPS empêche l'homme en son milieu de voir vos données utilisateur. Les données réelles envoyées par l'utilisateur sont donc protégées.

Vous ne pouvez rien faire pour que le navigateur prouve qu'il s'agit bien de votre code javascript qui s'exécute côté client . Ensuite, l'action évidente à entreprendre est la plus simple: NEVER TRUST USER INPUT.

Cela signifie, comme vous avez commencé à le faire, sécuriser votre côté serveur en utilisant session, limitation de débit, validation des données, fail2ban (bannissement de l'adresse IP d'un client après un certain nombre d'échecs), surveillance des journaux ...

1
blue112

le meilleur moyen est toujours de sécuriser le côté serveur et si j’étais un utilisateur connecté au site, je serais également en mesure de vérifier le jeton CSRF sur ma balise META et de forger un script sur le serveur. Donc, le pari sûr est la validation côté serveur

0