2016-09-28 61 views
0

我有一张表格,显然每行都有ids。当用户点击一个表格行时,他会被带到一个不同的页面,在那里它显示完整的数据(不同的页面实际上是加载事件之后的同一页面)。什么是最简单的方法来检查表格数据是否已在萤火虫中操作

我正在用jquery拾取click事件,然后将id发送给jquery加载,并加载到数据中。

问题是这样的。如果使用该页面的人安装了萤火虫,他可以操纵桌面上的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。

有没有更好的方法来检查数据是否已经在服务器端的萤火虫中操作?

基本上我想确保发送到服务器的id是表中相同的id,并且没有被萤火虫操纵。即使我的功能有效,我仍然认为可能有一个更简单的解决方案。专业人员做什么?

+0

请注意,浏览器现在有内置的开发工具,所以用户甚至不需要安装Firebug。 –

+0

我同意。 Firebug就是一个例子。我知道那里有其他人,但我使用firefox,所以我知道萤火虫。我正在寻找比我使用的验证ID更简单的方法,并询问专业人员做什么? –

+0

两个注意事项:1. [Firebug将要离开](https://blog.getfirebug.com/2016/06/07/unifying-firebug-firefox-devtools/),所以在某些时候你必须使用内置[Firefox DevTools](https://developer.mozilla.org/en-US/docs/Tools)。 2.我提供了一个答案,尽管我还不清楚桌子的外观如何。 –

回答

1

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

I.e.如果$searchColumn,$userColumn,$tablename,$table_id$user_id作为请求变量进来,您需要检查其中每一个的有效性。特别是$userColumn$tablename$searchColumn需要仔细检查SQL注入,因为它们是在您致电prepare()之前添加的。
如果您不需要灵活性,则应在表格和列名称中输入字符串。

您甚至可以在服务器端保留用户标识(作为会话变量),并且只在登录时设置一次,因此您可以完全清除该检查。尽管如此,引用用户数据的表仍然需要包含用户标识的列。

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

例子:

想象一下,你必须在1订单和订单项目到m的关系。您向用户显示他已完成的订单清单。当用户现在选择显示其项目的订单时,可以在查询中包含用户标识以确保用户无法访问其他用户的订单。

然后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表进行查询,以检查订单是否分配给用户,如果是,则对订单项进行查询。

+0

我的函数检查的唯一事情是表行ID。我必须传入表名和其他所有内容,以便我的函数可以检查它们。基本上,当我点击一个表格行时,我正在其他地方看到数据,但如果他们操纵了这个ID,他们可能会看到他们不应该看到的数据。至于卫生,我总是使用准备好的查询。我已经显示的代码是我目前检查某个ID是否有效的函数。它工作正常,但我正在寻找一个更简单的解决方案 –

+0

我看到如此使用此方法,如果他们更改id查询不会带回任何数据。我刚刚通过你所看到的身份证进行搜索。所以在我的查询中,我应该搜索id和用户标识。然后,如果他们更改萤火虫中的ID,查询将是空的。为什么我没有想到这个 –

+0

恰恰!您需要检查数据是否实际分配给用户。我进一步更新了答案,注意你也可以在两个单独的查询中做到这一点。根据表之间的关系,它可能会变得更复杂,但基本上可以总是查询数据是否属于用户。有时候看到最简单的答案并不容易。 :-) –

相关问题