【问题标题】:generating promotion code using python使用python生成促销代码
【发布时间】:2010-01-21 20:04:12
【问题描述】:

通过使用 python 语言,什么是生成促销代码的聪明/有效的方法。 喜欢用于生成折扣券的特殊号码。 喜欢:1027828-1

谢谢

【问题讨论】:

  • 您的促销代码有什么要求?他们需要特定的位数吗?顺序?伪随机?根据他们生效的日期?
  • 这个已经被问死了,请使用右上角的搜索栏

标签: python security promotions


【解决方案1】:

以下内容不是特别pythonic或特别有效,但可能就足够了:

 import random
 def get_promo_code(num_chars):
     code_chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
     code = ''
     for i in range(0, num_chars):
         slice_start = random.randint(0, len(code_chars) - 1)
         code += code_chars[slice_start: slice_start + 1]
     return code

【讨论】:

  • 如果我没记错的话,使用 random.randint 是基于 WH 伪随机生成器(65535^3 个唯一状态),并在启动时按当前时间播种。攻击者实际上可以尝试将他的随机生成器与用于生成促销代码的生成器同步,前提是他能够从一系列促销代码中获取促销代码,并且能够大致猜测代码是何时生成的。以今天的计算能力,这最终可能成为一种可行的攻击......
  • 好的,我检查了随机码,自从我上次使用它以来它已经改变了。现在,如果操作系统支持,它将默认从操作系统的随机池中播种生成器。
  • 可能想从该列表中删除 0,1,I,O 和 L,因为它们很容易在 promo_code 中被读者混淆,因为没有上下文可以帮助弄清楚字母是什么应该。很好的解决方案,因为这种代码很容易适应这种情况。
【解决方案2】:

1027828-1 非常小。攻击者只需几行代码甚至几天就可以做出约百万次的猜测。

这是使用 python 生成难以预测的数字的好方法,它适用于 linux 和 windows。为了二进制安全,它是 base64 的,这取决于你用它做什么,你可能想要 urllib.urlencode() 但我会避免使用 base10,因为它不存储尽可能多的信息。

import os
import base64

def secure_rand(len=8):
    token=os.urandom(len)
    return base64.b64encode(token)

print(secure_rand())

附带说明,这是生成一个完整的字节,即 base256。 256^8 是 18446744073709551616 应该足够大。

正如人们指出的那样,base64 并不是人类使用的很好的标记。考虑一种替代编码,如 url-safe base64 或 humanhash,因为它们更容易输入。

【讨论】:

  • base64 不适合作为促销代码。它区分大小写,包含标点符号(可能会破坏 url 和论坛帖子),很长,而且很容易让客户拼错。这意味着商店的收入减少。有关如何创建代码的示例,请参见 couponcabin.com。
  • 对于python3.6,可以使用secrets模块。
  • @jspcal 好点,我更关注问题的安全方面,而不是用户体验。也许 humanhash 在这里是一个好方法,尽管这方面可能完全值得自己的问题。
【解决方案3】:

如果您需要 6 位 #,您可以这样做,直到找到唯一值:

import random
print str(random.randint(100000, 999999))

或按顺序进行...

【讨论】:

    【解决方案4】:

    试试这个:

    import random
    
    coupon = open("coupons.txt", "a")
    
    def generate(amount):
    
        for x in range(0, amount):
    
            a = random.randint(1000, 9999)
            a = str(a)
            b = random.randint(1000, 9999)
            b = str(b)
            c = random.randint(1000, 9999)
            c = str(c)
    
            total = ""
            total = str(total)
            total = a + " " + b + " " + c
    
            coupon.write(total)
            coupon.write("\n")
    
    
    amount = int(input("How many coupons do you want to generate: "))
    
    generate(amount)
    
    coupon.close()
    
    print("\nCode's have been generated!")
    

    您可以随意制作优惠券。它们也保存到一个名为 coupons.txt 的 txt 文件中。

    【讨论】:

      【解决方案5】:

      我对此提出了一个我认为相当聪明的答案,但依赖于一些可能不适合您的情况的假设。

      • 生成的代码是纯数字的。
      • 生成的代码在技术上是可变长度的; [10, 20]。

      如果这些对你有用,那么这个解决方案也可以:

      def code(seed = None):
          if (not seed) or (type(seed) != str) or (len(seed) < 10):
              seed = str(uuid.uuid4())[:10]
      
          code = ""
          for character in seed:
              value = str(ord(character))
              code += value
      
          return code[:20]
      

      在此函数中,字符串类型的种子用作代码的基础。对于字符串中的每个字符,将其转换为其 ASCII 表示形式,然后将其附加到代码中。

      默认情况下,该函数产生如下代码:'97534957569756524557',并且可以使用任意种子调用。比如……

      code("pcperini's answer") == '11299112101114105110'
      code(str(time.time())) == '49524956514950505257'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-24
        • 2020-01-21
        • 1970-01-01
        • 2023-03-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多