检查 table 数据是否在 firebug 中被操纵的最简单方法是什么
What is the easiest way to check if table data has been manipulated in firebug
我有一个 table,显然每一行都有 ID。当用户单击 table 行时,他将被带到显示完整数据的不同页面(不同页面实际上是加载事件后取消隐藏的同一页面)。
我正在使用 jquery 获取点击事件,然后将 id 发送到 jquery 加载并加载数据。
问题是这样的。如果使用该页面的人安装了 firebug,他可以操纵 table 上的 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 与 table 中的 ID 相同,并且没有被 firebug 操纵。尽管我的功能有效,但我一直在想也许有一个更简单的解决方案。专业人士是做什么的?
来自客户端的数据始终需要在服务器端进行验证和清理。
即如果 $searchColumn
、$userColumn
、$tablename
、$table_id
和 $user_id
作为请求变量出现,您需要检查每个变量的有效性。尤其是 $userColumn
, $tablename
和 $searchColumn
需要仔细检查 SQL 注入,因为它们是在你调用 prepare()
.
之前添加的
如果您不需要灵活性,您应该在字符串中输入 table 和列名。
您甚至可以将用户 ID 保留在服务器端(作为会话变量)并且只在登录时设置一次,这样您就可以完全摆脱检查。不过,引用用户数据的 tables 仍然需要有一个包含用户 ID 的列。
为确保用户只能访问他应该看到的数据,您需要在查询中包含用户 ID。
示例:
想象一下,您有订单,并且订单商品是一对一的关系。您向用户显示他所下订单的列表。当用户现在选择一个订单来显示其项目时,您可以在查询中包含用户 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
table 进行查询以检查订单是否已分配给用户,如果是,则对订单进行查询项目。
我有一个 table,显然每一行都有 ID。当用户单击 table 行时,他将被带到显示完整数据的不同页面(不同页面实际上是加载事件后取消隐藏的同一页面)。
我正在使用 jquery 获取点击事件,然后将 id 发送到 jquery 加载并加载数据。
问题是这样的。如果使用该页面的人安装了 firebug,他可以操纵 table 上的 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 与 table 中的 ID 相同,并且没有被 firebug 操纵。尽管我的功能有效,但我一直在想也许有一个更简单的解决方案。专业人士是做什么的?
来自客户端的数据始终需要在服务器端进行验证和清理。
即如果 $searchColumn
、$userColumn
、$tablename
、$table_id
和 $user_id
作为请求变量出现,您需要检查每个变量的有效性。尤其是 $userColumn
, $tablename
和 $searchColumn
需要仔细检查 SQL 注入,因为它们是在你调用 prepare()
.
之前添加的
如果您不需要灵活性,您应该在字符串中输入 table 和列名。
您甚至可以将用户 ID 保留在服务器端(作为会话变量)并且只在登录时设置一次,这样您就可以完全摆脱检查。不过,引用用户数据的 tables 仍然需要有一个包含用户 ID 的列。
为确保用户只能访问他应该看到的数据,您需要在查询中包含用户 ID。
示例:
想象一下,您有订单,并且订单商品是一对一的关系。您向用户显示他所下订单的列表。当用户现在选择一个订单来显示其项目时,您可以在查询中包含用户 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
table 进行查询以检查订单是否已分配给用户,如果是,则对订单进行查询项目。