Javascript 保护jQuery函数不受外部访问

Javascript 保护jQuery函数不受外部访问,javascript,jquery,html,security,web-applications,Javascript,Jquery,Html,Security,Web Applications,我在一个应用程序中使用jQuery,该应用程序通过.click()绑定注册用户单击以执行给定的操作,我希望此功能仅通过用户mousedown可用。我的一个朋友今天指出,可以在Firebug(或类似的东西)中从javascript终端运行$(element).click(),并实现与单击元素相同的功能,这是我想要阻止的。关于如何着手做这件事有什么想法吗?谢谢你的意见。你想阻止什么?有人搞乱了你的客户端脚本?你可以做一些事情,比如混淆你的代码,但除此之外就没什么了。但在我看来,即使这样做也会让事情变

我在一个应用程序中使用jQuery,该应用程序通过.click()绑定注册用户单击以执行给定的操作,我希望此功能仅通过用户mousedown可用。我的一个朋友今天指出,可以在Firebug(或类似的东西)中从javascript终端运行$(element).click(),并实现与单击元素相同的功能,这是我想要阻止的。关于如何着手做这件事有什么想法吗?谢谢你的意见。

你想阻止什么?有人搞乱了你的客户端脚本?你可以做一些事情,比如混淆你的代码,但除此之外就没什么了。但在我看来,即使这样做也会让事情变得更加麻烦

如果您不想让人们做某些事情,请将功能移到服务器上


很抱歉带来了坏消息。

简短回答:不,你不能真正阻止它

详细回答:任何事件,如
单击事件
都绑定到这样的
事件处理程序
。这些处理程序是
函数
,在给定事件发生时执行。因此,如果单击某个元素,浏览器将检查是否有任何
事件处理程序绑定到该元素,如果有,它将
激发它们。如果没有,浏览器将尝试将事件
冒泡到
父元素
,再次检查是否有该类事件绑定的
事件处理程序。。等等

jQuerys
.trigger()
方法(例如,如果调用
.click()
,则实际调用该方法)也会执行相同的操作。它为特定事件调用绑定到特定元素的
事件处理程序

编辑

可能有一些简单的方法来软检测真正的点击,例如,您可以检查
事件对象中的
toElement
属性。触发
时未设置该属性。但是,同样,您也可以使用
.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'}
      });
  });
});​
工作示例:


如果只调用
$('#invalid2').trigger('click')
toElement
属性将不存在,因此会失败。但是正如您所看到的,您可以向
事件对象添加任何内容

如果您不能真正对其执行任何操作,也可以编写完整的函数,然后启动它


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

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


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

模糊处理似乎是防止用户使用自己的javascript的可怕方法。“如果有人真的想经历让某件事情成功的所有麻烦,那么为什么不让他们去做呢?”helixed我同意。我说过这不值得这么麻烦,但这是一个选择。我告诉他把它移到服务器上。这一点很好,但我担心的不是有人可以自己调用它,而是他们可以将它脚本化为可以频繁运行的东西。我需要事件只发生在人类点击鼠标的频率。(是的,它在每次通话中都会与我的服务器进行通信。)您认为这是可能的。您应该阅读更多关于安全性和利用过程的信息。(哦,我给了你+1)有什么推荐的读物吗?谢谢有道理。至少我可以在您的示例中使用您对“invalid2”的技巧,使其更难欺骗。非常感谢你的回答。