2009-12-16 145 views
1

我正在创建一个基于向导的用于输入用户输入的一系列表单。该向导的一个要求是脚本(PHP)不能将输入保存到数据库(MySQL)中,直到用户单击“保存”按钮,因此我必须设置一种机制将用户输入以一种形式传输到另一种形式当用户点击“上一个”或“下一个”按钮时。我研究了使用各种方法,包括cookies,会话,临时文件等,但我决定将base64_encoded序列化数据嵌入到系列中所有表单中存在的隐藏字段中。此字段中的值将在表单提交中解码,并在插入当前表单中的其他值后插入下一个表单时进行重新编码。在表单提交之间传递base64_encoded序列化数据

这里的隐藏字段的外观示例:

<input type="hidden" name="wizard:presave" value="YTo2OntzOjU6InRpdGxlIjtzOjEwOiJRdWVzdGlvbiAyIjtzOjQ6InRleHQiO3M6MTk6IlllcyBpdCdzIGEgcXVlc3Rpb24iO3M6NDoidHlwZSI7czo2OiJjaG9pY2UiO3M6NzoiY2hvaWNlcyI7YTowOnt9czo1OiJwb2ludCI7aToxO3M6Mjoib3AiO3M6MTM6ImVkaXRfZXhlcmNpc2UiO30=" /> 

所以问题是:

  1. 是它认为是一个好/坏的做法?

  2. HTMLform中隐藏字段是否有长度限制?

  3. 有什么可能的安全问题?

  4. 有没有更好的选择? (与解释,最好不使用JavaScript)

在此先感谢!

回答

1
  1. 我从来没有见过这种特殊的参数传递方法,所以我不能说它是好还是坏。这当然不是“标准”。标准方法要么是使用隐藏的输入传递提交的方法(未编码/通常),要么将其存储在会话中。我认为你可能会为自己做事,所以在这个意义上说,它会倾向于“不理想”。

  2. 只要您在表单中使用POST,对于我在HTTP规范中知道的数据大小没有定义的限制。旧的服务器可能会有实际的限制,但除非你正在做一些极端的事情,比如媒体文件上传,否则他们不应该担心。

  3. 可能的安全问题是正常的网络安全缺陷。您从用户那里获取并重新输出到页面的任何内容都可能包含跨站点脚本漏洞,并且必须进行适当的清理(如果您对所有内容进行编码,这都会有点不切实际)。用户可以制作自己的数据并提交,如果他们喜欢。基本上,假设您处理的所有数据都是不安全的并且受到污染。

  4. 会议会在这里工作得更好。用户提交的数据不需要经过冗长的编码过程。同样,你只需要验证一次。提交并验证之后,您可以将其存储在$ _SESSION的服务器上,直到最终的按钮被单击为止。否则,你不得不担心重新输出它,重新接收它,并在每一步重新验证它。恶意用户可以提交一组数据,并将其作为编码数据进行检查和重新输出,然后通过解密,更改数据和重新编码来制作下一个表单提交。

我强烈建议您重新考虑会话,因为它将所有数据操作简化为“一次性”方案。

+0

我重新考虑了使用会话和它的工作原理,但我仍然需要设置一个随机的'实例ID'以在提交之间传递,以便用户可以在相同会话上运行多个向导实例而不会互相干扰。但它会引入其他安全问题,如用户混淆实例ID等? – Lukman 2009-12-16 08:24:57

+0

我不这么认为。只要您将正确的随机值存储在会话中,那么唯一可用于操作的参数就是会话令牌本身。 – zombat 2009-12-16 18:21:55

+0

实施,它的工作很好。这里的所有答案都很好,但是这个提供了最好的解释。谢谢。 – Lukman 2009-12-17 03:50:51

0

那么,你可以通过序列化来存储会话,或者只是简单地将它存储为每一步的方式。当用户点击保存时,您可以获取并验证会话中所有步骤的数据。

0

啧啧啧:)

  1. 是它认为是一个好/坏的做法?主观上不好的做法。你使用错误的锤子来完成这项工作。

  2. HTMLform中隐藏字段是否有长度限制? - 不确定是否有限制。

  3. 有什么可能的安全问题? - 可能有不少,但您可以清理每个请求收到的数据。此外,数据很容易解码,并可以在客户端很容易修改(我可以看到它的某种类型的json,你正在使用:))

  4. 有没有更好的选择? (与解释,最好不使用JavaScript) - 使用正确的工具.. sessions也许?

是的...你最有可能会面临性能和可扩展性的问题(你应该有一个相当规模的用户负载)与所有的消毒,解析,格式化和运行为每个请求的安全代码。

1

它被认为是好的/坏的做法?

取决于目的。到目前为止,我只将这种结构看作客户端URL散列,以便记住大型基于ajax的应用程序中的选择状态(以便它们是可收藏的),然后通常也会将其缩小。在你的speficic案例中,我会说:使用HTTP会话,并且只传递隐藏字段中的基于请求的标识符(也称为标记),以便您可以从会话中获取关联的信息。

HTMLform中隐藏字段是否有长度限制?

在完整查询字符串(所有参数名称和值和分隔符在一起)通常限制为2048个字符,但您可以更好地坚持256个字符的官方限制。在POST中,它取决于服务器配置。通常这个默认大约2GB。

什么是可能的安全问题?

那么,它显然是可解码的。

有没有更好的选择? (与解释,最好不使用javascript)

你可以Gzip它使它更短,更不明显。或者,如前所述,将会话与基于请求的标识符结合使用。

+0

在base64_encode之后尝试了gzip,但它破坏了html结构。 base64_encode之前的gzip给出几乎相同的字符串长度。 +1无论如何;) – Lukman 2009-12-17 03:47:54