【问题标题】:What is the easiest way to check if table data has been manipulated in firebug检查表数据是否已在萤火虫中被操纵的最简单方法是什么
【发布时间】:2017-02-06 20:47:00
【问题描述】:

我有一张桌子,显然每一行都有 id。当用户点击表格行时,他会被带到显示完整数据的不同页面(不同页面实际上是加载事件后未隐藏的同一页面)。

我正在使用 jquery 获取点击事件,然后将 id 发送到 jquery load 并加载到数据中。

问题是这样的。如果使用该页面的人安装了 firebug,他可以操纵桌子上的 id 并可能访问他不应该访问的东西。

所以我不得不编写一个函数来检查该用户是否可以访问传入的 id。

function checkID($searchColumn,$userColumn,$tablename,$table_id,$user_id)
{
    Global $db;
    $query = "SELECT `{$userColumn}` FROM $tablename WHERE `{$searchColumn}`=?";
    //echo $query;
    $stmt = $db->prepare($query);
    $stmt->bind_param('i',$table_id);
    $stmt->execute();
    $stmt->bind_result($myuser_id);

    if($stmt->fetch())
    {
        if($myuser_id==$user_id):
            return true;
        else:
            return false;
        endif;
    }   
}

基本上,上面的函数根据用户是否可以访问该 id 给我一个真或假。

有没有更好的方法来检查服务器端的 firebug 是否对数据进行了操作?

基本上,我想确保发送到服务器的 id 与表中的 id 相同,并且没有被 firebug 操纵。尽管我的功能有效,但我一直在想也许有一个更简单的解决方案。专业人士是做什么的?

【问题讨论】:

  • 请注意,现在的浏览器已经内置了开发者工具,因此用户甚至不必安装 Firebug。
  • 我同意。 Firebug 就是一个例子。我知道那里还有其他人,但我使用的是 firefox,所以 firebug 是我所知道的。我正在寻找一种比我现在使用的更简单的方法来验证 id,并询问专业人员是做什么的?
  • 两个注意事项:1.Firebug is going away,所以在某些时候你必须使用内置的Firefox DevTools。 2. 我提供了一个答案,但我仍然不清楚桌子的实际外观。
  • 您应该为您的问题提供一个示例来说明问题。例如。不清楚用户点击某行时是同一个数据库表的数据还是明细表的数据。
  • 我没有提供表格示例,因为每个人都知道 html 表格是什么样的。它有 并且每个表行都有一个 id。我的问题是,当您单击表格行时,jquery 会使用该 id,但它可能已被用户使用 firebug 或其他一些操作方式进行了操作。我想要最简单的方法来检查用户是否更改了 id。上述函数中唯一重要的是它通过检查 mysql 数据库中是否存在与 table id 代码对应的用户来检查 table id 是否有效。

标签: php jquery mysql firebug data-manipulation


【解决方案1】:

来自客户端的数据总是需要在服务器端进行验证和清理。

即如果$searchColumn$userColumn$tablename$table_id$user_id 作为请求变量进来,你需要检查它们的有效性。特别是$userColumn$tablename$searchColumn需要仔细检查SQL注入,因为它们是在你调用prepare()之前添加的。
如果您不需要灵活性,您应该在字符串中输入表名和列名。

您甚至可以将用户 ID 保留在服务器端(作为会话变量),并且只在登录时设置一次,这样您就可以完全摆脱检查。不过,引用用户数据的表仍然需要有一个包含用户 ID 的列。

为确保用户只能访问他应该看到的数据,您需要在查询中包含用户 ID。

示例:

假设您有 1 到 m 关系的订单和订单商品。您向用户显示他已下订单的列表。当用户现在选择一个订单来显示其商品时,您可以在查询中包含用户 ID,以确保该用户无法访问其他用户的订单。

那么 SELECT 语句可能如下所示:

SELECT oi.name,
       oi.description
       oi.price
FROM order_item oi
INNER JOIN order o ON o.id = oi.order_id
WHERE o.id = ?
  AND o.userID = ?

当用户随后提供其他用户订单的 ID 时,不会有任何商品退回。

这也可以分两步完成,首先对order 表进行查询以检查订单是否已分配给用户,如果是,则对订单项进行查询。

【讨论】:

  • 我的函数唯一检查的是表行 ID。我必须传入表名和其他所有内容,以便我的函数可以检查它们。基本上,当我单击表格行时,我会将他们带到其他地方查看数据,但如果他们操纵了 id,他们可能会看到他们不应该看到的数据。至于卫生,我总是使用准备好的查询。我展示的代码是我当前用于检查 id 是否有效的函数。它工作正常,但我正在寻找一个更简单的解决方案
  • 我明白了,如果他们更改了 id,则使用此方法查询不会带回任何数据。我一直在按你看到的 id 搜索。所以在我的查询中,我应该搜索 id 和用户 id。然后,如果他们在 firebug 中更改 id,则查询将为空。为什么我没有想到这个
  • 没错!您需要检查数据是否实际分配给用户。我进一步更新了答案,注意您也可以在两个单独的查询中执行此操作。根据表之间的关系,它可能会变得更复杂,但基本上您可以随时查询数据是否属于用户。有时,要看到最简单的答案并不容易。 :-)
  • 用这种方法我什至不需要上述功能。愚蠢的是,我通常会在其他地方检查用户名和 id,但没想到在表上这样做,因为当时我不知道 id 可以被用户操纵。你会相信我已经做了大约 5 年的数据库,却没有意识到我从未意识到存在巨大的安全漏洞。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多