【问题标题】:Prevent user from manipulating query string parameter防止用户操纵查询字符串参数
【发布时间】:2016-09-23 12:18:36
【问题描述】:

情况:未注册用户访问网站并发出商品请求。根据当前的数据流,此请求首先插入到 db 中,并且请求 id 将在后续页面的 url 中携带(用户可以在其中添加更多信息)。

问题:用户可以更改id。

到目前为止我所做的: 在使用 lastInsertId() 插入请求后检索 id 后,我将其存储在会话变量中,并根据 id 检查后续页面来自 $_GET。我还实现了 CRSF 保护,但是当令牌匹配时,会话令牌未设置。因此,即使用户在同一个 url 上刷新,检查也会失败。

我该如何解决这个问题?请指出我缺乏的概念。另外,当许多并发用户发出请求时,服务器会根据它的唯一会话 id 来确定哪个用户是哪个用户,这对于不同的用户来说是不同的,对吗?这种并发会不会有任何问题或漏洞?

【问题讨论】:

  • 添加会话是个好方法。除此之外,您可以使用存储在配置中的一些盐手动散列 Id。您还可以使用类似日期和年份的组合作为盐,在这种情况下它会保持一天不变。将盐与 ID 一起传递并重新检查盐和会话,如果它们匹配则继续,
  • 感谢@AtulBhatS!使用 mcrypt_create_iv() 可以处理盐吗?刚刚尝试对 stackoverflow 的 url 做同样的事情,它把我重定向到另一个问题。猜猜这取决于相关数据的敏感性:)

标签: php security session concurrency query-string


【解决方案1】:

基于“(用户可以在其中添加更多信息)”这一行,我假设您正在使用某种形式/POST 来获取数据? 我将使用 AtulBhatS 评论中所述的技术并在其中使用散列数据。您可以在 GET 中设置散列数据,也可以将其设置在前面提到的表单/POST 字段中的隐藏字段中。

基本上是这样的:

$id = $thisRequestIdOfYours;
$hash = hash('sha512', 'aRandomSaltStringOnlyKnownByYourScript'.$id);

只需将这 2 个值用作 $_GET(而不是像现在那样只使用 $id)。或者将其设置在隐藏字段中。

在重新发送帖子后,您可以进行检查:

// Use $_POST if you use the hidden field way.
if( hash(sha512, 'aRandomSaltStringOnlyKnownByYourScript'.$_GET['id']) !== $_GET['superSecretHash']) {
    // h4x0r d3tect3d
    die('you have no business here');
}

由于“salt”(aRandomSaltStringOnlyKnownByYourScript) 仅在您的脚本中已知,因此很难解码和更改带有哈希的 get 以匹配手动更改的 ID。

显然,就像所有的通行证一样,盐越强,裂缝就越硬。所以加入一些空格、数字甚至其他字符来捕捉坏人。

【讨论】:

    【解决方案2】:

    理想情况下,您应该避免将本应保密的数据保留在 url 中可见,因此我建议您应用 Pim 的解决方案,但将散列值存储在 cookie 中,而不是传统用户比 url 参数更难访问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 1970-01-01
      • 2010-11-06
      • 2011-06-02
      • 1970-01-01
      相关资源
      最近更新 更多