在我的ASP.NET C#网站上添加“促销代码”功能

时间:2013-10-19 17:32:34

标签: c# asp.net encryption hash promotion-code

我的想法是,我会有一个接受用户促销代码的页面。当用户单击“提交”时,代码将调用数据库以确保促销代码确实有效。我打算在我的数据库中有一个“PromoCode”表,其中包含一个可用的促销代码列表和一个名为“HasBeenClaimed”的位变量。我不是那么熟悉加密/等等。但我想我会想要在这个表中存储实际的明文促销代码,而是像加密/散列/等。它的版本。因此,如果某人恶意获取对该表数据的访问权限,则他们无法对此促销代码的哈希版本执行任何操作。

无论如何,在功能上,用户提交他们的促销代码并且代码执行类似于获取其散列值并将其与数据库中的内容进行比较。如果它与数据库中的记录匹配且“HasBeenClaimed”为false,则继续使用促销。

我说纯粹的伪代码,我的术语可能不正确。但我认为你得到了我想要的基本想法。

我的促销活动价值不高 - 他们是“获得前两个月的一半”(相当于每月25美元,两个月减免)。仅供参考,我创建了一个PayPal按钮,该按钮反映了在促销代码确实有效的情况下代码将指向的网页上使用的促销。

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

3 个答案:

答案 0 :(得分: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. 如果有人获得对其存储位置的访问权限,则促销代码以一种保护它的方式存储。将它存储在某种散列或加密(但加密,你有一个新的问题,保持加密密钥安全)形式可能是最好的选择。你甚至可以以某种方式将其分解并将其中的一部分存储在几个不同的地方。
  3. 请记住,在这种情况下,您的同事(和您)是主要的黑客候选人。即使他们没有资格申请,他们也可以窃取代码并将其交给他们母亲一方(或类似)的第二代堂兄。

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

    另外,请确保用户输入促销代码的页面使用SSL以防止某人在转移时拦截它。


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

    Visit us on [popular social network] to get a free baseball cap with your next purchase这样的宣传片并不罕见。在这种情况下,允许每个用户使用相同的促销代码是有意义的,即使有人可能在没有实际访问的情况下接触代码的风险。

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

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

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


    从技术上讲,选择很多。这取决于我们正在谈论的Web应用程序类型。我首先想弄清楚支持哪种不同的促销活动。候选:

    1. 购买时的额外折扣
    2. 免费额外促销产品
    3. 下订单免运费
    4. 访问本网站其他无法访问的部分2个月
    5. (等)
    6. 然后我将围绕我想要支持的促销类型构建框架(数据库表,业务逻辑等)。就个人而言,我不会为每个促销制作单独的页面。我会尝试尽可能地将促销整合到网站的现有流程中。

答案 1 :(得分: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虽然在数学上是牢不可破的,但可以使用" rainbow tables"来规避。黑客创建一个程序,通过SHA1哈希器运行字典中的每个单词(然后是一些单词),然后对他从你那里偷走的哈希进行反向查找。防止这种情况的方法是使用"盐" - 在每个促销代码被散列之前,在每个促销代码的开头(或结尾)添加一个公共的随机字符串,完全改变最终结果。您将盐以纯文本形式存储在数据库中。但你真的需要担心有人偷你的优惠券20%吗? ;)

答案 2 :(得分:0)

当您在数据库中保存促销代码时,您可以使用简单加密。

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

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

  

Simple insecure two-way "obfuscation" for C#

     

Really simple encryption with C# and SymmetricAlgorithm