我有一个表,显然每一行都有id。当用户单击表的一行时,他将被带到显示完整数据的另一个页面(不同的页面实际上是在加载事件后取消隐藏的同一页面)。
我拿起点击事件与jquery,然后发送id到jquery加载,它加载在数据。
问题是这样的。如果使用该页面的人安装了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给我一个true或false。
是否有更好的方法来检查数据是否在服务器端firebug被操纵?
基本上,我想确保发送到服务器的id与表中的id相同,并且没有被firebug操纵。即使我的函数有效,我也一直在想也许有一个更简单的解决方案。专业人士是怎么做的?
来自客户端总是的数据需要在服务器端进行验证和消毒。
。如果$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
表进行查询,检查订单是否分配给了用户,如果是,则对订单项进行查询。