Javascript 如何阻止客户端使用inspector更改网页数据?

Javascript 如何阻止客户端使用inspector更改网页数据?,javascript,php,jquery,html,Javascript,Php,Jquery,Html,好的,这是一个我已经处理了一段时间的问题 我的页面加载了一些li元素。他们都有自己的id,这是他们在数据库中的主键。每个元素都可以从数据库中删除。删除过程由jQuery的$.POST方法完成,获取该元素的id并将其传递给一个PHP文件,该文件获取id并从数据库中删除相应的记录 <script> $('li').click(function(){ var id = $(this).attr(id); $.post('delete.php',

好的,这是一个我已经处理了一段时间的问题

我的页面加载了一些
li
元素。他们都有自己的id,这是他们在数据库中的
主键。每个元素都可以从数据库中删除。删除过程由jQuery的
$.POST
方法完成,获取该元素的id并将其传递给一个PHP文件,该文件获取id并从数据库中删除相应的记录

<script>
   $('li').click(function(){
      var id = $(this).attr(id);
      $.post('delete.php',
         {r_id: id}
      );
   });
</script>
在Google或Firefox的inspector中,如果我更改某个元素的id值,然后按该元素的remove按钮,则会删除具有该id的另一个元素

示例:我们想从数据库中删除id为45的“Mohsen”

<script>
   $('li').click(function(){
      var id = $(this).attr(id);
      $.post('delete.php',
         {r_id: id}
      );
   });
</script>

$('li')。单击(函数(){
var id=$(this).attr(id);
$.post('delete.php',
{r_id:id}
);
});
HTML:

<li id="45">mohsen</li>
<li id="35">vahid</li>
<li id="25">neda</li>
莫森 瓦希德 内达
上面的代码与最初加载的代码相同。当我点击“mohsen”时,“mohsen”将从数据库中删除,因为他的id为45。但是,如果我使用inspector并将id值更改为:

<li id="25">mohsen</li>
<li id="35">vahid</li>
<li id="45">neda</li>
莫森 瓦希德 内达 现在,当单击“mohsen”时,数据库中具有
primary_key
id值25的“neda”将被删除,这是我们不允许的

有没有办法阻止用户使用检查器操纵标记数据?换句话说,如何正确地从数据库中删除“Mohsen”,即使其id值被篡改?
注意:mohsen就是一个例子,每个
li
都可以删除。

您不能阻止用户使用检查器查看页面,如果您希望阻止删除某些记录,您唯一能做的就是实现自己的服务器端验证


此外,如果可能,尽量不要公开主键,只公开一些派生信息,如@Thomas David Plat建议的哈希。

您不能阻止用户查看/更改inspector的数据。您唯一能做的就是进行服务器端验证,例如从客户端发送文本,在您的情况下可以是“Neda”、“Mohsen”等,并首先验证该特定ID是否属于该文本/名称。但这纯粹是服务器端的事情,但AFA客户端担心您不能这样做。

减少操作尝试的一种方法不是按ID删除,而是一些独特的随机散列。您可以将该随机散列作为主键,也可以在数据库中创建一个额外的列

<script>
   $('li').click(function(){
      var id = $(this).attr(id);
      $.post('delete.php',
         {r_id: id}
      );
   });
</script>
数据(id(pk)、散列、值)

例如,如果您的散列看起来像:
a89x1uAp3
,则很难根据该散列计算出其他记录的散列


只是不要通过post传递您的ID,但是您的哈希和问题受到了很大的限制。

这也是推荐的方法。不要暴露你的主键。即使使用散列,用户也有可能删除其他记录,因此您仍然需要某种验证。这仍然不能阻止人们猜测——根据您所谈论的记录数量,发生随机冲突的可能性会发生变化。这应该是关于服务器端验证用户删除某些内容的权限,无论如何都应该考虑这些权限。在我的回答中,我从来没有说过猜一个杂凑是不可能的。当然,猜测仍然是可能的。但是根据你的哈希值,这样做可能会变得非常困难。用户权限是另一个话题。此外,这使得调试应用程序变得更加困难,几乎没有额外的好处…@Anzeo。什么首先,如果没有验证,那不是浏览器检查器的错误。其次,如果用户在inspector中切换已经可用的id,那么这里没有问题。如果我已经可以删除id:25或45,并且我更改了执行该操作的按钮,那么这不会影响任何事情。web应用程序的第一条规则是永远不要信任客户端。“检查员无关紧要,”杰里米说。我的观点是,这种变化不仅仅是“地方性的”。如果我将id更改为其他id(如OP的问题),例如,未列出但可以猜测的id,因为键是顺序的,然后我可以简单地用我想要的任何东西替换该值。@Anzeo-那么你的服务器端代码应该只允许你从允许删除的项目中删除项目…@Anzeo只需在facebook上自己尝试一下,而不是删除,就像是一篇帖子或评论,替换两个不同的注释data-r属性值,然后单击“Like”,看看会发生什么?我试过一次,结果是我甚至替换了两条评论的值,我点击的那条评论对页面没有影响,但在我刷新页面后,我点击的那条评论很受欢迎@Anzeo我认为你是对的,我读了其他答案很好的答案,我只是有点匆忙,所以不要生我的气;)使用JavaScript与此问题无关。你不能通过不使用JavaScript来规避这种安全风险。在他当前的上下文中,他问了一个问题,如何阻止一些1修改值,正如在他的帖子中他显示了Jquery函数,所以如果他将整个数据发布到该页面,那么在当前场景中JS就没有用处了,这就是我所指的。它并没有改变删除JavaScript并不能解决问题的事实。如果表单刚刚发布(没有AJAX),并且id仍然从HTML中读取,那么您仍然会遇到问题。@Anzeo:我同意这一点,但请注意,他不希望任何1通过浏览器的检查器从客户端更改值,因此,他必须稍微改变一下自己的问题短语,或者按照所告诉的一些答案中的指导去做。我同意他/她需要调查答案,我相信他/她会的,否则他/她就不会问了