2009-07-31 7 views
2

Nous créons un site Web conçu pour gérer les paiements en ligne. Nous nous demandions, est-il correct de passer un ordre/Transaction Id à travers la chaîne de requête tout en étant en train de faire un paiement? Nous préférerions ne pas stocker cet identifiant dans une variable de session à cause du surcoût du serveur, donc nous pensions que le stocker dans la chaîne de requête conviendrait.ecommerce: Est-il possible de transmettre un identifiant de commande via une chaîne de requête?

Des commentaires à ce sujet? Particulièrement du point de vue de la sécurité.

Merci beaucoup.

+0

vous pouvez appeler quelque chose clé autre que orderid, sortOrder ou cheeseQuality peut-être. Les pirates ne sauraient jamais où chercher! :) – Jason

Répondre

0

vous devriez capturer la commande dans votre db. Il est déconseillé de le transmettre dans une chaîne de requête.

2

passage infomation sensibles (par exemple numéros d'ordre) dans une chaîne de requête est généralement une mauvaise idée pour plusieurs raisons:

1) L'URL GET est transmis en clair, ce qui signifie quoi que ce soit entre le client et le serveur peut lire et capturer le numéro de commande de la demande. Si votre serveur s'appuie sur le numéro de commande pour faire quelque chose d'important, alors il s'agit d'une invitation ouverte aux abus. 2) La plupart des proxies et des journaux d'accès enregistrent les adresses Web, y compris la requête GET, ce qui signifie que le numéro de commande du client sera stocké dans les journaux d'accès sur un nombre illimité de machines (y compris votre serveur). Vous êtes probablement incapable de contrôler ce comportement, qui est très mauvais (TM). Pour sécuriser votre application, vous devez stocker le numéro de commande réel dans une session sur le serveur et le transmettre à l'utilisateur dans un cookie (de préférence crypté). Passer quelque chose d'important en texte clair est sujette à des abus et ne devrait pas être tenté pour quelque chose d'important.

4

Essayer de rendre votre service apatride est un objectif valable. Le fait d'avoir des ID de commande dans les chaînes de requête est "sûr" mais cela dépend de beaucoup de choses. Les principales choses que vous pourriez avoir besoin à vous soucier sont:

  • utilisateurs à modifier leur numéro de commande
  • ID d'ordre « fuite » à des tiers
  • ID d'ordre étant prédits par des tiers

Je dis "peut" parce que les choses dont vous avez réellement besoin de vous inquiéter dépendent des détails de votre système. Quelles sont les conséquences de ces choses qui se passent? Selon les détails de votre système, ils peuvent être inoffensifs ou très graves.

Le problème le plus simple à résoudre est le problème de "fuite". Utilisez HTTPS. Cela évite non seulement les «indiscrétions», mais prévient également les fuites dues aux journaux proxy et aux en-têtes Referer. Le problème de prédiction peut être résolu par cryptage (oui, en plus de HTTPS - nous ne voulons pas que l'utilisateur final déchiffre cela) l'ID de commande qui apparaît dans la chaîne de requête. De cette façon, quelqu'un ne peut pas simplement incrémenter/décrémenter la chaîne de requête pour trouver un autre identifiant de commande. (Cela empêche également les utilisateurs de déterminer facilement le nombre total de commandes dans votre système, ce qui peut être souhaitable.)

Vous pouvez résoudre le problème de l'utilisateur qui modifie son ID de commande en enregistrant à qui appartient une ID de commande lorsque il est d'abord affecté, ou en incluant une signature sécurisée de la paire (user, orderid) en tant que paramètre de requête. Ensuite, un utilisateur peut seulement changer son identifiant de commande pour celui qu'il possède déjà, ce qui l'empêche au moins de se plier aux ordres de quelqu'un d'autre.Si vous faites cela, vous n'avez probablement pas besoin de crypter les ID de commande, sauf si vous voulez empêcher les utilisateurs de savoir combien de commandes existent.

Voici quelques idées. Lesquels de ceux-ci s'appliquent à votre système dépendent des facteurs que j'ai mentionnés plus tôt.

1

Le cryptage de l'ID de commande ne pose aucun problème - vous pouvez également envisager de hacher l'ID de commande d'origine et de le transmettre ainsi que le jeton haché dans la chaîne de requête. Je ne vois pas cela comme un risque pour la sécurité car je ne considérerais pas l'identifiant de la commande comme une donnée sensible. Tout ce que vous devez faire est de vous assurer que l'utilisateur ne l'a pas manipulé de quelque façon que ce soit.

http://www.duncangunn.me.uk/dasblog/2009/08/01/VerifyingTheIntegrityOfQueryStringParameters.aspx

Questions connexes