是否存在用于存储表格相关信息服务器端的金字塔包(避免镜像隐藏字段)?

时间:2014-12-04 13:33:15

标签: python forms pyramid

背景:我目前正在金字塔中创建一个项目。它使用烧杯会话和SQLAlchemy作为DB-backend。

某些表单包含隐藏字段中的信息,其唯一目的是将其提供给处理帖子的视图,用户永远不会看到它们,也不需要。一个例子:

用户可以编辑数据库实体。由于可以编辑实体的所有数据字段(包括名称),因此实体的ID将放在隐藏字段中,因此视图可以查询对象并对其进行更新。这种方法有一些缺陷:

  1. 我的实体的ID与我的用户无关。他们甚至不应该意识到这一点。
  2. 客户端重新提交的数据可以修改。有人可能会尝试通过伪造不同的ID来访问其他实体。
  3. 在其他情况下,可能会有更多的镜像数据而不仅仅是一个id(也许是返回到url?可能更多地方在某处)。使用隐藏字段会将数据传输到客户端并且不必要地(带宽)返回,并且需要对其进行验证。
  4. 不必要地通过不安全的通道(客户端)传输数据是错误的。解决方案并不复杂:将该信息存储在服务器上(在会话或数据库中),并使用密钥(form-id?)访问它,类似于具有session-id的会话。将完全匿名的令牌放入隐藏的字段中。这将是表单中唯一需要的隐藏字段。其他所有内容都将存储在服务器上,并从响应后请求的视图中恢复(好吧 - 我仍然会在那里有我的CSRF令牌,因为它在我的所有帖子请求中)。这也可以让表单暂停,因为你可以让form-id在几个小时后过期。

    如果我没记错的话,drupals默认会这样提供。我真的不希望金字塔本身支持这个,但是想象必须有一个包这样做,使用金字塔提供的会话对象,仍然找不到任何。我敢肯定我自己可以写一些可用的东西,但为什么会这样做呢?

    有人知道这样的套餐吗?

1 个答案:

答案 0 :(得分:1)

如果我了解您,您希望在不使用表单上的隐藏字段的情况下更新模型。 这是怎么做的 使用pyramid_simpleform和Urldispatch

@view_config(route_name="my_route",renderer="myrenderer.mako")
def update(request):
    id = request.matchdict['id']

    #assuming you have an SQLalchemy model called MyModel which you imported
    #your model has a method that gets by id
    toupdate = MyModel.get_by_id(id)
    form = Form(request, schema=MyModelSchema,obj=toupdate)
    if not toupdate:
        #you can flash a message here and redirect wherever you want
        return HTTPFound(location=request.route_url('home'))
    if 'submit' in request.POST and form.validate():
        form.bind(toupdate)
        DBSession.add(toupdate)
        DBSession.flush()
        #redirect
        return HTTPFound(location=request.route_url('home'))
    return dict(form=FormRenderer(form))

在视图中,只需使用表单对象绘制没有任何隐藏字段的表单字段。

#configure your route as below
config.add_route('my_route','/myroute/{id}/edit')

更新

使用webhelpers tool。跟随下面(使用Mako模板)

<%
from webhelpers.html.tools import js_obfuscate
%>

js_obfuscate("<input type='hidden' name='check' value='valid' />")

混淆javascript标签中的数据