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