【问题标题】:Protect jQuery function from outside access保护 jQuery 函数免受外部访问
【发布时间】:2011-03-19 22:40:12
【问题描述】:

我在一个应用程序中使用 jQuery,该应用程序通过 .click() 绑定注册用户单击以执行给定操作,并且我希望此功能通过用户鼠标按下可用。我的一位朋友今天指出,可以从 Firebug(或类似的东西)中的 javascript 终端运行 $(element).click(),并实现与单击元素相同的功能——我想要避免。关于如何去做这件事的任何想法?感谢您的意见。

【问题讨论】:

  • 您认为这可能是可能的。您应该阅读有关安全性和利用过程的更多信息。 (哦,我给了你一个 +1)
  • 有什么推荐的读物吗?谢谢!

标签: javascript jquery html security web-applications


【解决方案1】:

简答:不,你无法真正阻止它。

长答案:任何像click event 这样的事件都绑定到Event handlers。这些处理程序是functions,在给定事件发生时执行。因此,如果您单击一个元素,您的浏览器会检查是否有任何event handlers 绑定到它,如果是,则检查fires 它们。如果没有,浏览器将尝试将bubble up 事件发送到parent elements,再次检查是否有任何event handlers 绑定到该事件......等等。

jQuerys .trigger() 方法(例如,如果调用 .click(),您实际调用的方法)只是做同样的事情。它针对特定事件调用绑定到特定元素的event handlers

编辑

可能有一些简单的方法可以让soft detect 真正点击,例如,您可以检查event object 中的toElement 属性。 triggered 时未设置该属性。但是话又说回来,您也可以使用.trigger() 轻松伪造它。示例:

$(document).ready(function() {
  $('#invalid2').bind('click', function(e){
      alert('click\nevent.target: ' + e.toElement.id);
      console.log(e);
  });

  $('#invalid1').bind('click', function(){
      $('#invalid2').trigger({
          type: 'click',
          toElement: {id: 'Fake'}
      });
  });
});​

工作示例:http://www.jsfiddle.net/v4wkv/1/

如果您只调用$('#invalid2').trigger('click')toElement 属性将不存在,因此会失败。但正如您所见,您可以在event object 中添加任何内容。

【讨论】:

  • 有道理。至少我可以在你的例子中使用你的“invalid2”技术来使它更难欺骗。非常感谢您的出色回答。
【解决方案2】:

您可以检查事件对象(作为第一个参数传递给处理程序)originalEvent。 如果事件是通过.click()模拟的,它将是未定义的

但这完全没用。您不能使用 javascript 来确保安全 - 客户端可以完全控制它(firebug 控制台只是最明显的工具)。客户端安全检查应该只是提示用户和防止错误,恶意输入只能在服务器端停止。

【讨论】:

    【解决方案3】:

    你真的不能对它做任何事情,也可以编写完整的函数然后触发它。

    但为什么这是个问题?如果有人在客户端更改某些东西,它只会影响他。或者你想检查一些数据?这必须始终在后端完成,因为您永远无法确定真正发送给它的是什么。

    【讨论】:

      【解决方案4】:

      你想阻止什么?有人在弄乱您的客户端脚本?你可以做一些事情,比如混淆你的代码,但除此之外别无他法。但即使这样做也只会让事情变得比我认为的价值更麻烦。

      如果您不希望人们做某些事情,请将功能移至服务器。

      很抱歉带来坏消息。

      【讨论】:

      • 混淆似乎是防止用户弄乱他们自己的javascript的一种糟糕方法。如果有人真的想费尽心思让某件事情发挥作用,那为什么不让他们去做呢?
      • @helixed 我同意。我说这不值得麻烦,但这是一种选择。我告诉他把它移到服务器上。
      • 好点的家伙,但我担心的不是某人可以自己调用它,而是他们可以将其编写成可以非常频繁地运行的东西。我需要该事件仅以人类点击鼠标的频率发生。 (是的,它在每次通话时都会与我的服务器通信。)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-05
      • 2018-05-22
      • 2016-06-23
      • 2012-12-20
      相关资源
      最近更新 更多