我有一张桌子,显然每行都有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操纵。即使我的功能有效,我仍然在想也许有一个更简单的解决方案。专业人士做了什么?
答案 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
表进行查询,以检查订单是否已分配给用户,如果是,则对订单商品进行查询。