与形式有关的问题

时间:2013-01-30 12:27:01

标签: lift

我是Lift的新手,我正在考虑是否应该更仔细地研究它,并开始将它作为我开发Web的主要平台。然而,我很少有“恐惧”,我很乐意首先被驱散。

安全

假设我有以下生成表单的代码段。有几个字段,用户只能编辑其中一些字段。

def form(in : NodeSeq): NodeSeq = {
  val data = Data.get(...)
  <lift:children>
    Element 1: { textIf(data.el1, data.el1(_), isEditable("el1")) }<br />
    Element 2: { textIf(data.el2, data.el2(_), isEditable("el2")) }<br />
    Element 3: { textIf(data.el3, data.el3(_), isEditable("el3")) }<br />
    { button("Save", () => data.save) }
  </lift:children>
}

def textIf(label: String, handler: String => Any, editable: Boolean): NodeSeq =
  if (editable) text(label, handler) else Text(label)

我是否正确,即使分配给该字段的isEditable方法评估为false,也没有允许用户更改某个字段值的漏洞?

性能

在Lift中进行表单处理的最佳方法是什么?我非常喜欢将匿名函数定义为每个字段的处理程序的方式 - 但它如何扩展?我想对于每个处理程序,一个函数被添加到具有其闭包的会话中,并且它一直保留在那里直到表单被回发。当它涉及高负载下的服务时(假设每秒200个请求),它是否会引入一些潜在的性能问题?这些处理程序何时被释放(如果表单未重新提交,用户关闭浏览器或导航到另一页)?

谢谢!

2 个答案:

答案 0 :(得分:2)

关于安全性,你是对的。创建输入时,将使用GUID标识符生成处理程序函数并将其存储在服务器端。该功能是特定于会话的,并由您的代码关闭 - 因此其他用户无法访问它并且很难重放。在您的示例中,由于未显示任何输入 - 因此未生成任何函数,因此如果isEditablefalse,则无法更改值。

至于性能,在一台机器上,Lift表现非常出色。但是,它需要会话感知负载平衡才能水平扩展,因为处理程序功能不容易跨机器进行序列化。要记住的一点是,Lift非常灵活,如果需要,您还可以创建无状态表单处理(虽然它不会那么安全)。我从未见过使用我们创建和部署的应用程序的太多内存。我没有太多可用的硬统计数据,但在this thread中,David Pollak提到demo.liftweb.net当时有214个开放会话消耗大约100MB的RAM(500K /会话)。

此外,here is a link还有关于可伸缩性的Lift书的章节,其中还有一些关于安全性的信息。

答案 1 :(得分:1)

关闭和所有东西肯定在sessionShutdown清理。早些时候 - 我不知道。无论如何,这不是一个理论上的问题 - 它在很大程度上取决于用户在实践中如何使用网络表单。因此,对于更广泛的答案,我会在liftweb的主要渠道上提出问题 - https://groups.google.com/forum/#!forum/liftweb 此外,如果您愿意,可以使用“静态”表格。但AFAIK没有记忆问题,每个人都在使用主要方法来形成。

如果你不创建处理程序xml / html - 用户将无法更改数据,这是肯定的。在你的代码中,如果我理解正确(我不确定),你不会在不需要的时候创建“text(label,handler)”,所以一切都是安全的。