【问题标题】:Is it generally considered OK to store a query string in a database?通常认为可以将查询字符串存储在数据库中吗?
【发布时间】:2011-07-24 13:50:21
【问题描述】:

如果我要从 Web 应用程序中的传入请求 HTTP 请求中获取查询字符串,将其直接存储在 MySql 数据库中,然后稍后使用它来重新构建原始请求 url,这样可以吗?

我想知道查询字符串上是否有任何“陷阱”,例如特殊字符或多字节字符,可能需要我在存储数据之前对数据或其他内容进行编码。

提前谢谢你。

编辑:我的特定用例如下所示。虽然我主要关心的是查询字符串中的任何特殊字符是否会导致意外问题。

  • 用户提交表单。
  • 在处理表单期间,我们确定用户需要确认他们的电子邮件
  • 我们向用户发送一封电子邮件进行确认并将原始查询字符串存储在数据库中,因为我们总是希望执行请求中的任何查询字符串参数。
  • 用户确认邮件后,我们将其重定向回原始表单url,并附加原始查询字符串以确保查询字符串参数被带入。

【问题讨论】:

  • 你应该详细说明你的用例并提供一个例子

标签: java mysql database query-string


【解决方案1】:

我看不出它有什么本质上的错误,但存储解析出来的值而不是查询字符串格式的数据对我来说更有意义。它可能会更加面向未来,例如,如果您稍后在应用中更改了查询字符串参数的名称。

详细说明:
而不是将 "?param1=A&param2=B&param3=C" 存储到名为 "querystring" 的字段中 最好将 A、B 和 C 存储到三个字段中,分别称为“Param1、Param2 和 Param3”。

更新:
根据您添加到问题中的用例,特别是有关此数据的部分只需要临时存储,直到用户确认他们的帐户,我认为以原始格式存储查询字符串没有任何问题。如果您打算长期存储此信息,我最初的建议是有效的。

【讨论】:

  • 您能详细说明一下吗?我不明白“存储解析出的值而不是查询字符串格式的数据”是什么意思。
  • 感谢您的建议!我的想法是,仅存储字符串本身是一种“面向未来”的方式,因为如果将来将其他查询字符串值添加到 url,我不必添加其他字段来支持新参数.
  • @Jason:这取决于参数的含义。您打算直接从数据库中提取它们的值,还是打算仅将字符串用于 URL 重建?
  • @Jack 考虑这个查询字符串:name=John&age=30。然后,您不会存储字符串本身,而是存储属性 name 的值 John 和属性 age30
  • 我想这在某种程度上取决于在您的应用程序上下文中存储参数的确切目的。它可以采用任何一种方式,但我仍然认为在这种情况下最好不要将格式信息存储在数据库中。您还可以获得额外的好处,即能够使用这种方法轻松地独立查询参数。另外,为什么要为可能不会更改的参数名称占用额外的数据库存储空间?
【解决方案2】:

一点也不。我在一家金融机构工作,其中发生的每笔交易都存储在数据库中,包括 SQL 查询。这用于交易审计,用于审计和报告生成。此外,它还提供了用户交易的良好历史记录。

【讨论】:

    【解决方案3】:

    取决于真正的目的。

    如果您正在与另一台服务器打交道,而查询字符串就是您识别请求所需的全部内容(好吧,URI,但大概您指望其余部分是静态的,也许检查该假设),那么它是理想的使用本质上是标识符的东西作为标识符。

    如果您的代码在处理查询本身的服务器上,那么它对于许多用途都不是理想的,但可以用于日志记录和一些缓存用途。

    如果您的代码处理查询的实际参数,那么可能不会。

    【讨论】:

      【解决方案4】:

      我一定会对存储的查询使用绑定。

      INSERT INTO TABLE_OF_QUERIES (field1, field2, field3) VALUES (?,?,?);
      

      【讨论】:

      • 好的,我猜是为了防止sql注入攻击?
      • 是的 :) 而且您不必担心存储查询中的其他引号或特殊字符会干扰插入包装器的其余部分
      【解决方案5】:

      为什么要在 QueryString 处停下来?如果你想保存一些header,为什么不保存整个header信息,包括cookies、post data等。

      【讨论】:

      • 嗯...非常有趣的想法。在合适的情况下,我只是在考虑这是否对我有帮助。
      猜你喜欢
      • 1970-01-01
      • 2020-03-11
      • 2018-08-30
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 2015-02-19
      相关资源
      最近更新 更多