J'ai un processus de commande pour un panier qui stocke actuellement des données de carte de crédit dans la session pour la récupération une fois que l'utilisateur finalise l'achat. Le processus d'achat est configuré de sorte que l'utilisateur saisisse la carte de crédit, visualise une page de confirmation, puis finalise la commande. Les actions de confirmation et de finalisation sont les deux seules actions qui nécessitent un accès aux données de la carte de crédit et, pour être sûres, toutes les autres actions doivent être rejetées. À moins de faire une réflexion dans un contrôleur de base pour vérifier l'action en cours que l'utilisateur appelle, je ne peux pas imaginer une façon élégante de rejeter les données sur les requêtes non autorisées. De plus, si l'utilisateur ne parvient pas à faire une autre demande après avoir saisi les données, il restera dans la session jusqu'à ce qu'il revienne sur le site Web - chaque fois que cela se produit. Une suggestion m'a été proposée crypter les données dans un champ caché et en s'appuyant sur le ticket SSL pour empêcher la mise en cache du balisage. Cela semble être une approche relativement sûre, mais je n'aime pas beaucoup l'idée de placer les données de la carte de crédit dans un emplacement accessible par l'utilisateur crypté ou non. Le stockage dans la base de données est désactivé car le client ne souhaite pas que les données de carte de crédit soient enregistrées.ASP.NET MVC - Stockage temporaire sécurisé des données de carte de crédit
Quelle est l'approche idéale pour la persistance temporaire de données sensibles comme les informations de carte de crédit pour plus d'une demande de page?
Peut-être que quelqu'un peut me dire si c'est une approche suffisante. J'ai mis mon panier qui est stocké dans la session pour avoir un Guid unique généré chaque fois que l'objet est nouveau et que Guid est utilisé comme une clé pour crypter et décrypter les données de carte de crédit que je suis en série avec le Rijndael algorithm. Les données de la carte cryptée sont ensuite transmises à l'utilisateur dans un champ caché et désérialisées après avoir cliqué sur finalize. Le résultat final est une chaîne beaucoup plus comme ceci:
VREZ%2bWRPsfxhNuOMVUBnWpE%2f0AaX4hPgppO4hHpCvvwt%2fMQu0hxqA%2fCJO%2faOEi%2bX3n9%2fP923mVestb7r8%2bjkSVZDVccd2AJzCr6ak7bbZg8%3d
public static string EncryptQueryString(object queryString, Guid encryptionKey)
{
try
{
byte[] key = Encoding.UTF8.GetBytes(ShortGuid.Encode(encryptionKey).Truncate(16));//must be 16 chars
var rijndael = new RijndaelManaged
{
BlockSize = 128,
IV = key,
KeySize = 128,
Key = key
};
ICryptoTransform transform = rijndael.CreateEncryptor();
using (var ms = new MemoryStream())
{
using (var cs = new CryptoStream(ms, transform, CryptoStreamMode.Write))
{
byte[] buffer = Encoding.UTF8.GetBytes(queryString.ToString());
cs.Write(buffer, 0, buffer.Length);
cs.FlushFinalBlock();
cs.Close();
}
ms.Close();
return HttpUtility.UrlEncode(Convert.ToBase64String(ms.ToArray()));
}
}
catch
{
return null;
}
}
En ce qui concerne votre mise à jour: Crypter les informations de la carte n'est pas l'obstacle - s'assurer que toutes les pièces de la solution sont sécurisées est difficile. Par exemple, où stockez-vous le GUID utilisé comme clé? Est-ce que quelqu'un d'autre a accès au serveur qui génère les GUID? (Cela peut permettre à quelqu'un de deviner les GUID). Utilisez-vous le même GUID par session ou par durée de vie de l'application? – meklarian
En outre, le bloc catch {} est un peu effrayant. Ne serait-il pas mieux de retourner une chaîne vide là-bas? – meklarian
Bon point sur le ToString() meklarian. Je l'ai copié d'ailleurs sans regarder de trop près. Le Guid est généré une fois par utilisateur par session, donc obtenir un Guid d'un utilisateur serait assez difficile, je pense. –