4

这个想法是我将有一个页面将接受用户的促销代码。当用户点击“提交”时,代码将调用数据库以确保促销代码确实有效。我计划在我的数据库中有一个“促销代码”表,其中包含可用促销代码的列表和一个名为“HasBeenClaimed”之类的变量。我对加密/等不是很熟悉。但我想我不想在这个表中存储实际的明文促销代码,而是像加密/散列/等一样。它的版本。因此,如果有人恶意获取表数据的访问权限,他们将无法使用这个散列版本的促销代码做任何事情。

无论如何,从功能上讲,用户提交他们的促销代码,代码执行类似获取其哈希值并将其与数据库中的内容进行比较的操作。如果它与数据库中的记录匹配并且“HasBeenClaimed”是false,他们会继续促销。

我说的是纯伪代码,我的术语可能不正确。但我想你明白我想要什么的基本概念。

我的促销价值不高——它们是“前两个月减半”(相当于两个月每月减 25 美元)。仅供参考,我创建了一个 PayPal 按钮,该按钮反映了此促销活动,如果促销代码确实有效,则代码将在该网页上使用该促销代码。

问题我不知道从哪里开始,也不知道“促销代码”的常见最佳实践。请就有关在现有 ASP.NET 网站中实现促销代码功能的常见最佳实践提供建议 - 任何建议都会很棒。

4

3 回答 3

3

这个问题的答案很大程度上取决于您将提供什么样的促销活动。

如果促销的价值相当低,Get 1 dollar discount on you next purchase of 5 dollars or more那么我认为保护数据库中的促销代码没有多大意义。在这种情况下,将促销代码丢失给黑客不会是最严重的灾难。相反,黑客获得对数据库的访问权这一事实将比一些被盗的促销代码更令人担忧。

另一方面,如果促销价值很高,Be one of the three out of 2 million users that wins a new car那么保护促销代码就很有意义。在这种情况下,您必须确保:

  1. 促销代码本身足够长且随机(使其足够随机可能非常棘手),因此几乎不可能猜到它。
  2. 促销代码的存储方式可以在有人访问其存储位置时对其进行保护。以某种散列或加密的形式存储它(但使用加密你有一个新问题,保持加密密钥的安全)可能是最好的选择。您甚至可以以某种方式将其分解,并将其中的一部分存储在几个不同的地方。

请记住,在这种情况下,您的同事(和您)是主要的黑客候选人。即使他们没有资格申请,他们也可以窃取代码并将其交给他们母亲身边的第二个堂兄(或类似的人)。

此外,您站点主机的管理员需要避免从他们的存储表单中找出代码是什么。

此外,请确保用户输入促销代码的页面使用 SSL,以防止有人在传输过程中拦截它。


更一般地说,您需要确定促销代码是一次性使用还是多个人可以使用相同的代码。

有类似的促销活动并不少见Visit us on [popular social network] to get a free baseball cap with your next purchase。在这种情况下,允许每个用户使用相同的促销代码是有意义的,即使存在有人可能会在没有实际访问的情况下获得代码的风险。

您当然可以同时支持这两种类型(单次/多次使用)。

您还需要弄清楚促销代码是如何生成和分发的。您是否在电子邮件活动中发送它们?你会在当地报纸上打印它们吗?您是要打印纸质优惠券并将其分发出去还是邮寄给人们?用户必须破解 20 个验证码才能获得代码吗?

您需要决定谁有资格使用促销代码。它必须是注册用户还是任何人都可以使用它?未注册用户如何使用它?


从技术上讲,选择很多。这取决于我们谈论的是哪种网络应用程序。我会首先尝试弄清楚要支持哪种不同的促销活动。候选人:

  1. 购买额外折扣
  2. 免费附加促销产品
  3. 下一个订单免运费
  4. 2 个月访问网站其他无法访问的部分
  5. (ETC)

然后我会围绕我想要支持的促销类型构建框架(数据库表、业务逻辑等)。就我个人而言,我不会为每个促销活动单独制作页面。我会尝试尽可能地将促销整合到网站的现有流程中。

于 2013-10-25T16:07:56.893 回答
1

这是您在代码隐藏中运行的简单哈希方法:

string ClearTextPromoCode = TextBox1.Text;
byte[] ClearTextByteArray = System.Text.Encoding.UTF8.GetBytes(ClearTextPromoCode);

System.Security.Cryptography.SHA1 SHA1Encryptor = new System.Security.Cryptography.SHA1CryptoServiceProvider();
byte[] EncryptedByteArray = SHA1Encryptor.ComputeHash(ClearTextByteArray);
string EncryptedPromoCode = System.Text.Encoding.UTF8.GetString(EncryptedByteArray);

SHA1 快速、单向、牢不可破,非常适合这种用途。您不会将纯文本代码添加到数据库中,而是通过这种加密方法运行它们,然后将它们添加到数据库中。当用户输入促销代码时,您通过相同的加密方法运行他们的文本,然后使用加密字符串执行数据库查询。

这样做的目的是,如果您的数据库中的散列值被盗,小偷不会有任何好处 - 他不能简单地在您的网站上输入这些字符串 - 它们将再次通过加密运行,并且与您数据库中的任何内容都不匹配。

似乎您希望促销代码仅供一次性使用。大多数结帐系统允许您在最终购买之前验证您的促销代码。我建议您允许用户确保他们的促销代码有效,并且仅HasBeenClaimed在销售完成后标记数据库列。

警告:您应该知道,SHA1 虽然在数学上是牢不可破的,但可以使用“彩虹表”来规避。黑客创建了一个程序,该程序通过 SHA1 散列器运行字典中的每个单词(然后是一些单词),然后对他从你那里窃取的散列进行反向查找。防止这种情况的方法是使用“盐”——在每个促销代码的开头(或结尾)添加一个公共的随机字符串,然后再对其进行哈希处理,从而完全改变最终结果。您将盐以纯文本形式存储在数据库中。但是你真的需要担心有人偷了你 20% 的优惠券吗?;)

于 2013-10-25T02:10:09.703 回答
0

您可以为此使用简单的加密,将促销代码保存在数据库中时对其进行加密。

然后当用户输入promocode时,用相同的key加密并在数据库中进行比较,如果匹配到数据库中的key,则接受promocode,并将bit字段标记为true表示已使用。

一些简单的加密c#代码:

C# 的简单不安全的双向“混淆”

使用 C# 和 SymmetricAlgorithm 进行真正简单的加密

于 2013-10-23T20:11:10.780 回答