ID 加密
Hash ID's
Masonite 散列 是一个非常有用的功能,可以防止您的ID暴露在应用程序中。
多数情况下,您需要将数据库主键公开给前端。例如,在更新记录时,您可能需要将主键值传递给类似“/users/10/settings”的 URL。
通常,对于尝试轻易更改您数据的黑客,您希望向其隐藏这些键值。
使用 Masonite 散列功能,您可以将 10
之类的值更改为 l9avmeG
,并防止那些敏感的整数值暴露。
设置
Masonite 散列功能在值到达控制器之前自动对其进行解码,为此,您需要指定一个中间件来帮助解码值,以及作为模板中注册助手的提供者。
您可以轻松的添加中间件:
from masonite.essentials.middleware import HashIDMiddleware
# ..
route_middleware = {
"web": [
HashIDMiddleware,
SessionMiddleware,
EncryptCookies,
VerifyCsrfToken,
],
}
您应该将 Hash ID 中间件放在中间件堆栈的顶部,以便在到达堆栈中的其他中间件之前正确解码请求。
提供者应该还要添加:
from masonite.providers import HashIDProvider
PROVIDERS = [
# ..
HashIDProvider,
]
这将注册一个模板助手和一些其他有用的功能。
Helper
您可以直接使用助手轻松地对整数进行编码或解码:
from masonite.essentials.helpers import hashid
def show(self):
hashid(10) #== l9avmeG
hashid('l9avmeG', decode=True) #== 10
Templates
在您的模板中,您可以使用 hashid
模板助手:
<!-- user.id == 10 -->
<input type="hidden" name="user_id" value="{{ hashid(user.id) }}"
当提交到后端时,用户ID的值将是正常整数值:
def store(self, request: Request):
request.input("user_id") #== 10
路由参数
使用模板助手时,您还可以将 hashid 功能用于请求参数:
如果你有类似这样的路由:
Route.get('/user/@user_id/updates', 'Controller@method')
<!-- user.id == 10 -->
<form action="/user/{{ user.id }}/update" method="POST">
</form>
在您的控制器内部,您可以获得未散列化的请求参数:
def store(self, request: Request):
request.param('user_id') #== 10
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。