我们正在开发一个旨在处理在线支付的网站。我们想知道,在付款过程中通过查询字符串传递订单/交易 ID 是否可以?由于服务器开销,我们宁愿不将此 Id 存储在会话变量中,因此我们认为将其存储在查询字符串中是合适的。
对此有什么想法吗?特别是从安全的角度来看。
非常感谢。
我们正在开发一个旨在处理在线支付的网站。我们想知道,在付款过程中通过查询字符串传递订单/交易 ID 是否可以?由于服务器开销,我们宁愿不将此 Id 存储在会话变量中,因此我们认为将其存储在查询字符串中是合适的。
对此有什么想法吗?特别是从安全的角度来看。
非常感谢。
尝试使您的服务无状态是一个有价值的目标。不过,在查询字符串中包含订单 ID 是否“安全”取决于很多事情。您可能需要担心的主要问题是:
我说“可能”是因为你真正需要担心的事情取决于你系统的细节。这些事情发生的后果是什么?根据您系统的详细信息,这些可能是无害的,也可能非常严重。
最容易解决的问题是“泄漏”问题。使用 HTTPS。这不仅可以防止“窃听者”,还可以防止由于代理日志和 Referer 标头而导致的泄漏。
预测问题可以通过加密(是的,除了HTTPS——我们也不希望最终用户解密)查询字符串中出现的订单 ID 来解决。这样,某人就不能只增加/减少查询字符串来查找另一个订单 ID。(这也可以防止用户轻松计算出您系统中的订单总数,这可能是可取的。)
您可以通过在首次分配订单 ID 时记录其属于谁,或将 (user, orderid) 对的安全签名作为查询参数来解决用户更改订单 ID 的问题。然后,用户只能将他们的订单 ID 更改为他们已经拥有的 ID,这至少可以防止他们乱搞别人的订单。如果这样做,您可能不需要对订单 ID 进行加密,除非您想阻止用户知道存在多少订单。
这些只是一些想法。哪些适用于您的系统取决于我之前提到的因素。
在查询字符串中传递敏感信息(例如订单号)通常是一个坏主意,原因有很多:
1) GET url 以明文形式传递,这意味着客户端和服务器之间的任何内容都可以从请求中读取和捕获订单号。如果您的服务器依赖订单号来做任何重要的事情,那么这是一个公开的滥用邀请。
2) 大多数代理和访问日志将记录包括 GET 查询在内的网址,这意味着客户的订单号将存储在任意数量机器(包括您的服务器)上的访问日志中。您很可能无法控制这种行为,这是非常糟糕的(TM)。
为了使您的应用程序安全,您应该将实际订单号存储在服务器上的会话中,并在 cookie 中将其传递给用户(最好是加密的)。以明文传递任何重要的东西很容易被滥用,不应该尝试任何重要的东西。
加密订单 ID 会很好 - 您也可以考虑对原始订单 ID 进行散列处理,并将其和散列后的令牌传递到查询字符串中。我不认为这是安全风险,因为我不会将订单 ID 视为敏感数据。您需要做的就是确保用户没有以任何方式操纵它。
http://www.duncangunn.me.uk/dasblog/2009/08/01/VerifyingTheIntegrityOfQueryStringParameters.aspx
你应该在你的数据库中捕获订单。不建议在查询字符串中传递它。