【问题标题】:Adding "Promo Code" functionality to my ASP.NET C# website将“促销代码”功能添加到我的 ASP.NET C# 网站
【发布时间】:2013-10-28 10:27:53
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 除非代码真的很长,否则散列不会为您带来任何好处。

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


【解决方案1】:

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

如果促销的价值相当低,例如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. (等)

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

【讨论】:

  • 感谢您的深入回答。赏金奖励:)
【解决方案2】:

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

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% 的优惠券吗? ;)

【讨论】:

    【解决方案3】:

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

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

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

    Simple insecure two-way "obfuscation" for C#

    Really simple encryption with C# and SymmetricAlgorithm

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-15
      • 2016-04-17
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多