【问题标题】:How to Encrypt pk from django url without using any package?如何在不使用任何包的情况下从 django url 加密 pk?
【发布时间】:2017-04-21 08:11:55
【问题描述】:

如何在不使用任何包的情况下从 django url 加密和解密 pk 基本上我有一个类似的网址

example.com/update/1

其中 pk=1

我想像 pk 1 = 345345435cgsfd2asdfaas 一样加密 pk

【问题讨论】:

  • ok 尝试构建自己的函数
  • 如果您不想要数字 ID,您可以使用 UUIDFields 作为模型主键。
  • 如果您不想公开 pk,也可以在 url 中使用模型的另一个字段(如果 unique=True)
  • 这不是一个解决方案,我不确定它是否在这里相关,但也许你应该重新考虑你在做什么security.stackexchange.com/a/762/71688

标签: python django encryption django-urls


【解决方案1】:

我认为没有 inbuld 方法,但使用TimestampSigner,您可以执行以下操作:

使用 TimestampSigner,您可以加密您的 PK,然后在需要原始字符串时解密。

>>> from datetime import timedelta
>>> from django.core.signing import TimestampSigner
>>> signer = TimestampSigner()
>>> value = signer.sign(str(pk)) # encrypt the PK.
>>> value
'1:1NMg5H:oPVuCqlJWmChm1rA2lyTUtelC-c'
>>> value = value.replace(pk,"") # doing this because, it append the original primary key + encrypted string.
>>> value # use this PK to show in the URL.
'1NMg5H:oPVuCqlJWmChm1rA2lyTUtelC-c'
>>> repack = "{}:{}".format(pk,value) # When you want back the original PK, add the PK + encrypted string.
>>>repack
'1:1NMg5H:oPVuCqlJWmChm1rA2lyTUtelC-c'
>>> signer.unsign(repack) # decrypt the PK.
'1'

希望这对你有帮助。

【讨论】:

  • 但是我怎样才能把 pk 解密回来
  • 我已经更新了代码,你可以使用.unsign()方法来完成。详情在这里:docs.djangoproject.com/en/1.10/topics/signing/…
  • 但是如何在 urls.py 中将加密的 pk 传递给我的 url
  • urls.py 有什么问题?你在添加urlpatterns 吗?例如:urlpatterns = [ # ex: /polls/ url(r'^$', views.index, name='index'), # ex: /polls/5/ url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'), # ex: /polls/5/results/ url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'), # ex: /polls/5/vote/ url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'), ]
  • url(r'^Update/(?P\d+)$', views.Update, name='Update') -- 我的 url 是 localhost/update/1 我想要 localhost /update/Sd3234%$34232 pk 必须但加密
【解决方案2】:

如果您不想将pk 暴露给网址,那么您可以在加密时使用signing.dumps,在解密时使用signing.loads。使用 TimestampSigner 对序列化对象进行签名。

>>> from django.core import signing
>>> value = signing.dumps({"pk": "25"})
>>> value
'eyJwayI6IjI1In0:1g9Q4d:RJRYtpklLqaa3ey9c4d4sI0DKMc'
>>> signing.loads(value)
{'pk': '25'}
>>> signing.loads(value,max_age=10)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/avinash/.virtualenvs/mapd/lib/python3.6/site-packages/django/core/signing.py", line 140, in loads
    base64d = force_bytes(TimestampSigner(key, salt=salt).unsign(s, max_age=max_age))
  File "/home/avinash/.virtualenvs/mapd/lib/python3.6/site-packages/django/core/signing.py", line 209, in unsign
    'Signature age %s > %s seconds' % (age, max_age))
django.core.signing.SignatureExpired: Signature age 25.847949981689453 > 10 seconds
>>> 

【讨论】:

    【解决方案3】:
    $(function() {
      // Replace each URL
      $(".exampleclass").each(function(index) { 
        // Get current URL
        var url = $(this).attr('href'); 
        // Encode URL
        var encodedUrl = encodeURIComponent(url);
        // Replace
        $(this).attr("href", encodedUrl); 
      });
    });
    

    这是原始网址:

    http://10.91.161.54:8181/validate_/listActivi/314/
    

    这是带有替换的 URL:

    http://10.91.161.54:8181/validate_/%2Fvalidate_%2FlistActivi%2F314%2F%20
    

    【讨论】:

    • 如果我错了,请纠正我,但这不是坐在可能停用 javascript 的客户端上吗?
    • 回答请求 Django,而不是 jQuery
    猜你喜欢
    • 1970-01-01
    • 2018-05-18
    • 2013-07-16
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 2013-11-21
    相关资源
    最近更新 更多