检查表数据是否已在firebug中操作的最简单方法是什么?

时间:2016-09-28 18:14:19

标签: php jquery mysql firebug data-manipulation

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

我正在使用jquery接收click事件,然后将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操纵。即使我的功能有效,我仍然在想也许有一个更简单的解决方案。专业人士做了什么?

1 个答案:

答案 0 :(得分: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表进行查询,以检查订单是否已分配给用户,如果是,则对订单商品进行查询。