首页 > 解决方案 > 混淆之后可以在网址中使用的字符串

问题描述

我在 Flask 中有一个小型简单服务器,我希望能够使用以下路由路由到用户页面:

@app.route("/something/<string:username>", methods=["GET"])

当它是一个明确的用户名时,这不是问题,但是我想添加简单的混淆,以便在给定一个密钥时产生一个仍然可以在网址中使用的新字符串。

我尝试了在 Stack Overflow 中找到的几种方法,但输出字符串存在各种问题,例如非 ASCII 字符,或者在路由中给我带来问题的字符(例如让/Flask 感到困惑的字符)。

理想情况下,我希望有两个功能,obfuscate(key, string)所以deobfuscate(key, string)我可以像这样使用:

@app.route("/something/<string:username>", methods=["GET"])
def user_page(username):
    # username is an obfuscated string
    clear_username = deobfuscate(MY_KEY, username)
    return flask.make_response("Hi {}".format(clear_username), 200)
...
...
def create_user(username):
    # username is a clear string
    save_to_database(username)
    return obfuscate(MY_KEY, username)

总而言之,混淆需要简单但足够好,以至于您无法通过查看 URL 来弄清楚它,并且有两种方式,以便我可以弄清楚原始字符串是什么并将其打印出来。

标签: python-2.7obfuscation

解决方案


我最终用 itsdangerous 解决了这个问题,这是 Flask 的一个依赖项,所以无论如何我在我的服务器上都有它。

这里的示例所示:

>>> from itsdangerous import URLSafeSerializer
>>> s = URLSafeSerializer('secret-key')
>>> s.dumps([1, 2, 3, 4])
'WzEsMiwzLDRd.wSPHqC0gR7VUqivlSukJ0IeTDgo'
>>> s.loads('WzEsMiwzLDRd.wSPHqC0gR7VUqivlSukJ0IeTDgo')
[1, 2, 3, 4]

正如文档字符串所说,可以肯定地假设我不会有任何惊喜:

类似:class:Serializer但转储和加载到由字母表的大小写字符以及_,-和组成的 URL 安全字符串中.


推荐阅读