2010-11-24 26 views
1

J'ai ce petit système de chariots PHP/MySQL que les utilisateurs ajoutent, achètent et payent.
Ces produits ont tous des ID sur eux de sorte que lorsque l'utilisateur vérifie,
je peux obtenir les attributs de ce produit (prix, poids, identifiant de compte du fournisseur, etc.).Comment garantir que les ID de produits de la base de données ne sont pas falsifiés

En ce moment, il serait vraiment facile pour quelqu'un d'ouvrir Firebug,
deviner un autre ID de produit, le changer, et la caisse.

Quelle serait la meilleure façon d'éviter cela?
Le magasin et le système de caisse sont sur deux domaines différents si cela est important.
Je pourrais utiliser quelque chose comme un jeton unique
mais comment cela fonctionnerait-il si plusieurs clients pouvaient utiliser le chariot en même temps?

EDIT: Wow, tapé ceci trop vite, a omis quelques détails importants. Le panier est actuellement représenté en tant que JSON qui est stocké dans une session PHP. Tous les produits ont un account_id qui les associe au compte d'un fournisseur. Le problème se produirait si un utilisateur modifiait l'identifiant du produit et obtenait un produit sous le compte d'un autre fournisseur (achetant essentiellement le produit d'une autre société auprès du magasin d'une autre société) ce qui ne serait pas souhaitable. Merci pour les réponses à ce jour.

+1

Comment le contenu du panier parvient-il à la caisse? – Gumbo

+1

Pourquoi est-ce un problème si un utilisateur peut changer l'ID - ce serait comme ajouter un élément différent au panier, n'est-ce pas? Vous stockez et calculez les prix et les quantités en interne? –

Répondre

3

Utilisez une session côté serveur pour stocker les détails du panier.

Chaque session reçoit un identifiant unique, stocké dans un cookie. Tous les détails (éléments sélectionnés, montant, etc.) sont liés à cette sessionId. Par définition, vous ne voulez pas que des clients différents utilisent le même panier. Au lieu de cela, chaque client utilise sa propre copie séparée du panier. Si vous devez 'partager' l'élément sessionId avec un service externe, calculez plutôt une clé unique distincte et partagez cette clé avec le service tiers (= service de caisse dans votre cas).
Ceci garantit que vous pouvez identifier de manière unique votre client dans les communications avec la tierce partie, sans que le tiers ne sache quoi que ce soit sur la façon dont vous identifiez ou communiquez avec votre client de votre côté de la clôture. (la chose importante à retenir est, un sessionId est un secret partagé, personne d'autre ne devrait le savoir).

0

Une façon de faire est d'utiliser un hachage. Lorsqu'ils sélectionnent un produit et que le formulaire est rendu, prenez un hash de l'identifiant du produit et stockez-le dans un champ caché à côté de l'identifiant du produit. Lorsque la publication "checkout" se produit, prenez un hash de l'ID de produit qui est publié et comparez-le à celui qui a été envoyé dans le formulaire. Si elles ne correspondent pas, l'identifiant du produit a été modifié. Je ne suis pas familier avec PHP, donc je ne peux pas fournir un exemple de code, mais j'ai utilisé cette approche dans ASP.NET et ça fonctionne.

Espérons que cela a du sens!

+0

Un hachage de l'ID de produit peut également être altéré, mais utiliser un hachage de productID + une autre valeur spécifique au produit à laquelle l'utilisateur n'a pas accès, mais le back-end le fait, et vous avez ensuite votre vérification –

+0

Oui, vous pouvez altérer le hachage, mais à moins que l'utilisateur ne puisse répliquer votre algorithme de hachage, la clé et le sel ne correspondraient toujours pas lorsque vous ramèneriez le hachage sur le post au serveur, et vous pourriez toujours dire que quelqu'un avait altéré continué. –

-1

Je pense que ce que vous avez à faire est de crypter/décrypter votre identifiant de produit et de l'utiliser. vous pouvez utiliser base64_encode() et base64_decode()

Espérons que cela aidera

+0

-1 encrypt! = Encoder. Le codage en base64 ne modifie que la façon dont les données «semblent», mais il s'agit toujours d'informations lisibles publiquement. Et puis, le cryptage n'est pas la solution à ce problème. – Jacco

1

Si vous avez accès au système de chariot, la manière correcte serait de dupliquer la recherche d'ID et les calculs de coûts avant d'exécuter le paiement.De cette façon, si quelqu'un change d'une boîte de bonbons de 1,99 $ à un téléviseur HD de 1999,99 $, ils seront facturés pour la télévision.

Si vous n'avez pas accès à votre système de chariot, ou si vous ne pouvez pas lui dire quels sont les produits et leur coût. Obtenez un nouveau système de panier.

En note: Vous ne devez JAMAIS faire confiance aux données provenant de l'utilisateur. Il ne devrait pas être nécessaire de construire en faisant confiance à l'utilisateur. Acceptez simplement les identifiants et exécutez tous les nombres sur le serveur.

0

Et quelle est la menace? Si le client n'a que des ID de produit, s'il change d'ID, il achètera un produit différent, et c'est tout. Ou vos produits ne sont pas disponibles pour tous? Si ce n'est pas le cas, vous devez utiliser des identifiants aléatoires afin qu'ils ne puissent pas être facilement devinés.