防止用户操纵查询字符串参数

Prevent user from manipulating query string parameter

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

问题:用户可以更改 ID。

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

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

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

基本上是这样的:

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

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

重新发送后 post 您可以进行检查:

// 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。

显然与所有通道一样,盐越浓,裂纹越硬。所以输入一些空格、数字,甚至其他字符来抓坏人。

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